package bjc.utils.funcutils; import java.util.*; import java.util.function.*; import bjc.data.*; /** * Utility methods for dealing with iterators. * * @author bjculkin * */ public class IteratorUtils { /** * Convert an iterator to an iterable. * * @param The type being iterated over. * * @param itr * The iterator to convert. * * @return An iterable that gives back that iterator. */ public static Iterable I(Iterator itr) { return () -> itr; } /** * Convert an iterable to an iterator. * * @param The type being iterated over. * * @param itr * The iterable to convert. * * @return The iterator from that iterable */ public static Iterator I(Iterable itr) { return itr.iterator(); } /** * Convert an array to an iterator. * * @param The type being iterated over. * * @param parms * The array to iterate over. * * @return An iterator over the provided array. */ @SafeVarargs public static Iterator I(E... parms) { return new ArrayIterator<>(parms); } /** * Create a chain iterator. * * @param The initial type being iterated over. * @param The resulting type being iterated over. * * @param itrA * The iterator for input values. * * @param itrB * The transformation for output values. * * @return A chain iterator from the provided values. */ public static Iterator chain(Iterator itrA, Function> itrB) { return new ChainIterator<>(itrA, itrB); } /** * Perform a left-fold over an iterator. * * @param The type of elements in the iterator. * @param The result from the fold. * * @param itr The items to iterate over. * @param zero The initial element for the fold. * @param folder The function that does the folding. * * @return The result of folding over the iterator. */ public static ResultType foldLeft( Iterable itr, ResultType zero, BiFunction folder) { ResultType state = zero; for (ElementType elem : itr) { state = folder.apply(elem, state); } return state; } /** * Creates an 'entangled' pair of a consumer and an iterator. * * @param The type of value involved. * * @return A pair consisting of a consumer of values, and an iterator that * yields the consumed values. */ public static Pair, Iterator> entangle() { Queue backer = new ArrayDeque<>(); return Pair.pair(backer::add, new QueueBackedIterator<>(backer)); } }