package ch.akuhn.util;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Set;
public class As {
@SuppressWarnings("unchecked")
public static <T> T[] array(Class<T> tClass, T t, T... ts) {
T[] $ = (T[]) Array.newInstance(tClass, ts.length + 1);
System.arraycopy(ts, 0, $, 1, ts.length);
$[0] = t;
return $;
}
@SuppressWarnings("unchecked")
public static <T> T[] array(T t, T... ts) {
return (T[]) array(Extensions.leastUpperBound(t.getClass(), ts), t, ts);
}
@SuppressWarnings("unchecked")
public static <T> T[] array(T[] arr, T t) {
T[] $ = (T[]) Array.newInstance(arr.getClass().getComponentType(), arr.length + 1);
System.arraycopy(arr, 0, $, 0, arr.length);
$[arr.length] = t;
return $;
}
@SuppressWarnings("unchecked")
public static <T> T[] array(T[] aaa, T[] bbb) {
T[] $ = (T[]) Array.newInstance(aaa.getClass().getComponentType(), aaa.length + bbb.length);
System.arraycopy(aaa, 0, $, 0, aaa.length);
System.arraycopy(bbb, 0, $, aaa.length, bbb.length);
return $;
}
public static <E> List<E> list(E... elements) {
return Arrays.asList(elements);
}
public static <E> List<E> list(Iterable<E> iterable) {
ArrayList<E> list = new ArrayList<E>();
for (E each : iterable)
list.add(each);
list.trimToSize();
return list;
}
public static <E> Set<E> set(E... elements) {
return new HashSet<E>(Arrays.asList(elements));
}
public static int[] intArray(Iterable<? extends Number> numbers) {
int[] result = new int[Size.of(numbers)];
int index = 0;
for (Number each: numbers) {
result[index++] = each.intValue();
}
return result;
}
@SuppressWarnings("unchecked")
public static <T> Iterable<T> iterable(final Object b) {
if (b == null) return Collections.emptySet();
if (b instanceof Iterable<?>) return (Iterable<T>) b;
if (b.getClass().isArray()) return new Iterable<T>() {
@Override
public Iterator<T> iterator() {
return new Iterator<T>() {
private int index = 0;
private Object array = b;
@Override
public boolean hasNext() {
return index < Array.getLength(array);
}
@Override
public T next() {
if (!hasNext()) throw new NoSuchElementException();
return (T) Array.get(array, index++);
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
};
return Collections.singleton((T) b);
}
}