package bjc.utils.funcutils; import java.util.Iterator; import java.util.function.Function; /** * Utility methods for dealing with iterators. * * @author bjculkin * */ public class IteratorUtils { public static class ChainIterator implements Iterator { private Iterator mainItr; private Function> trans; private Iterator curItr; public ChainIterator(Iterator mainItr, Function> trans) { this.mainItr = mainItr; this.trans = trans; } @Override public boolean hasNext() { if (curItr != null) { if (curItr.hasNext()) return true; else return mainItr.hasNext(); } return mainItr.hasNext(); } @Override public T2 next() { if (curItr == null || !curItr.hasNext()) { curItr = trans.apply(mainItr.next()); } return curItr.next(); } } /** * Convert an iterator to an iterable. * * @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 itr * The iterable to convert. * @return The iterator from that iterable */ public static Iterator I(Iterable itr) { return itr.iterator(); } public static Iterator chain(Iterator itrA, Function> itrB) { return new ChainIterator(itrA, itrB); } }