spliterator 5.0.0 → 6.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 (58) hide show
  1. package/README.md +56 -0
  2. package/out/index.d.ts +7 -1
  3. package/out/index.d.ts.map +1 -1
  4. package/out/index.js +7 -1
  5. package/out/index.js.map +1 -1
  6. package/out/lib/AsyncSequence.d.ts +180 -0
  7. package/out/lib/AsyncSequence.d.ts.map +1 -0
  8. package/out/lib/AsyncSequence.js +432 -0
  9. package/out/lib/AsyncSequence.js.map +1 -0
  10. package/out/lib/CSVSpliterator.d.ts +6 -5
  11. package/out/lib/CSVSpliterator.d.ts.map +1 -1
  12. package/out/lib/CSVSpliterator.js +46 -37
  13. package/out/lib/CSVSpliterator.js.map +1 -1
  14. package/out/lib/JSONSpliterator.d.ts +20 -9
  15. package/out/lib/JSONSpliterator.d.ts.map +1 -1
  16. package/out/lib/JSONSpliterator.js +25 -17
  17. package/out/lib/JSONSpliterator.js.map +1 -1
  18. package/out/lib/TextSpliterator.d.ts +4 -2
  19. package/out/lib/TextSpliterator.d.ts.map +1 -1
  20. package/out/lib/TextSpliterator.js +8 -9
  21. package/out/lib/TextSpliterator.js.map +1 -1
  22. package/out/lib/adaptive-source.d.ts +39 -0
  23. package/out/lib/adaptive-source.d.ts.map +1 -0
  24. package/out/lib/adaptive-source.js +95 -0
  25. package/out/lib/adaptive-source.js.map +1 -0
  26. package/out/lib/chunks.d.ts +20 -0
  27. package/out/lib/chunks.d.ts.map +1 -0
  28. package/out/lib/chunks.js +36 -0
  29. package/out/lib/chunks.js.map +1 -0
  30. package/out/lib/parallel-map-workers.d.ts +57 -0
  31. package/out/lib/parallel-map-workers.d.ts.map +1 -0
  32. package/out/lib/parallel-map-workers.js +82 -0
  33. package/out/lib/parallel-map-workers.js.map +1 -0
  34. package/out/lib/parallel-map.d.ts +17 -42
  35. package/out/lib/parallel-map.d.ts.map +1 -1
  36. package/out/lib/parallel-map.js +18 -66
  37. package/out/lib/parallel-map.js.map +1 -1
  38. package/out/lib/pivot.d.ts +30 -0
  39. package/out/lib/pivot.d.ts.map +1 -0
  40. package/out/lib/pivot.js +47 -0
  41. package/out/lib/pivot.js.map +1 -0
  42. package/out/lib/shared.d.ts +0 -27
  43. package/out/lib/shared.d.ts.map +1 -1
  44. package/out/lib/shared.js +0 -53
  45. package/out/lib/shared.js.map +1 -1
  46. package/out/lib/take.d.ts +16 -0
  47. package/out/lib/take.d.ts.map +1 -1
  48. package/out/lib/take.js +28 -0
  49. package/out/lib/take.js.map +1 -1
  50. package/out/lib/utils.d.ts +37 -0
  51. package/out/lib/utils.d.ts.map +1 -0
  52. package/out/lib/utils.js +39 -0
  53. package/out/lib/utils.js.map +1 -0
  54. package/out/lib/zip.d.ts +33 -0
  55. package/out/lib/zip.d.ts.map +1 -0
  56. package/out/lib/zip.js +59 -0
  57. package/out/lib/zip.js.map +1 -0
  58. package/package.json +6 -6
@@ -0,0 +1,432 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license MIT
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { ReadableStream } from "stream/web";
7
+ const OP_MAP = 0;
8
+ const OP_FILTER = 1;
9
+ const OP_TAKE = 2;
10
+ const OP_DROP = 3;
11
+ function isThenable(value) {
12
+ return value !== null && typeof value === "object" && typeof value.then === "function";
13
+ }
14
+ function toAsyncIterator(source) {
15
+ if (Symbol.asyncIterator in source)
16
+ return source[Symbol.asyncIterator]();
17
+ const iterator = source[Symbol.iterator]();
18
+ return {
19
+ next: async () => iterator.next(),
20
+ return: async (value) => iterator.return?.(value) ?? { value: undefined, done: true },
21
+ };
22
+ }
23
+ async function* flattenValues(source, fn) {
24
+ let counter = 0;
25
+ for await (const value of source) {
26
+ const mapped = fn(value, counter++);
27
+ const inner = isThenable(mapped) ? await mapped : mapped;
28
+ if (inner === null || typeof inner !== "object") {
29
+ throw new TypeError(`flatMap callback must return an iterable, received ${typeof inner}`);
30
+ }
31
+ yield* inner;
32
+ }
33
+ }
34
+ async function* batchValues(source, size) {
35
+ let batch = [];
36
+ for await (const value of source) {
37
+ batch.push(value);
38
+ if (batch.length === size) {
39
+ yield batch;
40
+ batch = [];
41
+ }
42
+ }
43
+ if (batch.length) {
44
+ yield batch;
45
+ }
46
+ }
47
+ async function* mapValuesConcurrently(source, fn, limit, signal) {
48
+ const upstream = source[Symbol.asyncIterator]();
49
+ // Slots key this map, not items: a source may repeat a value (a list of file paths routinely does), and two `===`
50
+ // equal keys would collapse into one entry, losing a result and deleting the wrong dispatch.
51
+ const inflight = new Map();
52
+ let slot = 0;
53
+ let exhausted = false;
54
+ try {
55
+ for (;;) {
56
+ if (signal?.aborted)
57
+ break;
58
+ while (!exhausted && inflight.size < limit) {
59
+ const result = await upstream.next();
60
+ if (result.done) {
61
+ exhausted = true;
62
+ break;
63
+ }
64
+ const current = slot++;
65
+ const produced = fn(result.value, current);
66
+ inflight.set(current, Promise.resolve(produced).then((value) => ({ slot: current, value })));
67
+ }
68
+ if (!inflight.size)
69
+ break;
70
+ const { slot: settled, value } = await Promise.race(inflight.values());
71
+ inflight.delete(settled);
72
+ yield value;
73
+ }
74
+ }
75
+ finally {
76
+ await upstream.return?.();
77
+ // Settle whatever is still running so an abandoned rejection is never unobserved.
78
+ await Promise.allSettled(inflight.values());
79
+ }
80
+ }
81
+ /**
82
+ * A lazy, chainable async iterator.
83
+ *
84
+ * The core methods (`map`, `filter`, `take`, `drop`, `flatMap`, `reduce`, `toArray`, `forEach`, `some`, `every`,
85
+ * `find`) match the [async iterator helpers proposal][proposal] in name, arity, and semantics — including the `counter`
86
+ * second argument handed to every callback. Callbacks may return promises. Code written against this keeps working
87
+ * verbatim if the proposal ever ships natively.
88
+ *
89
+ * [proposal]: https://github.com/tc39/proposal-async-iterator-helpers
90
+ *
91
+ * **Chain depth is nearly free.** A chain is an op list plus a source, not nested generators, so one async boundary is
92
+ * paid per item no matter how many operators you stack; only the op loop grows. Measured on Node 26 over 2M items:
93
+ * ~5.4M items/s at three operators and ~4.9M/s at six, against ~2.3M/s for the equivalent nested-generator
94
+ * implementation, where each operator adds a microtask hop. Doubling the operator count costs ~10% here and would cost
95
+ * ~2× there. Only {@linkcode flatMap}, {@linkcode chunks}, and {@linkcode parallelMap} break fusion, because they need
96
+ * inner-iterator state.
97
+ *
98
+ * Callback results are awaited **only when thenable**, so synchronous callbacks — the common case — cost no microtask
99
+ * hop at all.
100
+ *
101
+ * **When not to reach for this.** Wrapping costs ~1.9× a bare async generator (~10.3M/s), one extra async frame per
102
+ * item. On parsed rows (`JSON.parse` at ~1–3µs) that is 3–8%, invisible. On raw {@linkcode Uint8Array} ranges with no
103
+ * per-row parse it is most of the cost — iterate the {@linkcode AsyncSpliterator} directly there.
104
+ *
105
+ * Single-shot, like the iterators the proposal specifies: iterating consumes the source.
106
+ */
107
+ export class AsyncSequence {
108
+ #source;
109
+ #ops;
110
+ /**
111
+ * Indices of `take` ops, precomputed so the exhaustion pre-check costs nothing when there are none.
112
+ */
113
+ #takeIndices;
114
+ #upstream = null;
115
+ #syncUpstream = null;
116
+ #counters = null;
117
+ #budgets = null;
118
+ #done = false;
119
+ constructor(source, ops = []) {
120
+ this.#source = source;
121
+ this.#ops = ops;
122
+ const takeIndices = [];
123
+ for (let i = 0; i < ops.length; i++) {
124
+ if (ops[i].kind === OP_TAKE) {
125
+ takeIndices.push(i);
126
+ }
127
+ }
128
+ this.#takeIndices = takeIndices;
129
+ }
130
+ /**
131
+ * Wrap any iterable or async iterable as a chainable sequence.
132
+ */
133
+ static from(source) {
134
+ return source instanceof AsyncSequence ? source : new AsyncSequence(source);
135
+ }
136
+ /**
137
+ * Resolve the source once, keeping a synchronous iterator as such.
138
+ *
139
+ * Adapting a sync iterator to the async protocol would allocate a promise per pulled value for an iterator that never
140
+ * needs one, which is most of the cost of parsing an in-memory source: 0.733ms against a 0.540ms floor over a 68KB
141
+ * file.
142
+ */
143
+ async #openUpstream() {
144
+ if (this.#upstream)
145
+ return this.#upstream;
146
+ if (this.#syncUpstream)
147
+ return this.#syncUpstream;
148
+ const source = this.#source;
149
+ const resolved = typeof source === "function" ? await source() : source;
150
+ if (!(Symbol.asyncIterator in resolved)) {
151
+ this.#syncUpstream = resolved[Symbol.iterator]();
152
+ return this.#syncUpstream;
153
+ }
154
+ this.#upstream = toAsyncIterator(resolved);
155
+ return this.#upstream;
156
+ }
157
+ #derive(op) {
158
+ return new AsyncSequence(this.#source, [...this.#ops, op]);
159
+ }
160
+ //#region Spec-compatible core — lazy
161
+ /**
162
+ * Transform each value. The callback receives `(value, counter)` and may return a promise.
163
+ */
164
+ map(fn) {
165
+ return this.#derive({ kind: OP_MAP, fn });
166
+ }
167
+ /**
168
+ * Keep values for which the callback is truthy. The callback receives `(value, counter)` and may return a promise.
169
+ */
170
+ filter(fn) {
171
+ return this.#derive({ kind: OP_FILTER, fn });
172
+ }
173
+ /**
174
+ * Yield at most `limit` values, then close the underlying iterator.
175
+ *
176
+ * The close is what makes this safe on a file-backed source — `take(5)` over a 40GB file releases the handle rather
177
+ * than leaving it open until GC.
178
+ */
179
+ take(limit) {
180
+ const normalized = Math.trunc(limit);
181
+ if (!Number.isFinite(normalized) || normalized < 0) {
182
+ throw new RangeError(`take(${limit}): limit must be a non-negative finite number`);
183
+ }
184
+ return this.#derive({ kind: OP_TAKE, limit: normalized });
185
+ }
186
+ /**
187
+ * Skip the first `limit` values.
188
+ */
189
+ drop(limit) {
190
+ const normalized = Math.trunc(limit);
191
+ if (!Number.isFinite(normalized) || normalized < 0) {
192
+ throw new RangeError(`drop(${limit}): limit must be a non-negative finite number`);
193
+ }
194
+ return this.#derive({ kind: OP_DROP, limit: normalized });
195
+ }
196
+ /**
197
+ * Map each value to an iterable and flatten one level.
198
+ *
199
+ * **Fusion barrier.** Unlike the other operators this needs inner-iterator state, so it starts a fresh fused segment
200
+ * rather than joining the current op list. Stacking `flatMap` costs one async boundary each; stacking
201
+ * `map`/`filter`/`take`/`drop` costs nothing.
202
+ */
203
+ flatMap(fn) {
204
+ return new AsyncSequence(flattenValues(this, fn));
205
+ }
206
+ //#endregion
207
+ //#region Spec-compatible core — terminal
208
+ /**
209
+ * Collect every remaining value into an array.
210
+ *
211
+ * **Reads the whole source into memory.** On a sequence backed by a file this defeats the point of streaming — filter
212
+ * and map first so only what you keep is materialized.
213
+ */
214
+ async toArray() {
215
+ const values = [];
216
+ for await (const value of this) {
217
+ values.push(value);
218
+ }
219
+ return values;
220
+ }
221
+ /**
222
+ * Invoke the callback for each value, for side effects.
223
+ */
224
+ async forEach(fn) {
225
+ let counter = 0;
226
+ for await (const value of this) {
227
+ const result = fn(value, counter++);
228
+ if (isThenable(result)) {
229
+ await result;
230
+ }
231
+ }
232
+ }
233
+ async reduce(fn, ...rest) {
234
+ let accumulator = rest[0];
235
+ let seeded = rest.length > 0;
236
+ let counter = 0;
237
+ for await (const value of this) {
238
+ if (!seeded) {
239
+ accumulator = value;
240
+ seeded = true;
241
+ counter++;
242
+ continue;
243
+ }
244
+ const next = fn(accumulator, value, counter++);
245
+ accumulator = isThenable(next) ? await next : next;
246
+ }
247
+ if (!seeded)
248
+ throw new TypeError("reduce of empty sequence with no initial value");
249
+ return accumulator;
250
+ }
251
+ /**
252
+ * Whether any value satisfies the callback. Short-circuits and closes the underlying iterator.
253
+ */
254
+ async some(fn) {
255
+ let counter = 0;
256
+ for await (const value of this) {
257
+ const result = fn(value, counter++);
258
+ if (isThenable(result) ? await result : result)
259
+ return true;
260
+ }
261
+ return false;
262
+ }
263
+ /**
264
+ * Whether every value satisfies the callback. Short-circuits and closes the underlying iterator.
265
+ */
266
+ async every(fn) {
267
+ let counter = 0;
268
+ for await (const value of this) {
269
+ const result = fn(value, counter++);
270
+ if (!(isThenable(result) ? await result : result))
271
+ return false;
272
+ }
273
+ return true;
274
+ }
275
+ /**
276
+ * The first value satisfying the callback, or `undefined`. Short-circuits and closes the underlying iterator.
277
+ */
278
+ async find(fn) {
279
+ let counter = 0;
280
+ for await (const value of this) {
281
+ const result = fn(value, counter++);
282
+ if (isThenable(result) ? await result : result)
283
+ return value;
284
+ }
285
+ return undefined;
286
+ }
287
+ //#endregion
288
+ //#region Extras — deliberately not spec surface
289
+ /**
290
+ * Group values into arrays of `size`, with a shorter final batch if the sequence does not divide evenly.
291
+ *
292
+ * Distinct from {@linkcode take}, which yields the first `size` _values_. Named for the [iterator chunking
293
+ * proposal](https://github.com/tc39/proposal-iterator-chunking).
294
+ *
295
+ * **Fusion barrier**, like {@linkcode flatMap}.
296
+ */
297
+ chunks(size) {
298
+ const normalized = Math.trunc(size);
299
+ if (!Number.isFinite(normalized) || normalized < 1) {
300
+ throw new RangeError(`chunks(${size}): size must be a positive finite number`);
301
+ }
302
+ return new AsyncSequence(batchValues(this, normalized));
303
+ }
304
+ /**
305
+ * Map values through a callback with up to `concurrency` calls in flight, yielding in **completion order** — not
306
+ * input order.
307
+ *
308
+ * The callback is a closure, so it runs on the caller's thread. This overlaps _latency_ (file reads, network) and
309
+ * does nothing for CPU-bound work; for that, cross a thread boundary with `parallelMapWorkers` or
310
+ * `AsyncSpliterator.asManyWorkers`, which take a module path precisely because a closure cannot.
311
+ *
312
+ * **Fusion barrier**, like {@linkcode flatMap}.
313
+ */
314
+ parallelMap(fn, { concurrency, signal }) {
315
+ return new AsyncSequence(mapValuesConcurrently(this, fn, Math.max(1, Math.trunc(concurrency)), signal));
316
+ }
317
+ /**
318
+ * Expose the sequence as a web stream, for interop with `pipeThrough`/`pipeTo` consumers.
319
+ */
320
+ toReadableStream() {
321
+ const iterator = this[Symbol.asyncIterator]();
322
+ return new ReadableStream({
323
+ pull: async (controller) => {
324
+ const { done, value } = await iterator.next();
325
+ if (done) {
326
+ controller.close();
327
+ }
328
+ else {
329
+ controller.enqueue(value);
330
+ }
331
+ },
332
+ cancel: async () => void (await iterator.return?.()),
333
+ });
334
+ }
335
+ /**
336
+ * Pipe the sequence through a transform stream.
337
+ */
338
+ pipeThrough(transform, options) {
339
+ return this.toReadableStream().pipeThrough(transform, options);
340
+ }
341
+ //#endregion
342
+ //#region Iteration
343
+ async next() {
344
+ if (this.#done)
345
+ return { value: undefined, done: true };
346
+ const ops = this.#ops;
347
+ const length = ops.length;
348
+ this.#counters ??= Array.from({ length }).fill(0);
349
+ this.#budgets ??= ops.map((op) => (op.kind === OP_TAKE || op.kind === OP_DROP ? op.limit : 0));
350
+ const counters = this.#counters;
351
+ const budgets = this.#budgets;
352
+ // A satisfied `take` must close the source WITHOUT pulling again — the whole point of `take(5)` on a huge file is
353
+ // that the sixth row is never read.
354
+ for (const index of this.#takeIndices) {
355
+ if (budgets[index] <= 0)
356
+ return this.#finish();
357
+ }
358
+ const upstream = await this.#openUpstream();
359
+ const isSync = upstream === this.#syncUpstream;
360
+ try {
361
+ outer: for (;;) {
362
+ const pulled = upstream.next();
363
+ const result = isSync ? pulled : await pulled;
364
+ if (result.done) {
365
+ this.#done = true;
366
+ return { value: undefined, done: true };
367
+ }
368
+ let value = result.value;
369
+ for (let i = 0; i < length; i++) {
370
+ const op = ops[i];
371
+ switch (op.kind) {
372
+ case OP_MAP: {
373
+ const mapped = op.fn(value, counters[i]++);
374
+ value = isThenable(mapped) ? await mapped : mapped;
375
+ break;
376
+ }
377
+ case OP_FILTER: {
378
+ const keep = op.fn(value, counters[i]++);
379
+ if (!(isThenable(keep) ? await keep : keep))
380
+ continue outer;
381
+ break;
382
+ }
383
+ case OP_DROP: {
384
+ if (budgets[i] > 0) {
385
+ budgets[i]--;
386
+ continue outer;
387
+ }
388
+ break;
389
+ }
390
+ case OP_TAKE: {
391
+ if (budgets[i] <= 0)
392
+ return this.#finish();
393
+ budgets[i]--;
394
+ break;
395
+ }
396
+ }
397
+ }
398
+ return { value: value, done: false };
399
+ }
400
+ }
401
+ catch (error) {
402
+ // A rejected `next()` does not make `for await` call `return()` — the iterator is presumed broken — so a
403
+ // throwing callback would otherwise strand the source's resources.
404
+ await this.#finish();
405
+ throw error;
406
+ }
407
+ }
408
+ /**
409
+ * Close the sequence and release the underlying source.
410
+ */
411
+ async return() {
412
+ return this.#finish();
413
+ }
414
+ async #finish() {
415
+ if (this.#done)
416
+ return { value: undefined, done: true };
417
+ this.#done = true;
418
+ // An eager source may already hold a resource that no pull ever touched, so closing has to reach it even along
419
+ // paths like `take(0)`. A thunk source that was never invoked has nothing open to release, and invoking it here
420
+ // would open a file purely to close it.
421
+ const source = this.#source;
422
+ const upstream = this.#upstream ?? this.#syncUpstream ?? (typeof source === "function" ? null : toAsyncIterator(source));
423
+ this.#upstream = null;
424
+ this.#syncUpstream = null;
425
+ await upstream?.return?.();
426
+ return { value: undefined, done: true };
427
+ }
428
+ [Symbol.asyncIterator]() {
429
+ return this;
430
+ }
431
+ }
432
+ //# sourceMappingURL=AsyncSequence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AsyncSequence.js","sourceRoot":"","sources":["../../lib/AsyncSequence.ts"],"names":[],"mappings":"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"}
@@ -3,8 +3,9 @@
3
3
  * @license MIT
4
4
  * @author Teffen Ellis, et al.
5
5
  */
6
+ import { AsyncSequence } from "./AsyncSequence.js";
6
7
  import { type CharacterSequenceInput } from "./CharacterSequence.js";
7
- import { type AsyncChunkIterator, type AsyncDataResource } from "./shared.js";
8
+ import type { AsyncChunkIterator, AsyncDataResource } from "./shared.js";
8
9
  import { type AsyncSpliteratorInit, type SpliteratorInit } from "./Spliterator.js";
9
10
  /**
10
11
  * An output mode for the CSV generator.
@@ -113,19 +114,19 @@ export declare abstract class CSVSpliterator {
113
114
  */
114
115
  static fromAsync<T extends CSVSpliteratorEmittedRecord = CSVSpliteratorEmittedRecord>(source: AsyncDataResource | AsyncChunkIterator, options?: CSVSpliteratorInit & AsyncSpliteratorInit & {
115
116
  mode: "object";
116
- }): AsyncGenerator<T>;
117
+ }): AsyncSequence<T>;
117
118
  /**
118
119
  * @yields Each row as a 3-tuple [key, value, idx].
119
120
  */
120
121
  static fromAsync<T extends RowTuple[] = RowTuple[]>(source: AsyncDataResource | AsyncChunkIterator, options?: CSVSpliteratorInit & AsyncSpliteratorInit & {
121
122
  mode: "entries";
122
- }): AsyncGenerator<T>;
123
+ }): AsyncSequence<T>;
123
124
  /**
124
125
  * @yields Each row as an array of columns.
125
126
  */
126
127
  static fromAsync<T extends string[] = string[]>(source: AsyncDataResource | AsyncChunkIterator, options?: CSVSpliteratorInit & AsyncSpliteratorInit & {
127
128
  mode?: "array";
128
- }): AsyncGenerator<T>;
129
+ }): AsyncSequence<T>;
129
130
  /**
130
131
  * Given an asychronous data source, splits the data by rows(usually by newline) and then by columns (usually by
131
132
  * comma).
@@ -135,6 +136,6 @@ export declare abstract class CSVSpliterator {
135
136
  *
136
137
  * @yields Each row, shaped according to the `mode` option.
137
138
  */
138
- static fromAsync(source: AsyncDataResource | AsyncChunkIterator, init?: CSVSpliteratorInit & AsyncSpliteratorInit): AsyncGenerator<unknown>;
139
+ static fromAsync(source: AsyncDataResource | AsyncChunkIterator, init?: CSVSpliteratorInit & AsyncSpliteratorInit): AsyncSequence<unknown>;
139
140
  }
140
141
  //# sourceMappingURL=CSVSpliterator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CSVSpliterator.d.ts","sourceRoot":"","sources":["../../lib/CSVSpliterator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CSVSpliterator.d.ts","sourceRoot":"","sources":["../../lib/CSVSpliterator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,OAAO,EAAqB,KAAK,sBAAsB,EAAc,MAAM,wBAAwB,CAAA;AACnG,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACxE,OAAO,EAAE,KAAK,oBAAoB,EAAe,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAG/F;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAA;AAE1D,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,CAAC,CAAA;AAE9D,MAAM,MAAM,mBAAmB,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;AAEnG,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,CAAC,CAAA;AAE7E,MAAM,MAAM,UAAU,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAA;AA2DrH,MAAM,MAAM,2BAA2B,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;AAE5F;;;;;;GAMG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA;AAEhF,eAAO,MAAM,sBAAsB;;gCAGjB,QAAQ,CAAC,MAAM,CAAC,kBAAiB,QAAQ,CAAC,mBAAmB,CAAC,KAAQ,QAAQ,CAAC,OAAO,CAAC,EAAE;+BAShG,QAAQ,CAAC,MAAM,CAAC,kBACV,QAAQ,CAAC,mBAAmB,CAAC,KAC1C,2BAA2B,CAAC,OAAO,CAAC;CAYqB,CAAA;AAE7D,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IAC1D;;;;;;;;;;;;;;;;OAgBG;IACH,IAAI,CAAC,EAAE,aAAa,CAAA;IAEpB;;;;OAIG;IACH,eAAe,CAAC,EAAE,sBAAsB,CAAA;IAExC;;;;;;;;;OASG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IAEvB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAEhB,YAAY,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,GAAG,oBAAoB,CAAA;CACnE;AAED;;;;;;;;;;GAUG;AACH,8BAAsB,cAAc;IACnC;;;;OAIG;IACH,OAAc,eAAe,EAAE,MAAM,CAAmB;IAExD,cAEC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,2BAA2B,GAAG,2BAA2B,EAC9E,MAAM,EAAE,sBAAsB,EAC9B,OAAO,CAAC,EAAE,kBAAkB,GAAG;QAAE,IAAI,EAAE,QAAQ,CAAA;KAAE,GAC/C,SAAS,CAAC,CAAC,CAAC,CAAA;IACf;;OAEG;IAEH,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,GAAG,QAAQ,EAAE,EAC5C,MAAM,EAAE,sBAAsB,EAC9B,OAAO,CAAC,EAAE,kBAAkB,GAAG;QAAE,IAAI,EAAE,SAAS,CAAA;KAAE,GAChD,SAAS,CAAC,CAAC,CAAC,CAAA;IACf;;;;OAIG;IACH,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,EACxC,MAAM,EAAE,sBAAsB,EAC9B,OAAO,CAAC,EAAE,kBAAkB,GAAG;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/C,SAAS,CAAC,CAAC,CAAC,CAAA;IA8Ef;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,2BAA2B,GAAG,2BAA2B,EACnF,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,EAC9C,OAAO,CAAC,EAAE,kBAAkB,GAAG,oBAAoB,GAAG;QAAE,IAAI,EAAE,QAAQ,CAAA;KAAE,GACtE,aAAa,CAAC,CAAC,CAAC,CAAA;IAEnB;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,QAAQ,EAAE,GAAG,QAAQ,EAAE,EACjD,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,EAC9C,OAAO,CAAC,EAAE,kBAAkB,GAAG,oBAAoB,GAAG;QAAE,IAAI,EAAE,SAAS,CAAA;KAAE,GACvE,aAAa,CAAC,CAAC,CAAC,CAAA;IACnB;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,EAC7C,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,EAC9C,OAAO,CAAC,EAAE,kBAAkB,GAAG,oBAAoB,GAAG;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GACtE,aAAa,CAAC,CAAC,CAAC,CAAA;IACnB;;;;;;;;OAQG;IACH,MAAM,CAAC,SAAS,CACf,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,EAC9C,IAAI,CAAC,EAAE,kBAAkB,GAAG,oBAAoB,GAC9C,aAAa,CAAC,OAAO,CAAC,CAAA;CA0FzB"}
@@ -3,10 +3,12 @@
3
3
  * @license MIT
4
4
  * @author Teffen Ellis, et al.
5
5
  */
6
+ import { openDelimitedRows } from "./adaptive-source.js";
7
+ import { AsyncSequence } from "./AsyncSequence.js";
6
8
  import { normalizeColumnNames } from "./casing.js";
7
9
  import { CharacterSequence, Delimiters } from "./CharacterSequence.js";
8
- import { zipSync } from "./shared.js";
9
10
  import { Spliterator } from "./Spliterator.js";
11
+ import { zipSync } from "./zip.js";
10
12
  const identity = (value) => value;
11
13
  const doubleQuoteSequence = new CharacterSequence('"');
12
14
  /**
@@ -154,7 +156,8 @@ export class CSVSpliterator {
154
156
  *
155
157
  * @yields Each row, shaped according to the `mode` option.
156
158
  */
157
- static async *fromAsync(source, init = {}) {
159
+ static fromAsync(source, init = {}) {
160
+ const defaultColumnDelimiter = this.ColumnDelimiter;
158
161
  const {
159
162
  // ---
160
163
  header = true, mode = "array", transformers: transformersInput = [], normalizeKeys = mode !== "array", columnDelimiter: columnDelimiterInput, enableQuoteHandling = false,
@@ -162,45 +165,51 @@ export class CSVSpliterator {
162
165
  // never carries a stray `\r` on Windows-lineage sources.
163
166
  crlf = true, take = Infinity, drop = 0, ...rowInit } = init;
164
167
  const emitter = CSVSpliteratorEmitters[mode];
165
- let transformers = [];
166
- let yieldCount = 0;
167
- const yieldLimit = take + drop;
168
- const columnDelimiter = new CharacterSequence(columnDelimiterInput ?? this.ColumnDelimiter);
168
+ const columnDelimiter = new CharacterSequence(columnDelimiterInput ?? defaultColumnDelimiter);
169
169
  const decoder = new TextDecoder();
170
- // Quote handling applies at both levels: rows must not split on newlines inside quotes,
171
- // columns must not split on quoted column delimiters.
172
- const rows = await Spliterator.from(source, { ...rowInit, crlf, enableQuoteHandling });
173
- if (header) {
174
- const result = await rows.next();
175
- if (result.done)
176
- return;
177
- const columns = splitRowColumns(result.value, columnDelimiter, decoder, enableQuoteHandling);
178
- const headers = normalizeKeys ? normalizeColumnNames(columns) : columns;
179
- // oxlint-disable-next-line unicorn/prefer-ternary
180
- if (Array.isArray(transformersInput)) {
181
- transformers = Array.from(zipSync(headers, transformersInput), ([columnName, transformer]) => [
182
- columnName,
183
- transformer ?? identity,
184
- ]);
185
- }
186
- else {
187
- transformers = headers.map((columnName) => {
188
- const transform = transformersInput[columnName] || identity;
189
- return [columnName, transform];
190
- });
191
- }
192
- }
193
- for await (const row of rows) {
194
- if (yieldCount < drop) {
195
- yieldCount++;
196
- continue;
170
+ // Populated by the header pass below before the first row op runs, since the source thunk resolves on the first
171
+ // pull and the ops only run against what it returns.
172
+ let transformers = [];
173
+ const openRows = async () => {
174
+ // Quote handling applies at both levels: rows must not split on newlines inside quotes,
175
+ // columns must not split on quoted column delimiters.
176
+ const rows = await openDelimitedRows(source, { ...rowInit, crlf, enableQuoteHandling });
177
+ if (header) {
178
+ // Both engines return `this` from their iterator method, so consuming the header row here advances the very
179
+ // cursor the row ops will go on to read — returning `rows` afterwards resumes at row two, not row one.
180
+ const iterator = Symbol.asyncIterator in rows ? rows[Symbol.asyncIterator]() : rows[Symbol.iterator]();
181
+ const result = await iterator.next();
182
+ if (result.done)
183
+ return rows;
184
+ const columns = splitRowColumns(result.value, columnDelimiter, decoder, enableQuoteHandling);
185
+ const headers = normalizeKeys ? normalizeColumnNames(columns) : columns;
186
+ // oxlint-disable-next-line unicorn/prefer-ternary
187
+ if (Array.isArray(transformersInput)) {
188
+ transformers = Array.from(zipSync(headers, transformersInput), ([columnName, transformer]) => [
189
+ columnName,
190
+ transformer ?? identity,
191
+ ]);
192
+ }
193
+ else {
194
+ transformers = headers.map((columnName) => {
195
+ const transform = transformersInput[columnName] || identity;
196
+ return [columnName, transform];
197
+ });
198
+ }
197
199
  }
198
- if (yieldCount >= yieldLimit)
199
- break;
200
+ return rows;
201
+ };
202
+ let sequence = AsyncSequence.from(openRows).map((row) => {
200
203
  const columns = splitRowColumns(row, columnDelimiter, decoder, enableQuoteHandling);
201
- yield emitter ? emitter(columns, transformers) : columns;
202
- yieldCount++;
204
+ return emitter ? emitter(columns, transformers) : columns;
205
+ });
206
+ if (drop > 0) {
207
+ sequence = sequence.drop(drop);
208
+ }
209
+ if (Number.isFinite(take)) {
210
+ sequence = sequence.take(take);
203
211
  }
212
+ return sequence;
204
213
  }
205
214
  }
206
215
  //# sourceMappingURL=CSVSpliterator.js.map