// iterators are not thread-safe static <A> L<IterableIterator<A>> splitIterator(final int n, final Iterator<A> it) { class SplitIterator { final int[] positions = repIntAsArray(n, -1); new CircularArrayList<A> buffer; int first; bool done; L<IterableIterator<A>> iterators() { new L<IterableIterator<A>> 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(); }
download show line numbers debug dex old transpilations
Travelled to 13 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1013600 |
| Snippet name: | splitIterator - split an iterator into parallel iterators with dynamic buffering |
| Eternal ID of this version: | #1013600/13 |
| Text MD5: | 5679d53cd7a64bc35079495a2f3a6e58 |
| Author: | stefan |
| Category: | javax |
| Type: | JavaX fragment (include) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2018-01-11 14:21:31 |
| Source code size: | 1047 bytes / 37 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 750 / 767 |
| Version history: | 12 change(s) |
| Referenced in: | [show references] |