// iterators are not thread-safe static L> splitIterator(final int n, final Iterator it) { class SplitIterator { final int[] positions = repIntAsArray(n, -1); new CircularArrayList buffer; int first; bool done; L> iterators() { new L> l; for _i to n: { final int i = _i; l.add((IterableIterator) iteratorFF(func { positions[i]++; updateBuffer(); int idx = positions[i]-first; ret idx >= l(buffer) ? endMarker() : buffer.get(idx); })); } ret l; } int last() { ret first+l(buffer); } void updateBuffer { int min = min(positions), max = max(positions); while (min > first) { buffer.remove(0); ++first; } while (!done && max >= last()) { if (!it.hasNext()) done = true; else buffer.add(it.next()); } } } ret new SplitIterator().iterators(); }