@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.
- package/MIT-LICENSE.txt +20 -0
- package/dist/abort.d.ts +26 -0
- package/dist/abort.d.ts.map +1 -0
- package/dist/abort.js +69 -0
- package/dist/abort.js.map +1 -0
- package/dist/assertions/eventualequal.d.ts +9 -0
- package/dist/assertions/eventualequal.d.ts.map +1 -0
- package/dist/assertions/eventualequal.js +30 -0
- package/dist/assertions/eventualequal.js.map +1 -0
- package/dist/async-channel.d.ts +101 -0
- package/dist/async-channel.d.ts.map +1 -0
- package/dist/async-channel.js +208 -0
- package/dist/async-channel.js.map +1 -0
- package/dist/channel-decorators.d.ts +23 -0
- package/dist/channel-decorators.d.ts.map +1 -0
- package/dist/channel-decorators.js +31 -0
- package/dist/channel-decorators.js.map +1 -0
- package/dist/concurrency.d.ts +43 -0
- package/dist/concurrency.d.ts.map +1 -0
- package/dist/concurrency.js +145 -0
- package/dist/concurrency.js.map +1 -0
- package/dist/consumers.d.ts +199 -0
- package/dist/consumers.d.ts.map +1 -0
- package/dist/consumers.js +349 -0
- package/dist/consumers.js.map +1 -0
- package/dist/count.d.ts +37 -0
- package/dist/count.d.ts.map +1 -0
- package/dist/count.js +70 -0
- package/dist/count.js.map +1 -0
- package/dist/empty-iterator.d.ts +15 -0
- package/dist/empty-iterator.d.ts.map +1 -0
- package/dist/empty-iterator.js +16 -0
- package/dist/empty-iterator.js.map +1 -0
- package/dist/eventualequal.d.ts +2 -0
- package/dist/eventualequal.d.ts.map +1 -0
- package/dist/eventualequal.js +54 -0
- package/dist/eventualequal.js.map +1 -0
- package/dist/exhaust.d.ts +7 -0
- package/dist/exhaust.d.ts.map +1 -0
- package/dist/exhaust.js +22 -0
- package/dist/exhaust.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/is-iterator.d.ts +5 -0
- package/dist/is-iterator.d.ts.map +1 -0
- package/dist/is-iterator.js +5 -0
- package/dist/is-iterator.js.map +1 -0
- package/dist/iterator-tools.d.ts +164 -0
- package/dist/iterator-tools.d.ts.map +1 -0
- package/dist/iterator-tools.js +231 -0
- package/dist/iterator-tools.js.map +1 -0
- package/dist/itertools.d.ts +237 -0
- package/dist/itertools.d.ts.map +1 -0
- package/dist/itertools.js +471 -0
- package/dist/itertools.js.map +1 -0
- package/dist/tee.d.ts +18 -0
- package/dist/tee.d.ts.map +1 -0
- package/dist/tee.js +118 -0
- package/dist/tee.js.map +1 -0
- package/dist/transduce.d.ts +79 -0
- package/dist/transduce.d.ts.map +1 -0
- package/dist/transduce.js +37 -0
- package/dist/transduce.js.map +1 -0
- package/dist/transducers.d.ts +123 -0
- package/dist/transducers.d.ts.map +1 -0
- package/dist/transducers.js +212 -0
- package/dist/transducers.js.map +1 -0
- package/package.json +122 -0
- package/readme.md +761 -0
- package/src/abort.ts +80 -0
- package/src/assertions/eventualequal.ts +36 -0
- package/src/async-channel.ts +228 -0
- package/src/channel-decorators.ts +49 -0
- package/src/concurrency.ts +168 -0
- package/src/consumers.ts +425 -0
- package/src/count.ts +72 -0
- package/src/empty-iterator.ts +17 -0
- package/src/eventualequal.ts +54 -0
- package/src/exhaust.ts +26 -0
- package/src/index.ts +17 -0
- package/src/is-iterator.ts +9 -0
- package/src/iterator-tools.ts +290 -0
- package/src/itertools.ts +518 -0
- package/src/tee.ts +136 -0
- package/src/transduce.ts +161 -0
- 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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAAE,SAAS,EAAsB,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAKzD,MAAM,cAAc,GAAG,CAAI,QAA6B,EAAE,MAAoB,EAAuB,EAAE,CACrG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAElD;;;;;GAKG;AACH,MAAM,QAAQ,GAAG,CAAC,GAAY,EAAW,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAEzF;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAI,SAA+B,EAAE,QAAqB,EAAW,EAAE,CAC7F,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAC5B,SAA6C,EAC7C,QAA6B,EAC7B,EAAE,MAAM,KAAoB,EAAE,EACZ,EAAE;IACpB,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;QAC1D,IAAI,MAAM,SAAS,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IACzC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAI,SAA+B,EAAE,QAAqB,EAAW,EAAE,CAC9F,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAE3C;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAC7B,SAA6C,EAC7C,QAA6B,EAC7B,EAAE,MAAM,KAAoB,EAAE,EACZ,EAAE;IACpB,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;QAC1D,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAC7C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAI,SAA+B,EAAE,QAAqB,EAAiB,EAAE,CACnG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAE1C;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAC5B,SAA6C,EAC7C,QAA6B,EAC7B,EAAE,MAAM,KAAoB,EAAE,EACN,EAAE;IAC1B,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;QAC1D,IAAI,MAAM,SAAS,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IACzC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAI,EAAwB,EAAE,QAAqB,EAAQ,EAAE,CACtF,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAEtC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,EAAwB,EACxB,QAA6B,EAC7B,EAAE,MAAM,KAAoB,EAAE,EACf,EAAE;IACjB,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;QAC1D,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;AACH,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAS,EAA8B,EAAE,IAAS,EAAE,QAAqB,EAAO,EAAE,CACxG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AAE3C;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAC5B,EAA4C,EAC5C,IAAS,EACT,QAA6B,EAC7B,EAAE,MAAM,KAAoB,EAAE,EAChB,EAAE;IAChB,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;QAC1D,GAAG,GAAG,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAmB,QAAqB,EAAE,YAAgB,EAAS,EAAE;IAC5F,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IAC3D,OAAO,IAAI,CAAC,CAAC,CAAE,YAAkB,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5C,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAC7B,QAA0B,EAC1B,YAAgB,EAChB,EAAE,MAAM,KAAoB,EAAE,EACd,EAAE;IAClB,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,YAAiB,CAAC;IAC3B,CAAC;IACD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IACtE,OAAO,IAAI,CAAC,CAAC,CAAE,YAAkB,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5C,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAmB,QAAqB,EAAE,YAAgB,EAAS,EAAE;IAC3F,IAAI,MAAM,GAAU,YAAiB,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAC5B,QAA6B,EAC7B,YAAgB,EAChB,EAAE,MAAM,KAAoB,EAAE,EACd,EAAE;IAClB,IAAI,MAAM,GAAU,YAAiB,CAAC;IACtC,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;QAC1D,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAmB,QAAqB,EAAE,CAAS,EAAE,YAAgB,EAAS,EAAE;IACrG,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,YAAiB,CAAC;AAC3B,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,QAA0B,EAC1B,CAAS,EACT,YAAgB,EAChB,EAAE,MAAM,KAAoB,EAAE,EACd,EAAE;IAClB,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,WAAW,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAqB,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACrG,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,YAAiB,CAAC;AAC3B,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAI,QAAqB,EAAE,YAAkC,GAAG,EAAE,CAAC,IAAI,EAAU,EAAE;IAC7G,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,SAAS,CAAC,IAAI,CAAC;YAAE,KAAK,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,QAA6B,EAC7B,YAAgD,GAAG,EAAE,CAAC,IAAI,EAC1D,EAAE,MAAM,KAAoB,EAAE,EACb,EAAE;IACnB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;QAC1D,IAAI,MAAM,SAAS,CAAC,IAAI,CAAC;YAAE,KAAK,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,QAAqB,EACrB,QAA8B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EACtC,YAAgB,EACT,EAAE;IACT,IAAI,IAAmB,EAAE,OAAgB,CAAC;IAC1C,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,QAAQ,CAAC,GAAG,CAAC;YAAE,MAAM,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,KAAK,IAAK,GAAc,GAAI,OAAkB,EAAE,CAAC;YACpD,IAAI,GAAG,IAAI,CAAC;YACZ,OAAO,GAAG,GAAG,CAAC;YACd,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;IACH,CAAC;IACD,IAAI,MAAM;QAAE,OAAO,GAAuB,CAAC;IAC3C,OAAO,KAAK,CAAC,CAAC,CAAE,IAAU,CAAC,CAAC,CAAE,YAAkB,CAAC;AACnD,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,QAA6B,EAC7B,QAA8B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EACtC,YAAgB,EAChB,EAAE,MAAM,KAAoB,EAAE,EACd,EAAE;IAClB,IAAI,IAAmB,EAAE,OAAgB,CAAC;IAC1C,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;QAC1D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,QAAQ,CAAC,GAAG,CAAC;YAAE,MAAM,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,KAAK,IAAK,GAAc,GAAI,OAAkB,EAAE,CAAC;YACpD,IAAI,GAAG,IAAI,CAAC;YACZ,OAAO,GAAG,GAAG,CAAC;YACd,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;IACH,CAAC;IACD,IAAI,MAAM;QAAE,OAAO,GAAuB,CAAC;IAC3C,OAAO,KAAK,CAAC,CAAC,CAAE,IAAU,CAAC,CAAC,CAAE,YAAkB,CAAC;AACnD,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,QAAqB,EACrB,QAA8B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EACtC,YAAgB,EACT,EAAE;IACT,IAAI,IAAmB,EAAE,OAAgB,CAAC;IAC1C,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,QAAQ,CAAC,GAAG,CAAC;YAAE,MAAM,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,KAAK,IAAK,GAAc,GAAI,OAAkB,EAAE,CAAC;YACpD,IAAI,GAAG,IAAI,CAAC;YACZ,OAAO,GAAG,GAAG,CAAC;YACd,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;IACH,CAAC;IACD,IAAI,MAAM;QAAE,OAAO,GAAuB,CAAC;IAC3C,OAAO,KAAK,CAAC,CAAC,CAAE,IAAU,CAAC,CAAC,CAAE,YAAkB,CAAC;AACnD,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,QAA6B,EAC7B,QAA8B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EACtC,YAAgB,EAChB,EAAE,MAAM,KAAoB,EAAE,EACd,EAAE;IAClB,IAAI,IAAmB,EAAE,OAAgB,CAAC;IAC1C,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;QAC1D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,QAAQ,CAAC,GAAG,CAAC;YAAE,MAAM,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,KAAK,IAAK,GAAc,GAAI,OAAkB,EAAE,CAAC;YACpD,IAAI,GAAG,IAAI,CAAC;YACZ,OAAO,GAAG,GAAG,CAAC;YACd,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;IACH,CAAC;IACD,IAAI,MAAM;QAAE,OAAO,GAAuB,CAAC;IAC3C,OAAO,KAAK,CAAC,CAAC,CAAE,IAAU,CAAC,CAAC,CAAE,YAAkB,CAAC;AACnD,CAAC,CAAC"}
|
package/dist/count.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|
package/dist/exhaust.js
ADDED
|
@@ -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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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
|