@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,349 @@
1
+ /**
2
+ * Terminal consumer operations: resolve an iterable to a single value (or a
3
+ * Promise of one), rather than returning another iterable. Two families:
4
+ *
5
+ * - Iterator-Helper parity (some/every/find/forEach/fold): native ES2025
6
+ * Iterator Helpers give sync code `.some()`/`.every()`/`.find()`/
7
+ * `.forEach()`/`.reduce()` for free via Iterator.from(iterable); there is
8
+ * no shipped async equivalent (AsyncIterator helpers are TC39 Stage 2),
9
+ * so the async half here is hand-rolled.
10
+ * - Summary/aggregate consumers (first/last/nth/quantify/min/max): not part
11
+ * of core Python itertools, but a near-universal expectation for any
12
+ * itertools-adjacent library (see itertools-ts's "summary" namespace);
13
+ * `quantify` specifically is a named recipe from Python's own itertools
14
+ * docs, not an invented name.
15
+ *
16
+ * House conventions:
17
+ * - Async variants `await` their callback's return value (predicate/fn/keyFn
18
+ * may be async); sync variants do not, matching native Iterator Helpers'
19
+ * own non-awaiting behavior and every other sync callback in this library
20
+ * (groupBySync's keyFn, uniqueSync's keyFn, etc.).
21
+ * - Required-callback functions put the callback first (matching
22
+ * itertools.ts: takeWhileSync(predicate, iterable)). Optional-callback
23
+ * functions put `iterable` first (matching Python's own builtin order:
24
+ * min(iterable, key=..., default=...)).
25
+ * - find/first/last/nth/min/max return `undefined` (or a caller-supplied
26
+ * `defaultValue`) on an empty iterable/no match, rather than throwing --
27
+ * consistent with Array.prototype.find, deliberately diverging from
28
+ * Python's own min()/max() (which throw without a default).
29
+ *
30
+ * `fold` is named deliberately -- NOT `reduce` -- to avoid colliding with
31
+ * reduceSync/reduceAsync in iterator-tools.ts, which are an internal
32
+ * streaming primitive (yield each emitted item) rather than a terminal
33
+ * reduce-to-one-value.
34
+ */
35
+ import { abortable } from "./abort.js";
36
+ import { isliceAsync, isliceSync } from "./itertools.js";
37
+ const maybeAbortable = (iterable, signal) => signal ? abortable(iterable, signal) : iterable;
38
+ /**
39
+ * True for a numeric NaN key. `NaN < x` and `NaN > x` are always false, so
40
+ * without an explicit check a NaN key silently falls out of every
41
+ * comparison instead of poisoning the result -- see minSync/maxSync.
42
+ * @ignore
43
+ */
44
+ const isNaNKey = (key) => typeof key === "number" && Number.isNaN(key);
45
+ /**
46
+ * True if any item satisfies predicate. Short-circuits on the first match.
47
+ * @kind function
48
+ * @name someSync
49
+ */
50
+ export const someSync = (predicate, iterable) => Iterator.from(iterable).some(predicate);
51
+ /**
52
+ * Asynchronous dual of someSync. Short-circuits (a `return` inside
53
+ * `for await...of` closes the underlying async iterator).
54
+ * @kind function
55
+ * @name someAsync
56
+ */
57
+ export const someAsync = async (predicate, iterable, { signal } = {}) => {
58
+ for await (const item of maybeAbortable(iterable, signal)) {
59
+ if (await predicate(item))
60
+ return true;
61
+ }
62
+ return false;
63
+ };
64
+ /**
65
+ * True only if every item satisfies predicate. Short-circuits on the first
66
+ * failure.
67
+ * @kind function
68
+ * @name everySync
69
+ */
70
+ export const everySync = (predicate, iterable) => Iterator.from(iterable).every(predicate);
71
+ /**
72
+ * Asynchronous dual of everySync.
73
+ * @kind function
74
+ * @name everyAsync
75
+ */
76
+ export const everyAsync = async (predicate, iterable, { signal } = {}) => {
77
+ for await (const item of maybeAbortable(iterable, signal)) {
78
+ if (!(await predicate(item)))
79
+ return false;
80
+ }
81
+ return true;
82
+ };
83
+ /**
84
+ * The first item satisfying predicate, or undefined. Short-circuits.
85
+ * @kind function
86
+ * @name findSync
87
+ */
88
+ export const findSync = (predicate, iterable) => Iterator.from(iterable).find(predicate);
89
+ /**
90
+ * Asynchronous dual of findSync.
91
+ * @kind function
92
+ * @name findAsync
93
+ */
94
+ export const findAsync = async (predicate, iterable, { signal } = {}) => {
95
+ for await (const item of maybeAbortable(iterable, signal)) {
96
+ if (await predicate(item))
97
+ return item;
98
+ }
99
+ return undefined;
100
+ };
101
+ /**
102
+ * Call fn once per item, for side effects. Returns undefined.
103
+ * @kind function
104
+ * @name forEachSync
105
+ */
106
+ export const forEachSync = (fn, iterable) => Iterator.from(iterable).forEach(fn);
107
+ /**
108
+ * Asynchronous dual of forEachSync. Distinct from `run` (iterator-tools.ts)
109
+ * -- `run` is framed around "rendering a program" (reversed argument order,
110
+ * `render` defaults to console.log); this is the itertools-parity-family
111
+ * addition with the family's usual (fn, iterable) argument order.
112
+ * @kind function
113
+ * @name forEachAsync
114
+ * @see run
115
+ */
116
+ export const forEachAsync = async (fn, iterable, { signal } = {}) => {
117
+ for await (const item of maybeAbortable(iterable, signal)) {
118
+ await fn(item);
119
+ }
120
+ };
121
+ /**
122
+ * Reduce iterable to a single value, given an explicit initial value
123
+ * (unlike Array.prototype.reduce, `init` is required -- avoids replicating
124
+ * reduce's "throws on empty array with no initial value" edge case).
125
+ * Named `fold`, not `reduce`, to avoid colliding with reduceSync/reduceAsync
126
+ * (iterator-tools.ts), which are an internal streaming primitive, not a
127
+ * terminal reduce-to-one-value.
128
+ * @kind function
129
+ * @name foldSync
130
+ */
131
+ export const foldSync = (fn, init, iterable) => Iterator.from(iterable).reduce(fn, init);
132
+ /**
133
+ * Asynchronous dual of foldSync.
134
+ * @kind function
135
+ * @name foldAsync
136
+ */
137
+ export const foldAsync = async (fn, init, iterable, { signal } = {}) => {
138
+ let acc = init;
139
+ for await (const item of maybeAbortable(iterable, signal)) {
140
+ acc = await fn(acc, item);
141
+ }
142
+ return acc;
143
+ };
144
+ /**
145
+ * The first item, or defaultValue if the iterable is empty.
146
+ * @kind function
147
+ * @name firstSync
148
+ */
149
+ export const firstSync = (iterable, defaultValue) => {
150
+ const { value, done } = iterable[Symbol.iterator]().next();
151
+ return done ? defaultValue : value;
152
+ };
153
+ /**
154
+ * Asynchronous dual of firstSync.
155
+ * @kind function
156
+ * @name firstAsync
157
+ */
158
+ export const firstAsync = async (iterable, defaultValue, { signal } = {}) => {
159
+ if (signal) {
160
+ for await (const item of abortable(iterable, signal)) {
161
+ return item;
162
+ }
163
+ return defaultValue;
164
+ }
165
+ const { value, done } = await iterable[Symbol.asyncIterator]().next();
166
+ return done ? defaultValue : value;
167
+ };
168
+ /**
169
+ * The last item, or defaultValue if the iterable is empty. Necessarily
170
+ * consumes the entire iterable -- no way around it for a generic source.
171
+ * @kind function
172
+ * @name lastSync
173
+ */
174
+ export const lastSync = (iterable, defaultValue) => {
175
+ let result = defaultValue;
176
+ for (const item of iterable) {
177
+ result = item;
178
+ }
179
+ return result;
180
+ };
181
+ /**
182
+ * Asynchronous dual of lastSync.
183
+ * @kind function
184
+ * @name lastAsync
185
+ */
186
+ export const lastAsync = async (iterable, defaultValue, { signal } = {}) => {
187
+ let result = defaultValue;
188
+ for await (const item of maybeAbortable(iterable, signal)) {
189
+ result = item;
190
+ }
191
+ return result;
192
+ };
193
+ /**
194
+ * The item at position n (0-indexed), or defaultValue if out of range.
195
+ * Reuses isliceSync rather than duplicating positional-skip logic.
196
+ * @kind function
197
+ * @name nthSync
198
+ */
199
+ export const nthSync = (iterable, n, defaultValue) => {
200
+ for (const item of isliceSync(iterable, n, n + 1)) {
201
+ return item;
202
+ }
203
+ return defaultValue;
204
+ };
205
+ /**
206
+ * Asynchronous dual of nthSync.
207
+ * @kind function
208
+ * @name nthAsync
209
+ */
210
+ export const nthAsync = async (iterable, n, defaultValue, { signal } = {}) => {
211
+ for await (const item of isliceAsync(maybeAbortable(iterable, signal), n, n + 1)) {
212
+ return item;
213
+ }
214
+ return defaultValue;
215
+ };
216
+ /**
217
+ * Count items satisfying predicate (default: count all items). Named after
218
+ * the `quantify(iterable, pred=bool)` recipe documented in Python's own
219
+ * itertools docs -- not part of core itertools, but not an invented name
220
+ * either. Deliberately not named `count`/`countSync`, which already mirror
221
+ * Python's itertools.count (an integer *sequence generator*, unrelated).
222
+ * @kind function
223
+ * @name quantifySync
224
+ */
225
+ export const quantifySync = (iterable, predicate = () => true) => {
226
+ let count = 0;
227
+ for (const item of iterable) {
228
+ if (predicate(item))
229
+ count++;
230
+ }
231
+ return count;
232
+ };
233
+ /**
234
+ * Asynchronous dual of quantifySync.
235
+ * @kind function
236
+ * @name quantifyAsync
237
+ */
238
+ export const quantifyAsync = async (iterable, predicate = () => true, { signal } = {}) => {
239
+ let count = 0;
240
+ for await (const item of maybeAbortable(iterable, signal)) {
241
+ if (await predicate(item))
242
+ count++;
243
+ }
244
+ return count;
245
+ };
246
+ /**
247
+ * The item with the minimum key (default: the item itself), or defaultValue
248
+ * if the iterable is empty. Necessarily consumes the entire iterable.
249
+ * Mirrors Python's builtin min(iterable, key=..., default=...), but
250
+ * returns undefined rather than throwing when empty and no default is given.
251
+ * A NaN key anywhere in the iterable poisons the result to NaN, matching
252
+ * `Math.min`'s own NaN-poisoning convention (rather than silently dropping
253
+ * out of every comparison and returning an unrelated wrong item).
254
+ * @kind function
255
+ * @name minSync
256
+ */
257
+ export const minSync = (iterable, keyFn = (x) => x, defaultValue) => {
258
+ let best, bestKey;
259
+ let found = false;
260
+ let sawNaN = false;
261
+ for (const item of iterable) {
262
+ const key = keyFn(item);
263
+ if (isNaNKey(key))
264
+ sawNaN = true;
265
+ if (!found || key < bestKey) {
266
+ best = item;
267
+ bestKey = key;
268
+ found = true;
269
+ }
270
+ }
271
+ if (sawNaN)
272
+ return NaN;
273
+ return found ? best : defaultValue;
274
+ };
275
+ /**
276
+ * Asynchronous dual of minSync; keyFn may be async. Same NaN-poisoning
277
+ * convention as minSync.
278
+ * @kind function
279
+ * @name minAsync
280
+ */
281
+ export const minAsync = async (iterable, keyFn = (x) => x, defaultValue, { signal } = {}) => {
282
+ let best, bestKey;
283
+ let found = false;
284
+ let sawNaN = false;
285
+ for await (const item of maybeAbortable(iterable, signal)) {
286
+ const key = await keyFn(item);
287
+ if (isNaNKey(key))
288
+ sawNaN = true;
289
+ if (!found || key < bestKey) {
290
+ best = item;
291
+ bestKey = key;
292
+ found = true;
293
+ }
294
+ }
295
+ if (sawNaN)
296
+ return NaN;
297
+ return found ? best : defaultValue;
298
+ };
299
+ /**
300
+ * The item with the maximum key (default: the item itself), or defaultValue
301
+ * if the iterable is empty. Mirrors Python's builtin
302
+ * max(iterable, key=..., default=...); see minSync for the
303
+ * undefined-vs-throw divergence and the NaN-poisoning convention.
304
+ * @kind function
305
+ * @name maxSync
306
+ */
307
+ export const maxSync = (iterable, keyFn = (x) => x, defaultValue) => {
308
+ let best, bestKey;
309
+ let found = false;
310
+ let sawNaN = false;
311
+ for (const item of iterable) {
312
+ const key = keyFn(item);
313
+ if (isNaNKey(key))
314
+ sawNaN = true;
315
+ if (!found || key > bestKey) {
316
+ best = item;
317
+ bestKey = key;
318
+ found = true;
319
+ }
320
+ }
321
+ if (sawNaN)
322
+ return NaN;
323
+ return found ? best : defaultValue;
324
+ };
325
+ /**
326
+ * Asynchronous dual of maxSync; keyFn may be async. Same NaN-poisoning
327
+ * convention as minSync.
328
+ * @kind function
329
+ * @name maxAsync
330
+ */
331
+ export const maxAsync = async (iterable, keyFn = (x) => x, defaultValue, { signal } = {}) => {
332
+ let best, bestKey;
333
+ let found = false;
334
+ let sawNaN = false;
335
+ for await (const item of maybeAbortable(iterable, signal)) {
336
+ const key = await keyFn(item);
337
+ if (isNaNKey(key))
338
+ sawNaN = true;
339
+ if (!found || key > bestKey) {
340
+ best = item;
341
+ bestKey = key;
342
+ found = true;
343
+ }
344
+ }
345
+ if (sawNaN)
346
+ return NaN;
347
+ return found ? best : defaultValue;
348
+ };
349
+ //# sourceMappingURL=consumers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumers.js","sourceRoot":"","sources":["../src/consumers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Create a sequence of numbers
3
+ * @kind function
4
+ * @name countSync
5
+ * @param min number at which to start iteration
6
+ * @param max number before which to stop iteration
7
+ * @param inc increment
8
+ * @see countAsync
9
+ * @example <caption>Log an infinite sequence of numbers starting with 5 </caption>
10
+ * ```javascript
11
+ * import { countSync } from '@johnhenry/iteration';
12
+ * for(const num of countSync(5, Infinity)){
13
+ * console.log(num);
14
+ * }
15
+ * ```
16
+ */
17
+ export declare const countSync: (min?: number, max?: number | undefined, inc?: number) => Generator<number, any, any>;
18
+ export declare const countBigSync: (min?: bigint, max?: bigint | undefined, inc?: bigint) => Generator<bigint, any, any>;
19
+ /**
20
+ * Create an asynchronous sequence of numbers
21
+ * @kind function
22
+ * @name countAsync
23
+ * @param min number at which to start iteration
24
+ * @param max number before which to stop iteration
25
+ * @param inc increment
26
+ * @see countSync
27
+ * @example <caption>Log an infinite sequence of numbers starting with 5 </caption>
28
+ * ```javascript
29
+ * import { countAsync } from '@johnhenry/iteration';
30
+ * for await(const num of countAsync(5, Infinity)){
31
+ * console.log(num);
32
+ * }
33
+ * ```
34
+ */
35
+ export declare const countAsync: (min?: number, max?: number, inc?: number) => AsyncGenerator<number>;
36
+ export declare const countBigAsync: (min?: bigint, max?: bigint, inc?: bigint) => AsyncGenerator<bigint>;
37
+ //# sourceMappingURL=count.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"count.d.ts","sourceRoot":"","sources":["../src/count.ts"],"names":[],"mappings":"AA4BA;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,SAAS,uFAAsB,CAAC;AAC7C,eAAO,MAAM,YAAY,uFAAwB,CAAC;AAClD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,UAAU,GAAoB,YAAO,EAAE,MAAM,MAAM,EAAE,YAAO,KAAG,cAAc,CAAC,MAAM,CAEhG,CAAC;AAKF,eAAO,MAAM,aAAa,GAAoB,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,MAAM,KAAG,cAAc,CAAC,MAAM,CAE7G,CAAC"}
package/dist/count.js ADDED
@@ -0,0 +1,70 @@
1
+ const count = (zero, one) => function* (min = zero, max, inc = one) {
2
+ if (max === undefined) {
3
+ if (min < zero) {
4
+ max = zero;
5
+ }
6
+ else {
7
+ max = min;
8
+ min = zero;
9
+ }
10
+ }
11
+ if (min < max) {
12
+ for (let i = min; i <= max; i = (i + inc)) {
13
+ yield i;
14
+ }
15
+ }
16
+ else if (min > max) {
17
+ for (let i = min; i >= max; i = (i - inc)) {
18
+ yield i;
19
+ }
20
+ }
21
+ else {
22
+ yield min;
23
+ }
24
+ return;
25
+ };
26
+ /**
27
+ * Create a sequence of numbers
28
+ * @kind function
29
+ * @name countSync
30
+ * @param min number at which to start iteration
31
+ * @param max number before which to stop iteration
32
+ * @param inc increment
33
+ * @see countAsync
34
+ * @example <caption>Log an infinite sequence of numbers starting with 5 </caption>
35
+ * ```javascript
36
+ * import { countSync } from '@johnhenry/iteration';
37
+ * for(const num of countSync(5, Infinity)){
38
+ * console.log(num);
39
+ * }
40
+ * ```
41
+ */
42
+ export const countSync = count(0, 1);
43
+ export const countBigSync = count(0n, 1n);
44
+ /**
45
+ * Create an asynchronous sequence of numbers
46
+ * @kind function
47
+ * @name countAsync
48
+ * @param min number at which to start iteration
49
+ * @param max number before which to stop iteration
50
+ * @param inc increment
51
+ * @see countSync
52
+ * @example <caption>Log an infinite sequence of numbers starting with 5 </caption>
53
+ * ```javascript
54
+ * import { countAsync } from '@johnhenry/iteration';
55
+ * for await(const num of countAsync(5, Infinity)){
56
+ * console.log(num);
57
+ * }
58
+ * ```
59
+ */
60
+ export const countAsync = async function* (min = 0, max, inc = 1) {
61
+ yield* countSync(min, max, inc);
62
+ };
63
+ // min/inc default to undefined here (not 0/1) so countBigSync's own
64
+ // BigInt defaults (bound via count(0n, 1n)) actually apply -- a Number
65
+ // default of 0/1 would flow straight through and crash the first time
66
+ // `min += inc` mixed a BigInt with a Number.
67
+ export const countBigAsync = async function* (min, max, inc) {
68
+ yield* countBigSync(min, max, inc);
69
+ };
70
+ //# sourceMappingURL=count.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"count.js","sourceRoot":"","sources":["../src/count.ts"],"names":[],"mappings":"AAEA,MAAM,KAAK,GAAG,CAAoB,IAAO,EAAE,GAAM,EAAE,EAAE,CACnD,QAAQ,CAAC,EAAE,MAAS,IAAI,EAAE,GAAO,EAAE,MAAS,GAAG;IAC7C,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,IAAI,GAAG,GAAG,IAAI,EAAE,CAAC;YACf,GAAG,GAAG,IAAI,CAAC;QACb,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,IAAI,CAAC;QACb,CAAC;IACH,CAAC;IAED,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAE,CAAY,GAAI,GAAc,CAAM,EAAE,CAAC;YACvE,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;SAAM,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAE,CAAY,GAAI,GAAc,CAAM,EAAE,CAAC;YACvE,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,OAAO;AACT,CAAC,CAAC;AAEJ;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAS,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAS,EAAE,EAAE,EAAE,CAAC,CAAC;AAClD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,SAAS,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAY,EAAE,GAAG,GAAG,CAAC;IACvE,KAAK,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC,CAAC;AACF,oEAAoE;AACpE,uEAAuE;AACvE,sEAAsE;AACtE,6CAA6C;AAC7C,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,SAAS,CAAC,EAAE,GAAY,EAAE,GAAY,EAAE,GAAY;IACpF,KAAK,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * "The" Empty Iterator
3
+ * Immediately finishes and yields nothing.
4
+ * @kind function
5
+ * @name emptySync
6
+ */
7
+ export declare const emptySync: Generator<never>;
8
+ /**
9
+ * "The" Empty Asynchronous Iterator
10
+ * Immediately finishes and yields nothing.
11
+ * @kind function
12
+ * @name emptyAsync
13
+ */
14
+ export declare const emptyAsync: AsyncGenerator<never>;
15
+ //# sourceMappingURL=empty-iterator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"empty-iterator.d.ts","sourceRoot":"","sources":["../src/empty-iterator.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH,eAAO,MAAM,SAAS,EAAE,SAAS,CAAC,KAAK,CAAwB,CAAC;AAEhE;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,cAAc,CAAC,KAAK,CAAyB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { conjoinAsync, conjoinSync } from "./iterator-tools.js";
2
+ /**
3
+ * "The" Empty Iterator
4
+ * Immediately finishes and yields nothing.
5
+ * @kind function
6
+ * @name emptySync
7
+ */
8
+ export const emptySync = conjoinSync();
9
+ /**
10
+ * "The" Empty Asynchronous Iterator
11
+ * Immediately finishes and yields nothing.
12
+ * @kind function
13
+ * @name emptyAsync
14
+ */
15
+ export const emptyAsync = conjoinAsync();
16
+ //# sourceMappingURL=empty-iterator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"empty-iterator.js","sourceRoot":"","sources":["../src/empty-iterator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAChE;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,SAAS,GAAqB,WAAW,EAAS,CAAC;AAEhE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAA0B,YAAY,EAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const eventualequal: (a: unknown, b: unknown) => Promise<boolean>;
2
+ //# sourceMappingURL=eventualequal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventualequal.d.ts","sourceRoot":"","sources":["../src/eventualequal.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,GAAU,GAAG,OAAO,EAAE,GAAG,OAAO,KAAG,OAAO,CAAC,OAAO,CAkD3E,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { exhaust } from "./exhaust.js";
2
+ import { isAsyncIterator, isIterator } from "./is-iterator.js";
3
+ export const eventualequal = async (a, b) => {
4
+ if (a === b)
5
+ return true;
6
+ if (a && b && typeof a === "object" && typeof b === "object") {
7
+ let length, i, keys;
8
+ if (Array.isArray(a) && Array.isArray(b)) {
9
+ length = a.length;
10
+ if (length !== b.length)
11
+ return false;
12
+ for (i = length; i-- !== 0;) {
13
+ if (!(await eventualequal(a[i], b[i])))
14
+ return false;
15
+ }
16
+ return true;
17
+ }
18
+ if (isIterator(a) || isAsyncIterator(a) || isIterator(b) || isAsyncIterator(b)) {
19
+ try {
20
+ return eventualequal(await exhaust(a), await exhaust(b));
21
+ }
22
+ catch (_e) {
23
+ return false;
24
+ }
25
+ }
26
+ if (a.constructor === RegExp) {
27
+ return a.source === b.source && a.flags === b.flags;
28
+ }
29
+ if (a.valueOf !== Object.prototype.valueOf) {
30
+ return a.valueOf() === b.valueOf();
31
+ }
32
+ if (a.toString !== Object.prototype.toString) {
33
+ return a.toString() === b.toString();
34
+ }
35
+ keys = Object.keys(a);
36
+ length = keys.length;
37
+ if (length !== Object.keys(b).length)
38
+ return false;
39
+ for (i = length; i-- !== 0;) {
40
+ if (!Object.hasOwn(b, keys[i]))
41
+ return false;
42
+ }
43
+ for (i = length; i-- !== 0;) {
44
+ const key = keys[i];
45
+ if (!(await eventualequal(a[key], b[key])))
46
+ return false;
47
+ }
48
+ return true;
49
+ }
50
+ // true if both NaN, false otherwise
51
+ // biome-ignore lint/suspicious/noSelfCompare: deliberate NaN check (x !== x is true only for NaN)
52
+ return a !== a && b !== b;
53
+ };
54
+ //# sourceMappingURL=eventualequal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventualequal.js","sourceRoot":"","sources":["../src/eventualequal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const exhaustSync: <T>(iterator: Iterable<T>) => T[];
2
+ export declare const exhaustAsync: <T>(asyncIterator: AsyncIterable<T>) => Promise<T[]>;
3
+ export declare function exhaust<T>(obj: Iterable<T>): T[];
4
+ export declare function exhaust<T>(obj: AsyncIterable<T>): Promise<T[]>;
5
+ export declare function exhaust(obj: unknown): unknown[] | Promise<unknown[]>;
6
+ export default exhaust;
7
+ //# sourceMappingURL=exhaust.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exhaust.d.ts","sourceRoot":"","sources":["../src/exhaust.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,UAAU,QAAQ,CAAC,CAAC,CAAC,KAAG,CAAC,EAEvD,CAAC;AACF,eAAO,MAAM,YAAY,GAAU,CAAC,EAAE,eAAe,aAAa,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,EAAE,CAMlF,CAAC;AAEF,wBAAgB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;AAClD,wBAAgB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;AAChE,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;AAUtE,eAAe,OAAO,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { isAsyncIterator, isIterator } from "./is-iterator.js";
2
+ export const exhaustSync = (iterator) => {
3
+ return [...iterator];
4
+ };
5
+ export const exhaustAsync = async (asyncIterator) => {
6
+ const r = [];
7
+ for await (const o of asyncIterator) {
8
+ r.push(o);
9
+ }
10
+ return r;
11
+ };
12
+ export function exhaust(obj) {
13
+ if (isIterator(obj)) {
14
+ return exhaustSync(obj);
15
+ }
16
+ else if (isAsyncIterator(obj)) {
17
+ return exhaustAsync(obj);
18
+ }
19
+ throw new TypeError(`${obj} is not iterable`);
20
+ }
21
+ export default exhaust;
22
+ //# sourceMappingURL=exhaust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exhaust.js","sourceRoot":"","sources":["../src/exhaust.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE/D,MAAM,CAAC,MAAM,WAAW,GAAG,CAAI,QAAqB,EAAO,EAAE;IAC3D,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;AACvB,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAK,aAA+B,EAAgB,EAAE;IACrF,MAAM,CAAC,GAAQ,EAAE,CAAC;IAClB,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QACpC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAKF,MAAM,UAAU,OAAO,CAAC,GAAY;IAClC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;SAAM,IAAI,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QAChC,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IACD,MAAM,IAAI,SAAS,CAAC,GAAG,GAAG,kBAAkB,CAAC,CAAC;AAChD,CAAC;AAED,eAAe,OAAO,CAAC"}
@@ -0,0 +1,16 @@
1
+ export * from "./abort.ts";
2
+ export * from "./async-channel.ts";
3
+ export * from "./concurrency.ts";
4
+ export * from "./consumers.ts";
5
+ export * from "./count.ts";
6
+ export * from "./empty-iterator.ts";
7
+ export * from "./exhaust.ts";
8
+ export * from "./is-iterator.ts";
9
+ export * from "./iterator-tools.ts";
10
+ export * from "./itertools.ts";
11
+ export * from "./tee.ts";
12
+ export * from "./transduce.ts";
13
+ import * as channelDecorators from "./channel-decorators.ts";
14
+ import * as transducers from "./transducers.ts";
15
+ export { channelDecorators, transducers };
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAE/B,OAAO,KAAK,iBAAiB,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,16 @@
1
+ export * from "./abort.js";
2
+ export * from "./async-channel.js";
3
+ export * from "./concurrency.js";
4
+ export * from "./consumers.js";
5
+ export * from "./count.js";
6
+ export * from "./empty-iterator.js";
7
+ export * from "./exhaust.js";
8
+ export * from "./is-iterator.js";
9
+ export * from "./iterator-tools.js";
10
+ export * from "./itertools.js";
11
+ export * from "./tee.js";
12
+ export * from "./transduce.js";
13
+ import * as channelDecorators from "./channel-decorators.js";
14
+ import * as transducers from "./transducers.js";
15
+ export { channelDecorators, transducers };
16
+ //# sourceMappingURL=index.js.map