package org.vertexium.util; import org.vertexium.Element; import java.lang.reflect.Array; import java.util.*; import static org.vertexium.util.CloseableUtils.closeQuietly; public class IterableUtils { @SuppressWarnings("unchecked") public static <T> List<T> toList(Iterable<? extends T> iterable) { if (iterable instanceof List) { return (List<T>) iterable; } List<T> results = new ArrayList<>(); for (T o : iterable) { results.add(o); } closeQuietly(iterable); return results; } public static <T> List<T> toList(Iterator<T> iterator) { List<T> results = new ArrayList<>(); while (iterator.hasNext()) { T o = iterator.next(); results.add(o); } return results; } @SuppressWarnings("unchecked") public static <T> Set<T> toSet(Iterable<? extends T> iterable) { if (iterable instanceof Set) { return (Set<T>) iterable; } Set<T> results = new HashSet<>(); for (T o : iterable) { results.add(o); } closeQuietly(iterable); return results; } @SuppressWarnings("unchecked") public static <T> Set<T> toSet(T[] iterable) { Set<T> results = new HashSet<>(); Collections.addAll(results, iterable); return results; } @SuppressWarnings("unchecked") public static <T> T[] toArray(Iterable<? extends T> iterable, Class<T> type) { List<? extends T> list = toList(iterable); T[] array = (T[]) Array.newInstance(type, list.size()); return list.toArray(array); } public static <T> int count(Iterable<T> iterable) { int count = 0; for (T ignore : iterable) { count++; } closeQuietly(iterable); return count; } public static <T> int count(Iterator<T> iterator) { int count = 0; while (iterator.hasNext()) { count++; iterator.next(); } closeQuietly(iterator); return count; } public static <T> boolean isEmpty(Iterable<T> iterable) { Iterator<T> iterator = iterable.iterator(); try { return !iterator.hasNext(); } finally { closeQuietly(iterator); } } public static <T> Iterable<T> toIterable(final T[] arr) { return () -> new Iterator<T>() { int index = 0; @Override public boolean hasNext() { return index < arr.length; } @Override public T next() { return arr[index++]; } @Override public void remove() { throw new RuntimeException("Not supported"); } }; } public static <T> T single(final Iterable<? extends T> it) { Iterator<? extends T> i = it.iterator(); if (!i.hasNext()) { closeQuietly(i, it); throw new IllegalStateException("No items found."); } T result = i.next(); if (i.hasNext()) { closeQuietly(i, it); throw new IllegalStateException("More than 1 item found."); } closeQuietly(i, it); return result; } public static <T> T singleOrDefault(final Iterable<? extends T> it, T defaultValue) { Iterator<? extends T> i = it.iterator(); if (!i.hasNext()) { closeQuietly(i, it); return defaultValue; } T result = i.next(); if (i.hasNext()) { T nextValue = i.next(); closeQuietly(i, it); throw new IllegalStateException("More than 1 item found. [" + result + ", " + nextValue + "...]"); } closeQuietly(i, it); return result; } public static String join(Iterable items, String sep) { boolean first = true; StringBuilder sb = new StringBuilder(); for (Object o : items) { if (!first) { sb.append(sep); } sb.append(o); first = false; } return sb.toString(); } @SuppressWarnings("unchecked") public static Iterable<Element> toElementIterable(Iterable<? extends Element> elements) { return (Iterable<Element>) elements; } public static <T extends Element> Map<String, T> toMapById(Iterable<T> elements) { Map<String, T> result = new HashMap<>(); for (T element : elements) { if (element != null) { result.put(element.getId(), element); } } return result; } }