@johnhenry/iteration 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/MIT-LICENSE.txt +20 -0
  2. package/dist/abort.d.ts +26 -0
  3. package/dist/abort.d.ts.map +1 -0
  4. package/dist/abort.js +69 -0
  5. package/dist/abort.js.map +1 -0
  6. package/dist/assertions/eventualequal.d.ts +9 -0
  7. package/dist/assertions/eventualequal.d.ts.map +1 -0
  8. package/dist/assertions/eventualequal.js +30 -0
  9. package/dist/assertions/eventualequal.js.map +1 -0
  10. package/dist/async-channel.d.ts +101 -0
  11. package/dist/async-channel.d.ts.map +1 -0
  12. package/dist/async-channel.js +208 -0
  13. package/dist/async-channel.js.map +1 -0
  14. package/dist/channel-decorators.d.ts +23 -0
  15. package/dist/channel-decorators.d.ts.map +1 -0
  16. package/dist/channel-decorators.js +31 -0
  17. package/dist/channel-decorators.js.map +1 -0
  18. package/dist/concurrency.d.ts +43 -0
  19. package/dist/concurrency.d.ts.map +1 -0
  20. package/dist/concurrency.js +145 -0
  21. package/dist/concurrency.js.map +1 -0
  22. package/dist/consumers.d.ts +199 -0
  23. package/dist/consumers.d.ts.map +1 -0
  24. package/dist/consumers.js +349 -0
  25. package/dist/consumers.js.map +1 -0
  26. package/dist/count.d.ts +37 -0
  27. package/dist/count.d.ts.map +1 -0
  28. package/dist/count.js +70 -0
  29. package/dist/count.js.map +1 -0
  30. package/dist/empty-iterator.d.ts +15 -0
  31. package/dist/empty-iterator.d.ts.map +1 -0
  32. package/dist/empty-iterator.js +16 -0
  33. package/dist/empty-iterator.js.map +1 -0
  34. package/dist/eventualequal.d.ts +2 -0
  35. package/dist/eventualequal.d.ts.map +1 -0
  36. package/dist/eventualequal.js +54 -0
  37. package/dist/eventualequal.js.map +1 -0
  38. package/dist/exhaust.d.ts +7 -0
  39. package/dist/exhaust.d.ts.map +1 -0
  40. package/dist/exhaust.js +22 -0
  41. package/dist/exhaust.js.map +1 -0
  42. package/dist/index.d.ts +16 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +16 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/is-iterator.d.ts +5 -0
  47. package/dist/is-iterator.d.ts.map +1 -0
  48. package/dist/is-iterator.js +5 -0
  49. package/dist/is-iterator.js.map +1 -0
  50. package/dist/iterator-tools.d.ts +164 -0
  51. package/dist/iterator-tools.d.ts.map +1 -0
  52. package/dist/iterator-tools.js +231 -0
  53. package/dist/iterator-tools.js.map +1 -0
  54. package/dist/itertools.d.ts +237 -0
  55. package/dist/itertools.d.ts.map +1 -0
  56. package/dist/itertools.js +471 -0
  57. package/dist/itertools.js.map +1 -0
  58. package/dist/tee.d.ts +18 -0
  59. package/dist/tee.d.ts.map +1 -0
  60. package/dist/tee.js +118 -0
  61. package/dist/tee.js.map +1 -0
  62. package/dist/transduce.d.ts +79 -0
  63. package/dist/transduce.d.ts.map +1 -0
  64. package/dist/transduce.js +37 -0
  65. package/dist/transduce.js.map +1 -0
  66. package/dist/transducers.d.ts +123 -0
  67. package/dist/transducers.d.ts.map +1 -0
  68. package/dist/transducers.js +212 -0
  69. package/dist/transducers.js.map +1 -0
  70. package/package.json +122 -0
  71. package/readme.md +761 -0
  72. package/src/abort.ts +80 -0
  73. package/src/assertions/eventualequal.ts +36 -0
  74. package/src/async-channel.ts +228 -0
  75. package/src/channel-decorators.ts +49 -0
  76. package/src/concurrency.ts +168 -0
  77. package/src/consumers.ts +425 -0
  78. package/src/count.ts +72 -0
  79. package/src/empty-iterator.ts +17 -0
  80. package/src/eventualequal.ts +54 -0
  81. package/src/exhaust.ts +26 -0
  82. package/src/index.ts +17 -0
  83. package/src/is-iterator.ts +9 -0
  84. package/src/iterator-tools.ts +290 -0
  85. package/src/itertools.ts +518 -0
  86. package/src/tee.ts +136 -0
  87. package/src/transduce.ts +161 -0
  88. package/src/transducers.ts +256 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"itertools.d.ts","sourceRoot":"","sources":["../src/itertools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,471 @@
1
+ /**
2
+ * Python itertools-parity building blocks.
3
+ *
4
+ * Unlike the curried transducer factories in transducers.ts (which are
5
+ * shaped `(...) => (conjoin) => (init, item) => ...` for composition inside
6
+ * transduceSync/transduceAsync), the functions here are flat, direct
7
+ * iterable-in/iterable-out generators -- matching Python's itertools
8
+ * argument order (predicate/fn first, iterable(s) last) so porting a
9
+ * Python recipe is close to mechanical.
10
+ *
11
+ * Where a sync function's behavior is fully covered by native ES2025
12
+ * Iterator Helpers (Iterator.prototype.map/filter/...), it's implemented
13
+ * as a thin wrapper around Iterator.from(iterable) rather than a hand-rolled
14
+ * generator, to keep the maintenance surface small. Async counterparts are
15
+ * always hand-rolled async generators, since AsyncIterator helpers are not
16
+ * yet shipped (TC39 Stage 2).
17
+ *
18
+ * See docs/discussion/python-itertools.md for the full comparison to
19
+ * Python's itertools module and the documented design divergences.
20
+ */
21
+ import { isAsyncIterator } from "./is-iterator.js";
22
+ import { concatAsync, concatSync, zipAsync, zipSync } from "./iterator-tools.js";
23
+ /**
24
+ * Yield items while predicate holds; stop (without consuming further) at
25
+ * the first item that fails it. Predicate-based complement to the
26
+ * numeric `take` transducer.
27
+ * @kind function
28
+ * @name takeWhileSync
29
+ */
30
+ export function* takeWhileSync(predicate, iterable) {
31
+ for (const item of iterable) {
32
+ if (!predicate(item))
33
+ return;
34
+ yield item;
35
+ }
36
+ }
37
+ /**
38
+ * Asynchronous dual of takeWhileSync.
39
+ * @kind function
40
+ * @name takeWhileAsync
41
+ */
42
+ export async function* takeWhileAsync(predicate, iterable) {
43
+ for await (const item of iterable) {
44
+ if (!predicate(item))
45
+ return;
46
+ yield item;
47
+ }
48
+ }
49
+ /**
50
+ * Drop items while predicate holds, then yield everything else.
51
+ * Predicate-based complement to the numeric `drop` transducer.
52
+ * @kind function
53
+ * @name dropWhileSync
54
+ */
55
+ export function* dropWhileSync(predicate, iterable) {
56
+ const it = iterable[Symbol.iterator]();
57
+ let r = it.next();
58
+ while (!r.done && predicate(r.value)) {
59
+ r = it.next();
60
+ }
61
+ while (!r.done) {
62
+ yield r.value;
63
+ r = it.next();
64
+ }
65
+ }
66
+ /**
67
+ * Asynchronous dual of dropWhileSync.
68
+ * @kind function
69
+ * @name dropWhileAsync
70
+ */
71
+ export async function* dropWhileAsync(predicate, iterable) {
72
+ const it = iterable[Symbol.asyncIterator]();
73
+ let r = await it.next();
74
+ while (!r.done && predicate(r.value)) {
75
+ r = await it.next();
76
+ }
77
+ while (!r.done) {
78
+ yield r.value;
79
+ r = await it.next();
80
+ }
81
+ }
82
+ /**
83
+ * Select items from `iterable` for which the parallel `selectors` iterable
84
+ * is truthy. Mirrors Python's itertools.compress(data, selectors).
85
+ * @kind function
86
+ * @name compressSync
87
+ */
88
+ export function* compressSync(iterable, selectors) {
89
+ for (const [item, keep] of zipSync(iterable, selectors)) {
90
+ if (keep)
91
+ yield item;
92
+ }
93
+ }
94
+ /**
95
+ * Asynchronous dual of compressSync.
96
+ * @kind function
97
+ * @name compressAsync
98
+ */
99
+ export async function* compressAsync(iterable, selectors) {
100
+ for await (const [item, keep] of zipAsync(iterable, selectors)) {
101
+ if (keep)
102
+ yield item;
103
+ }
104
+ }
105
+ /**
106
+ * Yield overlapping windows of `n` consecutive items.
107
+ * @kind function
108
+ * @name windowedSync
109
+ */
110
+ export function* windowedSync(iterable, n) {
111
+ const buf = [];
112
+ for (const item of iterable) {
113
+ buf.push(item);
114
+ if (buf.length > n)
115
+ buf.shift();
116
+ if (buf.length === n)
117
+ yield buf.slice();
118
+ }
119
+ }
120
+ /**
121
+ * Asynchronous dual of windowedSync.
122
+ * @kind function
123
+ * @name windowedAsync
124
+ */
125
+ export async function* windowedAsync(iterable, n) {
126
+ const buf = [];
127
+ for await (const item of iterable) {
128
+ buf.push(item);
129
+ if (buf.length > n)
130
+ buf.shift();
131
+ if (buf.length === n)
132
+ yield buf.slice();
133
+ }
134
+ }
135
+ /**
136
+ * Yield successive overlapping pairs. Mirrors Python 3.10+'s
137
+ * itertools.pairwise -- a thin call to windowedSync(iterable, 2) so the
138
+ * ring-buffer logic isn't duplicated.
139
+ * @kind function
140
+ * @name pairwiseSync
141
+ */
142
+ export function* pairwiseSync(iterable) {
143
+ yield* windowedSync(iterable, 2);
144
+ }
145
+ /**
146
+ * Asynchronous dual of pairwiseSync.
147
+ * @kind function
148
+ * @name pairwiseAsync
149
+ */
150
+ export async function* pairwiseAsync(iterable) {
151
+ yield* windowedAsync(iterable, 2);
152
+ }
153
+ /**
154
+ * Group consecutive items sharing a key into `[key, items[]]` pairs.
155
+ * Mirrors Python's itertools.groupby, but deliberately diverges from it:
156
+ * Python's sub-iterators are lazy and invalidated by the next outer
157
+ * `next()` call (a well-known footgun); this eagerly materializes each
158
+ * run as an array instead, which is safer and matches what JS developers
159
+ * expect. As in Python, only *consecutive* runs are grouped -- sort the
160
+ * input first if you want all occurrences of a key merged globally.
161
+ * @kind function
162
+ * @name groupBySync
163
+ */
164
+ export function* groupBySync(iterable, keyFn = (x) => x) {
165
+ const it = iterable[Symbol.iterator]();
166
+ let r = it.next();
167
+ if (r.done)
168
+ return;
169
+ let currentKey = keyFn(r.value);
170
+ let bucket = [r.value];
171
+ for (r = it.next(); !r.done; r = it.next()) {
172
+ const key = keyFn(r.value);
173
+ if (Object.is(key, currentKey)) {
174
+ bucket.push(r.value);
175
+ }
176
+ else {
177
+ yield [currentKey, bucket];
178
+ currentKey = key;
179
+ bucket = [r.value];
180
+ }
181
+ }
182
+ yield [currentKey, bucket];
183
+ }
184
+ /**
185
+ * Asynchronous dual of groupBySync.
186
+ * @kind function
187
+ * @name groupByAsync
188
+ */
189
+ export async function* groupByAsync(iterable, keyFn = (x) => x) {
190
+ const it = iterable[Symbol.asyncIterator]();
191
+ let r = await it.next();
192
+ if (r.done)
193
+ return;
194
+ let currentKey = keyFn(r.value);
195
+ let bucket = [r.value];
196
+ for (r = await it.next(); !r.done; r = await it.next()) {
197
+ const key = keyFn(r.value);
198
+ if (Object.is(key, currentKey)) {
199
+ bucket.push(r.value);
200
+ }
201
+ else {
202
+ yield [currentKey, bucket];
203
+ currentKey = key;
204
+ bucket = [r.value];
205
+ }
206
+ }
207
+ yield [currentKey, bucket];
208
+ }
209
+ /**
210
+ * Chain multiple iterables into one sequence. Mirrors Python's
211
+ * itertools.chain(*iterables); an itertools-parity alias of concatSync.
212
+ * @kind function
213
+ * @name chainSync
214
+ * @see flattenSync
215
+ */
216
+ export const chainSync = concatSync;
217
+ /**
218
+ * Asynchronous dual of chainSync; alias of concatAsync.
219
+ * @kind function
220
+ * @name chainAsync
221
+ * @see flattenAsync
222
+ */
223
+ export const chainAsync = concatAsync;
224
+ /**
225
+ * Flatten one level of an iterable-of-iterables. Mirrors Python's
226
+ * itertools.chain.from_iterable -- the single-arg counterpart to
227
+ * chainSync's variadic form. Not recursive.
228
+ * @kind function
229
+ * @name flattenSync
230
+ * @see chainSync
231
+ */
232
+ export function* flattenSync(iterableOfIterables) {
233
+ for (const inner of iterableOfIterables) {
234
+ yield* inner;
235
+ }
236
+ }
237
+ /**
238
+ * Asynchronous dual of flattenSync.
239
+ * @kind function
240
+ * @name flattenAsync
241
+ * @see chainAsync
242
+ */
243
+ export async function* flattenAsync(iterableOfIterables) {
244
+ for await (const inner of iterableOfIterables) {
245
+ yield* inner;
246
+ }
247
+ }
248
+ /**
249
+ * Cycle through `iterable` forever, buffering it on the first pass so a
250
+ * one-shot source (e.g. a generator) can still be replayed. Yields
251
+ * nothing if the source is empty.
252
+ * @kind function
253
+ * @name cycleSync
254
+ */
255
+ export function* cycleSync(iterable) {
256
+ const buffer = [];
257
+ for (const item of iterable) {
258
+ buffer.push(item);
259
+ yield item;
260
+ }
261
+ while (buffer.length > 0) {
262
+ yield* buffer;
263
+ }
264
+ }
265
+ /**
266
+ * Asynchronous dual of cycleSync.
267
+ * @kind function
268
+ * @name cycleAsync
269
+ */
270
+ export async function* cycleAsync(iterable) {
271
+ const buffer = [];
272
+ for await (const item of iterable) {
273
+ buffer.push(item);
274
+ yield item;
275
+ }
276
+ while (buffer.length > 0) {
277
+ yield* buffer;
278
+ }
279
+ }
280
+ /**
281
+ * Yield `value` repeatedly, `times` times (default infinite).
282
+ * @kind function
283
+ * @name repeatSync
284
+ */
285
+ export function* repeatSync(value, times = Infinity) {
286
+ for (let i = 0; i < times; i++) {
287
+ yield value;
288
+ }
289
+ }
290
+ /**
291
+ * Asynchronous dual of repeatSync.
292
+ * @kind function
293
+ * @name repeatAsync
294
+ */
295
+ export async function* repeatAsync(value, times = Infinity) {
296
+ for (let i = 0; i < times; i++) {
297
+ yield value;
298
+ }
299
+ }
300
+ /**
301
+ * Yield only the first occurrence of each key -- global, unbounded-memory
302
+ * dedupe. Mirrors the `unique_everseen` recipe from Python's itertools docs.
303
+ * @kind function
304
+ * @name uniqueSync
305
+ */
306
+ export function* uniqueSync(iterable, keyFn = (x) => x) {
307
+ const seen = new Set();
308
+ for (const item of iterable) {
309
+ const key = keyFn(item);
310
+ if (!seen.has(key)) {
311
+ seen.add(key);
312
+ yield item;
313
+ }
314
+ }
315
+ }
316
+ /**
317
+ * Asynchronous dual of uniqueSync.
318
+ * @kind function
319
+ * @name uniqueAsync
320
+ */
321
+ export async function* uniqueAsync(iterable, keyFn = (x) => x) {
322
+ const seen = new Set();
323
+ for await (const item of iterable) {
324
+ const key = keyFn(item);
325
+ if (!seen.has(key)) {
326
+ seen.add(key);
327
+ yield item;
328
+ }
329
+ }
330
+ }
331
+ /**
332
+ * Yield `[index, value]` pairs, mirroring Python's builtin enumerate().
333
+ * Implemented via native Iterator Helpers: Iterator.prototype.map's
334
+ * callback receives `(value, index)`, unlike Array.prototype.map's
335
+ * `(value, index, array)` -- confirmed present in ES2025.
336
+ * @kind function
337
+ * @name enumerateSync
338
+ */
339
+ export function* enumerateSync(iterable, start = 0) {
340
+ yield* Iterator.from(iterable).map((value, index) => [index + start, value]);
341
+ }
342
+ /**
343
+ * Asynchronous dual of enumerateSync (hand-rolled -- no native
344
+ * AsyncIterator helpers are shipped yet).
345
+ * @kind function
346
+ * @name enumerateAsync
347
+ */
348
+ export async function* enumerateAsync(iterable, start = 0) {
349
+ let index = start;
350
+ for await (const value of iterable) {
351
+ yield [index++, value];
352
+ }
353
+ }
354
+ /**
355
+ * Call `fn` with each item's contents spread as arguments. Mirrors
356
+ * Python's itertools.starmap.
357
+ * @kind function
358
+ * @name starmapSync
359
+ */
360
+ export function* starmapSync(fn, iterableOfArgArrays) {
361
+ yield* Iterator.from(iterableOfArgArrays).map((args) => fn(...args));
362
+ }
363
+ /**
364
+ * Asynchronous dual of starmapSync.
365
+ * @kind function
366
+ * @name starmapAsync
367
+ */
368
+ export async function* starmapAsync(fn, iterableOfArgArrays) {
369
+ for await (const args of iterableOfArgArrays) {
370
+ yield fn(...args);
371
+ }
372
+ }
373
+ /**
374
+ * Zip iterators, continuing to the longest one and filling exhausted
375
+ * ones with `fillValue`. Complement to the strict, stop-at-shortest
376
+ * zipSync/zipAsync. Mirrors Python's itertools.zip_longest.
377
+ * @kind function
378
+ * @name zipLongestSync
379
+ * @param fillValue value used once an input is exhausted
380
+ * @param iteratorList iterables to zip
381
+ */
382
+ export function* zipLongestSync(fillValue, ...iteratorList) {
383
+ const generators = iteratorList.map((iterator) => iterator[Symbol.iterator]());
384
+ while (true) {
385
+ const result = [];
386
+ let anyNotDone = false;
387
+ for (const generator of generators) {
388
+ const { value, done } = generator.next();
389
+ if (done) {
390
+ result.push(fillValue);
391
+ }
392
+ else {
393
+ anyNotDone = true;
394
+ result.push(value);
395
+ }
396
+ }
397
+ if (!anyNotDone)
398
+ return;
399
+ yield result;
400
+ }
401
+ }
402
+ /**
403
+ * Asynchronous dual of zipLongestSync. Pulls the next value from every
404
+ * input in parallel each round, like zipAsync.
405
+ * @kind function
406
+ * @name zipLongestAsync
407
+ */
408
+ export async function* zipLongestAsync(fillValue, ...iteratorList) {
409
+ const generators = iteratorList.map((iterator) => isAsyncIterator(iterator)
410
+ ? iterator[Symbol.asyncIterator]()
411
+ : iterator[Symbol.iterator]());
412
+ while (true) {
413
+ const results = await Promise.all(generators.map((g) => g.next()));
414
+ if (results.every(({ done }) => done))
415
+ return;
416
+ yield results.map(({ value, done }) => (done ? fillValue : value));
417
+ }
418
+ }
419
+ /**
420
+ * General slicing over an iterable. Mirrors Python's itertools.islice
421
+ * overloads: `isliceSync(iterable, stop)` or
422
+ * `isliceSync(iterable, start, stop, step)`. `step` has no native
423
+ * fast-path, so both sync and async are hand-rolled uniformly rather
424
+ * than branching between a native-composed common case and a fallback.
425
+ * @kind function
426
+ * @name isliceSync
427
+ */
428
+ export function* isliceSync(iterable, ...args) {
429
+ let start = 0, stop = Infinity, step = 1;
430
+ if (args.length === 1)
431
+ [stop] = args;
432
+ else if (args.length === 2)
433
+ [start, stop] = args;
434
+ else if (args.length >= 3)
435
+ [start, stop, step] = args;
436
+ if (stop == null)
437
+ stop = Infinity;
438
+ if (step < 1)
439
+ throw new RangeError("islice step must be >= 1");
440
+ const it = iterable[Symbol.iterator]();
441
+ let i = 0;
442
+ for (let r = it.next(); !r.done && i < stop; r = it.next(), i++) {
443
+ if (i >= start && (i - start) % step === 0)
444
+ yield r.value;
445
+ }
446
+ }
447
+ /**
448
+ * Asynchronous dual of isliceSync.
449
+ * @kind function
450
+ * @name isliceAsync
451
+ */
452
+ export async function* isliceAsync(iterable, ...args) {
453
+ let start = 0, stop = Infinity, step = 1;
454
+ if (args.length === 1)
455
+ [stop] = args;
456
+ else if (args.length === 2)
457
+ [start, stop] = args;
458
+ else if (args.length >= 3)
459
+ [start, stop, step] = args;
460
+ if (stop == null)
461
+ stop = Infinity;
462
+ if (step < 1)
463
+ throw new RangeError("islice step must be >= 1");
464
+ const it = iterable[Symbol.asyncIterator]();
465
+ let i = 0;
466
+ for (let r = await it.next(); !r.done && i < stop; r = await it.next(), i++) {
467
+ if (i >= start && (i - start) % step === 0)
468
+ yield r.value;
469
+ }
470
+ }
471
+ //# sourceMappingURL=itertools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"itertools.js","sourceRoot":"","sources":["../src/itertools.ts"],"names":[],"mappings":"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"}
package/dist/tee.d.ts ADDED
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Create a function that tees emitted items to n iterators
3
+ * @kind function
4
+ * @name teeSync / teeAsync
5
+ * @param num number of iterators to create
6
+ * @returns function
7
+ * @example <caption>Split an iterator into 4 </caption>
8
+ * ```javascript
9
+ * import { teeAsync, countAsync } from '@johnhenry/iteration';
10
+ * const streams = teeAsync(4)(countAsync(Infinity))
11
+ * for await (const num of streams[0]){
12
+ * console.info(num);
13
+ * };
14
+ * ```
15
+ */
16
+ export declare const teeSync: (num?: number) => <T>(iterable: Iterable<T>) => Array<Generator<T>>;
17
+ export declare const teeAsync: (num?: number) => <T>(iterable: AsyncIterable<T>) => Array<AsyncGenerator<T>>;
18
+ //# sourceMappingURL=tee.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tee.d.ts","sourceRoot":"","sources":["../src/tee.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,eAAO,MAAM,OAAO,GACjB,YAAO,MACP,CAAC,EAAE,UAAU,QAAQ,CAAC,CAAC,CAAC,KAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAyC7C,CAAC;AAEJ,eAAO,MAAM,QAAQ,GAClB,YAAO,MACP,CAAC,EAAE,UAAU,aAAa,CAAC,CAAC,CAAC,KAAG,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAsEvD,CAAC"}
package/dist/tee.js ADDED
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Create a function that tees emitted items to n iterators
3
+ * @kind function
4
+ * @name teeSync / teeAsync
5
+ * @param num number of iterators to create
6
+ * @returns function
7
+ * @example <caption>Split an iterator into 4 </caption>
8
+ * ```javascript
9
+ * import { teeAsync, countAsync } from '@johnhenry/iteration';
10
+ * const streams = teeAsync(4)(countAsync(Infinity))
11
+ * for await (const num of streams[0]){
12
+ * console.info(num);
13
+ * };
14
+ * ```
15
+ */
16
+ const DONE = Symbol("DONE");
17
+ export const teeSync = (num = 0) => (iterable) => {
18
+ const source = iterable[Symbol.iterator]();
19
+ const buffers = new Array(num).fill(null).map(() => []);
20
+ const next = (i) => {
21
+ const buffer = buffers[i];
22
+ if (buffer.length !== 0) {
23
+ return buffer.shift();
24
+ }
25
+ const x = source.next();
26
+ if (x.done) {
27
+ return DONE;
28
+ }
29
+ for (let j = 0; j < buffers.length; j++) {
30
+ if (j !== i)
31
+ buffers[j].push(x.value);
32
+ }
33
+ return x.value;
34
+ };
35
+ return buffers.map(function* (_, i) {
36
+ try {
37
+ for (;;) {
38
+ const x = next(i);
39
+ if (x === DONE) {
40
+ break;
41
+ }
42
+ yield x;
43
+ }
44
+ }
45
+ finally {
46
+ // Runs on natural completion *and* on early exit (e.g. a consumer
47
+ // `break`s out of a `for...of`, which calls this generator's own
48
+ // .return(), which runs this finally block) -- without it, an
49
+ // early-exiting consumer left the shared source iterator (and
50
+ // whatever resource it holds) never closed.
51
+ source.return?.();
52
+ }
53
+ });
54
+ };
55
+ export const teeAsync = (num = 0) => (iterable) => {
56
+ const source = iterable[Symbol.asyncIterator]();
57
+ const buffers = new Array(num).fill(null).map(() => []);
58
+ // Guards against the check-then-act race between "is my buffer empty"
59
+ // and "pull from source": if two branches both call next() while their
60
+ // buffers are empty in the same logical turn, only the first should
61
+ // actually call source.next(); the rest must ride along on that single
62
+ // in-flight pull and then re-check their (now-populated) buffer, rather
63
+ // than each independently issuing their own source.next() call.
64
+ let inFlight = null;
65
+ let sourceDone = false;
66
+ const next = async (i) => {
67
+ const buffer = buffers[i];
68
+ if (buffer.length !== 0) {
69
+ return buffer.shift();
70
+ }
71
+ if (sourceDone) {
72
+ return DONE;
73
+ }
74
+ if (inFlight) {
75
+ // Someone else is already pulling for this turn -- wait for it, then
76
+ // re-evaluate: our buffer will have been fed by the puller (unless
77
+ // the source is now exhausted).
78
+ await inFlight;
79
+ return next(i);
80
+ }
81
+ const pull = (async () => {
82
+ const x = await source.next();
83
+ if (x.done) {
84
+ sourceDone = true;
85
+ return DONE;
86
+ }
87
+ for (let j = 0; j < buffers.length; j++) {
88
+ if (j !== i)
89
+ buffers[j].push(x.value);
90
+ }
91
+ return x.value;
92
+ })();
93
+ inFlight = pull;
94
+ try {
95
+ return await pull;
96
+ }
97
+ finally {
98
+ inFlight = null;
99
+ }
100
+ };
101
+ return buffers.map(async function* (_, i) {
102
+ try {
103
+ for (;;) {
104
+ const x = await next(i);
105
+ if (x === DONE) {
106
+ break;
107
+ }
108
+ yield x;
109
+ }
110
+ }
111
+ finally {
112
+ // See teeSync's matching finally: runs on natural completion *and*
113
+ // on early exit, so the shared source iterator is always closed.
114
+ await source.return?.();
115
+ }
116
+ });
117
+ };
118
+ //# sourceMappingURL=tee.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tee.js","sourceRoot":"","sources":["../src/tee.ts"],"names":[],"mappings":"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"}