static L> splitIterator(final int n, final Iterator it) { class SplitIterator { final int[] positions = repIntAsArray(n, -1); CircularArrayList buffer; int first; L> iterators() { new L> l; for _i to n: { final int i = _i; l.add(iteratorFF(func { positions[i]++; updateBuffer(); ret buffer.get(positions[i]-first); })); } 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 (max > last()) buffer.add(it.next()); } } ret new SplitIterator().iterators(); }