@mathscapes/iterflow 1.0.0-rc1 → 1.0.0-rc3
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/README.md +16 -3
- package/dist/index.cjs +58 -39
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -75
- package/dist/index.d.ts +7 -75
- package/dist/index.js +57 -39
- package/dist/index.js.map +1 -1
- package/package.json +2 -5
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Iterflow
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Composable streaming statistics pipelines for JavaScript. Zero dependencies.
|
|
4
4
|
|
|
5
5
|
```typescript
|
|
6
6
|
import { iter } from '@mathscapes/iterflow';
|
|
@@ -33,7 +33,7 @@ npm install @mathscapes/iterflow
|
|
|
33
33
|
|
|
34
34
|
## Why?
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
ES2025 Iterator Helpers provide lazy transforms (`map`, `filter`, `take`), but lack statistical operations. Libraries like `@stdlib/stats/incr` provide streaming accumulators, but not as composable pipeline stages. **iterflow combines both**: lazy pipelines + integrated streaming statistics for memory-efficient multi-stage statistical workflows.
|
|
37
37
|
|
|
38
38
|
## API Reference
|
|
39
39
|
|
|
@@ -59,6 +59,17 @@ Transform methods return a new `Iterflow<T>` and are lazily evaluated. No comput
|
|
|
59
59
|
- `.concat<U>(...others: Iterable<U>[]): Iterflow<T | U>` Append iterables.
|
|
60
60
|
- `.window(size: number): Iterflow<T[]>` Sliding windows.
|
|
61
61
|
- `.chunk(size: number): Iterflow<T[]>` Fixed-size chunks.
|
|
62
|
+
- `.zip<U>(other: Iterable<U>): Iterflow<[T, U]>` Combine with another iterable into tuples.
|
|
63
|
+
- `.zip<U, V>(other1: Iterable<U>, other2: Iterable<V>): Iterflow<[T, U, V]>` Combine with two iterables.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
### Streaming Transform Methods
|
|
68
|
+
|
|
69
|
+
Streaming methods are transforms that yield intermediate statistical values at each step. Work only on `Iterflow<number>`.
|
|
70
|
+
|
|
71
|
+
- `.streamingMean(): Iterflow<number>` Yield running mean at each step.
|
|
72
|
+
- `.streamingVariance(): Iterflow<number>` Yield running variance at each step (Welford's algorithm).
|
|
62
73
|
|
|
63
74
|
---
|
|
64
75
|
|
|
@@ -88,13 +99,14 @@ Statistical methods only work on `Iterflow<number>` and throw `EmptySequenceErro
|
|
|
88
99
|
- `.min(): number` Minimum.
|
|
89
100
|
- `.max(): number` Maximum.
|
|
90
101
|
- `.variance(): number` Population variance.
|
|
102
|
+
- `.stdDev(): number` Standard deviation (square root of variance).
|
|
91
103
|
|
|
92
104
|
---
|
|
93
105
|
|
|
94
106
|
### Standalone Functions
|
|
95
107
|
|
|
96
108
|
```typescript
|
|
97
|
-
import { sum, mean, median, min, max, variance } from '@mathscapes/iterflow';
|
|
109
|
+
import { sum, mean, median, min, max, variance, stdDev } from '@mathscapes/iterflow';
|
|
98
110
|
```
|
|
99
111
|
|
|
100
112
|
- `sum(src: Iterable<number>): number`
|
|
@@ -103,6 +115,7 @@ import { sum, mean, median, min, max, variance } from '@mathscapes/iterflow';
|
|
|
103
115
|
- `min(src: Iterable<number>): number`
|
|
104
116
|
- `max(src: Iterable<number>): number`
|
|
105
117
|
- `variance(src: Iterable<number>): number`
|
|
118
|
+
- `stdDev(src: Iterable<number>): number`
|
|
106
119
|
|
|
107
120
|
---
|
|
108
121
|
|
package/dist/index.cjs
CHANGED
|
@@ -29,6 +29,7 @@ __export(index_exports, {
|
|
|
29
29
|
mean: () => mean,
|
|
30
30
|
median: () => median,
|
|
31
31
|
min: () => min,
|
|
32
|
+
stdDev: () => stdDev,
|
|
32
33
|
sum: () => sum,
|
|
33
34
|
variance: () => variance
|
|
34
35
|
});
|
|
@@ -194,6 +195,42 @@ function concat(src, ...others) {
|
|
|
194
195
|
for (const o of others) yield* o;
|
|
195
196
|
});
|
|
196
197
|
}
|
|
198
|
+
function zip(src, ...others) {
|
|
199
|
+
return makeTransform(src, function* (s) {
|
|
200
|
+
const iterators = [s[Symbol.iterator](), ...others.map((o) => o[Symbol.iterator]())];
|
|
201
|
+
while (true) {
|
|
202
|
+
const results = iterators.map((it) => it.next());
|
|
203
|
+
if (results.some((r) => r.done)) break;
|
|
204
|
+
yield results.map((r) => r.value);
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
function streamingMean(src) {
|
|
209
|
+
return makeTransform(src, function* (s) {
|
|
210
|
+
let count2 = 0;
|
|
211
|
+
let mean2 = 0;
|
|
212
|
+
for (const x of s) {
|
|
213
|
+
count2++;
|
|
214
|
+
mean2 += (x - mean2) / count2;
|
|
215
|
+
yield mean2;
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
function streamingVariance(src) {
|
|
220
|
+
return makeTransform(src, function* (s) {
|
|
221
|
+
let count2 = 0;
|
|
222
|
+
let mean2 = 0;
|
|
223
|
+
let M2 = 0;
|
|
224
|
+
for (const x of s) {
|
|
225
|
+
count2++;
|
|
226
|
+
const delta = x - mean2;
|
|
227
|
+
mean2 += delta / count2;
|
|
228
|
+
const delta2 = x - mean2;
|
|
229
|
+
M2 += delta * delta2;
|
|
230
|
+
yield M2 / count2;
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
}
|
|
197
234
|
|
|
198
235
|
// src/terminals.ts
|
|
199
236
|
function toArray(src) {
|
|
@@ -285,8 +322,10 @@ function quickselect(arr, k) {
|
|
|
285
322
|
return arr[left];
|
|
286
323
|
}
|
|
287
324
|
var median = (src) => {
|
|
288
|
-
const
|
|
289
|
-
assertNonEmpty(
|
|
325
|
+
const original = Array.from(src);
|
|
326
|
+
assertNonEmpty(original.length, "median");
|
|
327
|
+
const arr = original.filter((x) => !Number.isNaN(x));
|
|
328
|
+
if (arr.length === 0) return NaN;
|
|
290
329
|
const mid = arr.length >> 1;
|
|
291
330
|
if (arr.length % 2) {
|
|
292
331
|
return quickselect(arr, mid);
|
|
@@ -328,6 +367,7 @@ var variance = (src) => {
|
|
|
328
367
|
assertNonEmpty(count2, "variance");
|
|
329
368
|
return M2 / count2;
|
|
330
369
|
};
|
|
370
|
+
var stdDev = (src) => Math.sqrt(variance(src));
|
|
331
371
|
|
|
332
372
|
// src/index.ts
|
|
333
373
|
var Iterflow = class _Iterflow {
|
|
@@ -362,30 +402,30 @@ var Iterflow = class _Iterflow {
|
|
|
362
402
|
distinct() {
|
|
363
403
|
return new _Iterflow(distinct(this.src));
|
|
364
404
|
}
|
|
365
|
-
/**
|
|
366
|
-
* Yield [index, value] pairs.
|
|
367
|
-
*/
|
|
368
405
|
enumerate() {
|
|
369
406
|
return new _Iterflow(enumerate(this.src));
|
|
370
407
|
}
|
|
371
|
-
/**
|
|
372
|
-
* Append additional iterables to the sequence.
|
|
373
|
-
*/
|
|
374
408
|
concat(...others) {
|
|
375
409
|
return new _Iterflow(concat(this.src, ...others));
|
|
376
410
|
}
|
|
377
|
-
/**
|
|
378
|
-
* Create sliding windows of the specified size.
|
|
379
|
-
*/
|
|
380
411
|
window(size) {
|
|
381
412
|
return new _Iterflow(window(this.src, size));
|
|
382
413
|
}
|
|
383
|
-
/**
|
|
384
|
-
* Split the sequence into fixed-size chunks.
|
|
385
|
-
*/
|
|
386
414
|
chunk(size) {
|
|
387
415
|
return new _Iterflow(chunk(this.src, size));
|
|
388
416
|
}
|
|
417
|
+
zip(other, other2) {
|
|
418
|
+
if (other2 !== void 0) {
|
|
419
|
+
return new _Iterflow(zip(this.src, other, other2));
|
|
420
|
+
}
|
|
421
|
+
return new _Iterflow(zip(this.src, other));
|
|
422
|
+
}
|
|
423
|
+
streamingMean() {
|
|
424
|
+
return new _Iterflow(streamingMean(this.src));
|
|
425
|
+
}
|
|
426
|
+
streamingVariance() {
|
|
427
|
+
return new _Iterflow(streamingVariance(this.src));
|
|
428
|
+
}
|
|
389
429
|
// Terminals
|
|
390
430
|
toArray() {
|
|
391
431
|
return toArray(this.src);
|
|
@@ -414,49 +454,27 @@ var Iterflow = class _Iterflow {
|
|
|
414
454
|
every(fn) {
|
|
415
455
|
return every(this.src, fn);
|
|
416
456
|
}
|
|
417
|
-
// Stats (numbers only)
|
|
418
|
-
/**
|
|
419
|
-
* Calculate the sum of all numbers.
|
|
420
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
421
|
-
*/
|
|
422
457
|
sum() {
|
|
423
458
|
return sum(this.src);
|
|
424
459
|
}
|
|
425
|
-
/**
|
|
426
|
-
* Calculate the arithmetic mean.
|
|
427
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
428
|
-
*/
|
|
429
460
|
mean() {
|
|
430
461
|
return mean(this.src);
|
|
431
462
|
}
|
|
432
|
-
/**
|
|
433
|
-
* Calculate the median (50th percentile).
|
|
434
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
435
|
-
*/
|
|
436
463
|
median() {
|
|
437
464
|
return median(this.src);
|
|
438
465
|
}
|
|
439
|
-
/**
|
|
440
|
-
* Find the minimum value.
|
|
441
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
442
|
-
*/
|
|
443
466
|
min() {
|
|
444
467
|
return min(this.src);
|
|
445
468
|
}
|
|
446
|
-
/**
|
|
447
|
-
* Find the maximum value.
|
|
448
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
449
|
-
*/
|
|
450
469
|
max() {
|
|
451
470
|
return max(this.src);
|
|
452
471
|
}
|
|
453
|
-
/**
|
|
454
|
-
* Calculate the population variance.
|
|
455
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
456
|
-
*/
|
|
457
472
|
variance() {
|
|
458
473
|
return variance(this.src);
|
|
459
474
|
}
|
|
475
|
+
stdDev() {
|
|
476
|
+
return stdDev(this.src);
|
|
477
|
+
}
|
|
460
478
|
};
|
|
461
479
|
function iter(src) {
|
|
462
480
|
return new Iterflow(src);
|
|
@@ -472,6 +490,7 @@ function iter(src) {
|
|
|
472
490
|
mean,
|
|
473
491
|
median,
|
|
474
492
|
min,
|
|
493
|
+
stdDev,
|
|
475
494
|
sum,
|
|
476
495
|
variance
|
|
477
496
|
});
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/core.ts","../src/internal.ts","../src/transforms.ts","../src/terminals.ts"],"sourcesContent":["/**\n * iterflow - Lazy iterators with statistics and windowing\n * @packageDocumentation\n */\n\nimport type { Predicate, Mapper, Reducer, FlatMapper } from './core.js';\nimport * as transforms from './transforms.js';\nimport * as terminals from './terminals.js';\n\n// Iterflow class\nexport class Iterflow<T> implements Iterable<T> {\n constructor(private readonly src: Iterable<T>) {}\n\n [Symbol.iterator](): Iterator<T> {\n return this.src[Symbol.iterator]();\n }\n\n // Transforms\n map<U>(fn: Mapper<T, U>): Iterflow<U> {\n return new Iterflow(transforms.map(this.src, fn));\n }\n\n filter(fn: Predicate<T>): Iterflow<T> {\n return new Iterflow(transforms.filter(this.src, fn));\n }\n\n flatMap<U>(fn: FlatMapper<T, U>): Iterflow<U> {\n return new Iterflow(transforms.flatMap(this.src, fn));\n }\n\n take(n: number): Iterflow<T> {\n return new Iterflow(transforms.take(this.src, n));\n }\n\n drop(n: number): Iterflow<T> {\n return new Iterflow(transforms.drop(this.src, n));\n }\n\n takeWhile(fn: Predicate<T>): Iterflow<T> {\n return new Iterflow(transforms.takeWhile(this.src, fn));\n }\n\n dropWhile(fn: Predicate<T>): Iterflow<T> {\n return new Iterflow(transforms.dropWhile(this.src, fn));\n }\n\n distinct(): Iterflow<T> {\n return new Iterflow(transforms.distinct(this.src));\n }\n\n /**\n * Yield [index, value] pairs.\n */\n enumerate(): Iterflow<[number, T]> {\n return new Iterflow(transforms.enumerate(this.src));\n }\n\n /**\n * Append additional iterables to the sequence.\n */\n concat<U>(...others: Iterable<U>[]): Iterflow<T | U> {\n return new Iterflow(transforms.concat(this.src, ...others));\n }\n\n /**\n * Create sliding windows of the specified size.\n */\n window(size: number): Iterflow<T[]> {\n return new Iterflow(transforms.window(this.src, size));\n }\n\n /**\n * Split the sequence into fixed-size chunks.\n */\n chunk(size: number): Iterflow<T[]> {\n return new Iterflow(transforms.chunk(this.src, size));\n }\n\n // Terminals\n toArray(): T[] {\n return terminals.toArray(this.src);\n }\n\n reduce<U>(fn: Reducer<T, U>, init: U): U {\n return terminals.reduce(this.src, fn, init);\n }\n\n find(fn: Predicate<T>): T | undefined {\n return terminals.find(this.src, fn);\n }\n\n forEach(fn: (v: T, i: number) => void): void {\n terminals.forEach(this.src, fn);\n }\n\n first(): T | undefined {\n return terminals.first(this.src);\n }\n\n last(): T | undefined {\n return terminals.last(this.src);\n }\n\n count(): number {\n return terminals.count(this.src);\n }\n\n some(fn: Predicate<T>): boolean {\n return terminals.some(this.src, fn);\n }\n\n every(fn: Predicate<T>): boolean {\n return terminals.every(this.src, fn);\n }\n\n // Stats (numbers only)\n /**\n * Calculate the sum of all numbers.\n * @throws {EmptySequenceError} If the sequence is empty.\n */\n sum(this: Iterflow<number>): number {\n return terminals.sum(this.src);\n }\n\n /**\n * Calculate the arithmetic mean.\n * @throws {EmptySequenceError} If the sequence is empty.\n */\n mean(this: Iterflow<number>): number {\n return terminals.mean(this.src);\n }\n\n /**\n * Calculate the median (50th percentile).\n * @throws {EmptySequenceError} If the sequence is empty.\n */\n median(this: Iterflow<number>): number {\n return terminals.median(this.src);\n }\n\n /**\n * Find the minimum value.\n * @throws {EmptySequenceError} If the sequence is empty.\n */\n min(this: Iterflow<number>): number {\n return terminals.min(this.src);\n }\n\n /**\n * Find the maximum value.\n * @throws {EmptySequenceError} If the sequence is empty.\n */\n max(this: Iterflow<number>): number {\n return terminals.max(this.src);\n }\n\n /**\n * Calculate the population variance.\n * @throws {EmptySequenceError} If the sequence is empty.\n */\n variance(this: Iterflow<number>): number {\n return terminals.variance(this.src);\n }\n}\n\n// Factory function\nexport function iter<T>(src: Iterable<T>): Iterflow<T> {\n return new Iterflow(src);\n}\n\n// Re-exports from other modules\nexport { IterflowError, EmptySequenceError, isIterable } from './core.js';\nexport type { Predicate, Mapper, Reducer, FlatMapper } from './core.js';\nexport { sum, mean, median, min, max, variance } from './terminals.js';\n","// Error classes\n/**\n * Base error class for all iterflow errors.\n */\nexport class IterflowError extends Error {\n constructor(msg: string) {\n super(msg);\n this.name = 'IterflowError';\n }\n}\n\n/**\n * Thrown by statistical methods when called on empty sequences.\n */\nexport class EmptySequenceError extends IterflowError {\n constructor(readonly op: string) {\n super(`Cannot compute ${op} of empty sequence`);\n this.name = 'EmptySequenceError';\n }\n}\n\n// Type definitions\nexport type Predicate<T> = (v: T, i: number) => boolean;\nexport type Mapper<T, U> = (v: T, i: number) => U;\nexport type Reducer<T, U> = (acc: U, v: T, i: number) => U;\nexport type FlatMapper<T, U> = (v: T, i: number) => Iterable<U>;\n\n// Utilities\n/**\n * Type guard to check if a value is iterable.\n */\nexport const isIterable = (v: unknown): v is Iterable<unknown> =>\n v != null && typeof v === 'object' && Symbol.iterator in v;\n","import { EmptySequenceError } from './core.js';\n\n// Generator factory\nexport function makeTransform<T, U>(\n src: Iterable<T>,\n generator: (src: Iterable<T>) => Generator<U>\n): Iterable<U> {\n return {\n *[Symbol.iterator]() {\n yield* generator(src);\n }\n };\n}\n\n// Iteration helpers\nexport function assertNonEmpty(count: number, op: string): void {\n if (count === 0) {\n throw new EmptySequenceError(op);\n }\n}\n\nexport function assertHasValue(has: boolean, op: string): void {\n if (!has) {\n throw new EmptySequenceError(op);\n }\n}\n\n// Validation helpers\nexport function validateInteger(n: number, param: string): void {\n if (!Number.isFinite(n)) {\n throw new RangeError(`${param} must be finite`);\n }\n if (!Number.isInteger(n)) {\n throw new TypeError(`${param} must be an integer`);\n }\n}\n\nexport function validateNonNegative(n: number, param: string): void {\n validateInteger(n, param);\n if (n < 0) {\n throw new RangeError(`${param} must be non-negative`);\n }\n}\n\nexport function validatePositive(n: number, param: string): void {\n validateInteger(n, param);\n if (n <= 0) {\n throw new RangeError(`${param} must be positive`);\n }\n}\n","import type { Predicate, Mapper, FlatMapper } from './core.js';\nimport { makeTransform, validateNonNegative, validatePositive } from './internal.js';\n\n// Mapping transforms\nexport function map<T, U>(src: Iterable<T>, fn: Mapper<T, U>): Iterable<U> {\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) yield fn(v, i++);\n });\n}\n\nexport function flatMap<T, U>(src: Iterable<T>, fn: FlatMapper<T, U>): Iterable<U> {\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) yield* fn(v, i++);\n });\n}\n\nexport function enumerate<T>(src: Iterable<T>): Iterable<[number, T]> {\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) yield [i++, v];\n });\n}\n\n// Filtering transforms\nexport function filter<T>(src: Iterable<T>, fn: Predicate<T>): Iterable<T> {\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) if (fn(v, i++)) yield v;\n });\n}\n\nexport function take<T>(src: Iterable<T>, n: number): Iterable<T> {\n validateNonNegative(n, 'Count');\n return makeTransform(src, function* (s) {\n let remaining = n;\n for (const v of s) {\n if (remaining-- <= 0) break;\n yield v;\n }\n });\n}\n\nexport function drop<T>(src: Iterable<T>, n: number): Iterable<T> {\n validateNonNegative(n, 'Count');\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) if (i++ >= n) yield v;\n });\n}\n\nexport function takeWhile<T>(src: Iterable<T>, fn: Predicate<T>): Iterable<T> {\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) {\n if (!fn(v, i++)) break;\n yield v;\n }\n });\n}\n\nexport function dropWhile<T>(src: Iterable<T>, fn: Predicate<T>): Iterable<T> {\n return makeTransform(src, function* (s) {\n let i = 0, dropping = true;\n for (const v of s) {\n if (dropping && !fn(v, i)) dropping = false;\n if (!dropping) yield v;\n i++;\n }\n });\n}\n\nexport function distinct<T>(src: Iterable<T>): Iterable<T> {\n return makeTransform(src, function* (s) {\n const seen = new Set<T>();\n for (const v of s) {\n if (!seen.has(v)) { seen.add(v); yield v; }\n }\n });\n}\n\n// Windowing transforms\nexport function window<T>(src: Iterable<T>, size: number): Iterable<T[]> {\n validatePositive(size, 'Window size');\n return makeTransform(src, function* (s) {\n const buf: T[] = [];\n for (const v of s) {\n buf.push(v);\n if (buf.length === size) { yield buf.slice(); buf.shift(); }\n }\n });\n}\n\nexport function chunk<T>(src: Iterable<T>, size: number): Iterable<T[]> {\n validatePositive(size, 'Chunk size');\n return makeTransform(src, function* (s) {\n let batch: T[] = [];\n for (const v of s) {\n batch.push(v);\n if (batch.length === size) { yield batch; batch = []; }\n }\n if (batch.length) yield batch;\n });\n}\n\n// Combining transforms\nexport function concat<T, U>(src: Iterable<T>, ...others: Iterable<U>[]): Iterable<T | U> {\n return makeTransform(src, function* (s) {\n yield* s;\n for (const o of others) yield* o;\n });\n}\n","import type { Predicate, Reducer } from './core.js';\nimport { assertNonEmpty, assertHasValue } from './internal.js';\n\n// Collection terminals\nexport function toArray<T>(src: Iterable<T>): T[] {\n return Array.from(src);\n}\n\nexport function reduce<T, U>(src: Iterable<T>, fn: Reducer<T, U>, init: U): U {\n let acc = init, i = 0;\n for (const v of src) acc = fn(acc, v, i++);\n return acc;\n}\n\nexport function find<T>(src: Iterable<T>, fn: Predicate<T>): T | undefined {\n let i = 0;\n for (const v of src) if (fn(v, i++)) return v;\n return undefined;\n}\n\nexport function forEach<T>(src: Iterable<T>, fn: (v: T, i: number) => void): void {\n let i = 0;\n for (const v of src) fn(v, i++);\n}\n\n// Testing terminals\nexport function first<T>(src: Iterable<T>): T | undefined {\n for (const v of src) return v;\n return undefined;\n}\n\nexport function last<T>(src: Iterable<T>): T | undefined {\n if (Array.isArray(src)) return src[src.length - 1];\n let last: T | undefined;\n for (const v of src) last = v;\n return last;\n}\n\nexport function count<T>(src: Iterable<T>): number {\n if (Array.isArray(src)) return src.length;\n let n = 0;\n for (const _ of src) n++;\n return n;\n}\n\nexport function some<T>(src: Iterable<T>, fn: Predicate<T>): boolean {\n let i = 0;\n for (const v of src) if (fn(v, i++)) return true;\n return false;\n}\n\nexport function every<T>(src: Iterable<T>, fn: Predicate<T>): boolean {\n let i = 0;\n for (const v of src) if (!fn(v, i++)) return false;\n return true;\n}\n\n// Statistical terminals\n/**\n * Calculate the sum of all numbers.\n * @throws {EmptySequenceError} If the sequence is empty.\n */\nexport const sum = (src: Iterable<number>): number => {\n let total = 0, count = 0;\n for (const v of src) { total += v; count++; }\n assertNonEmpty(count, 'sum');\n return total;\n};\n\n/**\n * Calculate the arithmetic mean.\n * @throws {EmptySequenceError} If the sequence is empty.\n */\nexport const mean = (src: Iterable<number>): number => {\n let total = 0, count = 0;\n for (const v of src) { total += v; count++; }\n assertNonEmpty(count, 'mean');\n return total / count;\n};\n\n/**\n * Partition array around a pivot for Quickselect.\n * @private\n */\nfunction partition(arr: number[], left: number, right: number): number {\n const pivot = arr[right]!;\n let i = left;\n for (let j = left; j < right; j++) {\n if (arr[j]! < pivot) {\n [arr[i], arr[j]] = [arr[j]!, arr[i]!];\n i++;\n }\n }\n [arr[i], arr[right]] = [arr[right]!, arr[i]!];\n return i;\n}\n\n/**\n * Find the k-th smallest element using Quickselect (Hoare's selection algorithm).\n * @private\n */\nfunction quickselect(arr: number[], k: number): number {\n let left = 0;\n let right = arr.length - 1;\n\n while (left < right) {\n const pivotIndex = partition(arr, left, right);\n if (pivotIndex === k) {\n return arr[k]!;\n } else if (pivotIndex > k) {\n right = pivotIndex - 1;\n } else {\n left = pivotIndex + 1;\n }\n }\n\n return arr[left]!;\n}\n\n/**\n * Calculate the median (50th percentile) using Quickselect algorithm.\n * @throws {EmptySequenceError} If the sequence is empty.\n */\nexport const median = (src: Iterable<number>): number => {\n const arr = Array.from(src);\n assertNonEmpty(arr.length, 'median');\n\n const mid = arr.length >> 1;\n if (arr.length % 2) {\n // Odd length: return middle element\n return quickselect(arr, mid);\n } else {\n // Even length: return average of two middle elements\n const upper = quickselect(arr, mid);\n const lower = quickselect(arr, mid - 1);\n return (lower + upper) / 2;\n }\n};\n\n/**\n * Find the minimum value.\n * @throws {EmptySequenceError} If the sequence is empty.\n */\nexport const min = (src: Iterable<number>): number => {\n let result = Infinity, has = false;\n for (const v of src) { if (v < result) result = v; has = true; }\n assertHasValue(has, 'min');\n return result;\n};\n\n/**\n * Find the maximum value.\n * @throws {EmptySequenceError} If the sequence is empty.\n */\nexport const max = (src: Iterable<number>): number => {\n let result = -Infinity, has = false;\n for (const v of src) { if (v > result) result = v; has = true; }\n assertHasValue(has, 'max');\n return result;\n};\n\n/**\n * Calculate the population variance using Welford's online algorithm.\n * @throws {EmptySequenceError} If the sequence is empty.\n */\nexport const variance = (src: Iterable<number>): number => {\n let count = 0;\n let mean = 0;\n let M2 = 0;\n\n for (const x of src) {\n count++;\n const delta = x - mean;\n mean += delta / count;\n const delta2 = x - mean;\n M2 += delta * delta2;\n }\n\n assertNonEmpty(count, 'variance');\n return M2 / count;\n};\n"],"mappings":"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","names":["count","last","count","mean"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/core.ts","../src/internal.ts","../src/transforms.ts","../src/terminals.ts"],"sourcesContent":["import type { Predicate, Mapper, Reducer, FlatMapper } from './core.js';\nimport * as transforms from './transforms.js';\nimport * as terminals from './terminals.js';\n\n// Iterflow class\nexport class Iterflow<T> implements Iterable<T> {\n constructor(private readonly src: Iterable<T>) {}\n\n [Symbol.iterator](): Iterator<T> {\n return this.src[Symbol.iterator]();\n }\n\n // Transforms\n map<U>(fn: Mapper<T, U>): Iterflow<U> {\n return new Iterflow(transforms.map(this.src, fn));\n }\n\n filter(fn: Predicate<T>): Iterflow<T> {\n return new Iterflow(transforms.filter(this.src, fn));\n }\n\n flatMap<U>(fn: FlatMapper<T, U>): Iterflow<U> {\n return new Iterflow(transforms.flatMap(this.src, fn));\n }\n\n take(n: number): Iterflow<T> {\n return new Iterflow(transforms.take(this.src, n));\n }\n\n drop(n: number): Iterflow<T> {\n return new Iterflow(transforms.drop(this.src, n));\n }\n\n takeWhile(fn: Predicate<T>): Iterflow<T> {\n return new Iterflow(transforms.takeWhile(this.src, fn));\n }\n\n dropWhile(fn: Predicate<T>): Iterflow<T> {\n return new Iterflow(transforms.dropWhile(this.src, fn));\n }\n\n distinct(): Iterflow<T> {\n return new Iterflow(transforms.distinct(this.src));\n }\n\n enumerate(): Iterflow<[number, T]> {\n return new Iterflow(transforms.enumerate(this.src));\n }\n\n concat<U>(...others: Iterable<U>[]): Iterflow<T | U> {\n return new Iterflow(transforms.concat(this.src, ...others));\n }\n\n window(size: number): Iterflow<T[]> {\n return new Iterflow(transforms.window(this.src, size));\n }\n\n chunk(size: number): Iterflow<T[]> {\n return new Iterflow(transforms.chunk(this.src, size));\n }\n\n zip<U>(other: Iterable<U>): Iterflow<[T, U]>;\n zip<U, V>(other1: Iterable<U>, other2: Iterable<V>): Iterflow<[T, U, V]>;\n zip(other: Iterable<unknown>, other2?: Iterable<unknown>): Iterflow<unknown[]> {\n if (other2 !== undefined) {\n return new Iterflow(transforms.zip(this.src, other, other2));\n }\n return new Iterflow(transforms.zip(this.src, other));\n }\n\n streamingMean(this: Iterflow<number>): Iterflow<number> {\n return new Iterflow(transforms.streamingMean(this.src));\n }\n\n streamingVariance(this: Iterflow<number>): Iterflow<number> {\n return new Iterflow(transforms.streamingVariance(this.src));\n }\n\n // Terminals\n toArray(): T[] {\n return terminals.toArray(this.src);\n }\n\n reduce<U>(fn: Reducer<T, U>, init: U): U {\n return terminals.reduce(this.src, fn, init);\n }\n\n find(fn: Predicate<T>): T | undefined {\n return terminals.find(this.src, fn);\n }\n\n forEach(fn: (v: T, i: number) => void): void {\n terminals.forEach(this.src, fn);\n }\n\n first(): T | undefined {\n return terminals.first(this.src);\n }\n\n last(): T | undefined {\n return terminals.last(this.src);\n }\n\n count(): number {\n return terminals.count(this.src);\n }\n\n some(fn: Predicate<T>): boolean {\n return terminals.some(this.src, fn);\n }\n\n every(fn: Predicate<T>): boolean {\n return terminals.every(this.src, fn);\n }\n\n sum(this: Iterflow<number>): number {\n return terminals.sum(this.src);\n }\n\n mean(this: Iterflow<number>): number {\n return terminals.mean(this.src);\n }\n\n median(this: Iterflow<number>): number {\n return terminals.median(this.src);\n }\n\n min(this: Iterflow<number>): number {\n return terminals.min(this.src);\n }\n\n max(this: Iterflow<number>): number {\n return terminals.max(this.src);\n }\n\n variance(this: Iterflow<number>): number {\n return terminals.variance(this.src);\n }\n\n stdDev(this: Iterflow<number>): number {\n return terminals.stdDev(this.src);\n }\n}\n\n// Factory function\nexport function iter<T>(src: Iterable<T>): Iterflow<T> {\n return new Iterflow(src);\n}\n\n// Re-exports from other modules\nexport { IterflowError, EmptySequenceError, isIterable } from './core.js';\nexport type { Predicate, Mapper, Reducer, FlatMapper } from './core.js';\nexport { sum, mean, median, min, max, variance, stdDev } from './terminals.js';\n","export class IterflowError extends Error {\n constructor(msg: string) {\n super(msg);\n this.name = 'IterflowError';\n }\n}\n\nexport class EmptySequenceError extends IterflowError {\n constructor(readonly op: string) {\n super(`Cannot compute ${op} of empty sequence`);\n this.name = 'EmptySequenceError';\n }\n}\n\nexport type Predicate<T> = (v: T, i: number) => boolean;\nexport type Mapper<T, U> = (v: T, i: number) => U;\nexport type Reducer<T, U> = (acc: U, v: T, i: number) => U;\nexport type FlatMapper<T, U> = (v: T, i: number) => Iterable<U>;\n\nexport const isIterable = (v: unknown): v is Iterable<unknown> =>\n v != null && typeof v === 'object' && Symbol.iterator in v;\n","import { EmptySequenceError } from './core.js';\n\n// Generator factory\nexport function makeTransform<T, U>(\n src: Iterable<T>,\n generator: (src: Iterable<T>) => Generator<U>\n): Iterable<U> {\n return {\n *[Symbol.iterator]() {\n yield* generator(src);\n }\n };\n}\n\n// Iteration helpers\nexport function assertNonEmpty(count: number, op: string): void {\n if (count === 0) {\n throw new EmptySequenceError(op);\n }\n}\n\nexport function assertHasValue(has: boolean, op: string): void {\n if (!has) {\n throw new EmptySequenceError(op);\n }\n}\n\n// Validation helpers\nexport function validateInteger(n: number, param: string): void {\n if (!Number.isFinite(n)) {\n throw new RangeError(`${param} must be finite`);\n }\n if (!Number.isInteger(n)) {\n throw new TypeError(`${param} must be an integer`);\n }\n}\n\nexport function validateNonNegative(n: number, param: string): void {\n validateInteger(n, param);\n if (n < 0) {\n throw new RangeError(`${param} must be non-negative`);\n }\n}\n\nexport function validatePositive(n: number, param: string): void {\n validateInteger(n, param);\n if (n <= 0) {\n throw new RangeError(`${param} must be positive`);\n }\n}\n","import type { Predicate, Mapper, FlatMapper } from './core.js';\nimport { makeTransform, validateNonNegative, validatePositive } from './internal.js';\n\n// Mapping transforms\nexport function map<T, U>(src: Iterable<T>, fn: Mapper<T, U>): Iterable<U> {\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) yield fn(v, i++);\n });\n}\n\nexport function flatMap<T, U>(src: Iterable<T>, fn: FlatMapper<T, U>): Iterable<U> {\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) yield* fn(v, i++);\n });\n}\n\nexport function enumerate<T>(src: Iterable<T>): Iterable<[number, T]> {\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) yield [i++, v];\n });\n}\n\n// Filtering transforms\nexport function filter<T>(src: Iterable<T>, fn: Predicate<T>): Iterable<T> {\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) if (fn(v, i++)) yield v;\n });\n}\n\nexport function take<T>(src: Iterable<T>, n: number): Iterable<T> {\n validateNonNegative(n, 'Count');\n return makeTransform(src, function* (s) {\n let remaining = n;\n for (const v of s) {\n if (remaining-- <= 0) break;\n yield v;\n }\n });\n}\n\nexport function drop<T>(src: Iterable<T>, n: number): Iterable<T> {\n validateNonNegative(n, 'Count');\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) if (i++ >= n) yield v;\n });\n}\n\nexport function takeWhile<T>(src: Iterable<T>, fn: Predicate<T>): Iterable<T> {\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) {\n if (!fn(v, i++)) break;\n yield v;\n }\n });\n}\n\nexport function dropWhile<T>(src: Iterable<T>, fn: Predicate<T>): Iterable<T> {\n return makeTransform(src, function* (s) {\n let i = 0, dropping = true;\n for (const v of s) {\n if (dropping && !fn(v, i)) dropping = false;\n if (!dropping) yield v;\n i++;\n }\n });\n}\n\nexport function distinct<T>(src: Iterable<T>): Iterable<T> {\n return makeTransform(src, function* (s) {\n const seen = new Set<T>();\n for (const v of s) {\n if (!seen.has(v)) { seen.add(v); yield v; }\n }\n });\n}\n\n// Windowing transforms\nexport function window<T>(src: Iterable<T>, size: number): Iterable<T[]> {\n validatePositive(size, 'Window size');\n return makeTransform(src, function* (s) {\n const buf: T[] = [];\n for (const v of s) {\n buf.push(v);\n if (buf.length === size) { yield buf.slice(); buf.shift(); }\n }\n });\n}\n\nexport function chunk<T>(src: Iterable<T>, size: number): Iterable<T[]> {\n validatePositive(size, 'Chunk size');\n return makeTransform(src, function* (s) {\n let batch: T[] = [];\n for (const v of s) {\n batch.push(v);\n if (batch.length === size) { yield batch; batch = []; }\n }\n if (batch.length) yield batch;\n });\n}\n\n// Combining transforms\nexport function concat<T, U>(src: Iterable<T>, ...others: Iterable<U>[]): Iterable<T | U> {\n return makeTransform(src, function* (s) {\n yield* s;\n for (const o of others) yield* o;\n });\n}\n\nexport function zip<T, U>(src: Iterable<T>, other: Iterable<U>): Iterable<[T, U]>;\nexport function zip<T, U, V>(src: Iterable<T>, other1: Iterable<U>, other2: Iterable<V>): Iterable<[T, U, V]>;\nexport function zip<T>(src: Iterable<T>, ...others: Iterable<unknown>[]): Iterable<unknown[]> {\n return makeTransform(src, function* (s) {\n const iterators = [s[Symbol.iterator](), ...others.map(o => o[Symbol.iterator]())];\n while (true) {\n const results = iterators.map(it => it.next());\n if (results.some(r => r.done)) break;\n yield results.map(r => r.value);\n }\n });\n}\n\n// Streaming statistics\nexport function streamingMean(src: Iterable<number>): Iterable<number> {\n return makeTransform(src, function* (s) {\n let count = 0;\n let mean = 0;\n for (const x of s) {\n count++;\n mean += (x - mean) / count;\n yield mean;\n }\n });\n}\n\nexport function streamingVariance(src: Iterable<number>): Iterable<number> {\n return makeTransform(src, function* (s) {\n let count = 0;\n let mean = 0;\n let M2 = 0;\n for (const x of s) {\n count++;\n const delta = x - mean;\n mean += delta / count;\n const delta2 = x - mean;\n M2 += delta * delta2;\n yield M2 / count;\n }\n });\n}\n","import type { Predicate, Reducer } from './core.js';\nimport { assertNonEmpty, assertHasValue } from './internal.js';\n\n// Collection terminals\nexport function toArray<T>(src: Iterable<T>): T[] {\n return Array.from(src);\n}\n\nexport function reduce<T, U>(src: Iterable<T>, fn: Reducer<T, U>, init: U): U {\n let acc = init, i = 0;\n for (const v of src) acc = fn(acc, v, i++);\n return acc;\n}\n\nexport function find<T>(src: Iterable<T>, fn: Predicate<T>): T | undefined {\n let i = 0;\n for (const v of src) if (fn(v, i++)) return v;\n return undefined;\n}\n\nexport function forEach<T>(src: Iterable<T>, fn: (v: T, i: number) => void): void {\n let i = 0;\n for (const v of src) fn(v, i++);\n}\n\n// Testing terminals\nexport function first<T>(src: Iterable<T>): T | undefined {\n for (const v of src) return v;\n return undefined;\n}\n\nexport function last<T>(src: Iterable<T>): T | undefined {\n if (Array.isArray(src)) return src[src.length - 1];\n let last: T | undefined;\n for (const v of src) last = v;\n return last;\n}\n\nexport function count<T>(src: Iterable<T>): number {\n if (Array.isArray(src)) return src.length;\n let n = 0;\n for (const _ of src) n++;\n return n;\n}\n\nexport function some<T>(src: Iterable<T>, fn: Predicate<T>): boolean {\n let i = 0;\n for (const v of src) if (fn(v, i++)) return true;\n return false;\n}\n\nexport function every<T>(src: Iterable<T>, fn: Predicate<T>): boolean {\n let i = 0;\n for (const v of src) if (!fn(v, i++)) return false;\n return true;\n}\n\n// Statistical terminals\nexport const sum = (src: Iterable<number>): number => {\n let total = 0, count = 0;\n for (const v of src) { total += v; count++; }\n assertNonEmpty(count, 'sum');\n return total;\n};\n\nexport const mean = (src: Iterable<number>): number => {\n let total = 0, count = 0;\n for (const v of src) { total += v; count++; }\n assertNonEmpty(count, 'mean');\n return total / count;\n};\n\nfunction partition(arr: number[], left: number, right: number): number {\n const pivot = arr[right]!;\n let i = left;\n for (let j = left; j < right; j++) {\n if (arr[j]! < pivot) {\n [arr[i], arr[j]] = [arr[j]!, arr[i]!];\n i++;\n }\n }\n [arr[i], arr[right]] = [arr[right]!, arr[i]!];\n return i;\n}\n\nfunction quickselect(arr: number[], k: number): number {\n let left = 0;\n let right = arr.length - 1;\n\n while (left < right) {\n const pivotIndex = partition(arr, left, right);\n if (pivotIndex === k) {\n return arr[k]!;\n } else if (pivotIndex > k) {\n right = pivotIndex - 1;\n } else {\n left = pivotIndex + 1;\n }\n }\n\n return arr[left]!;\n}\n\n// Quickselect median with NaN filtering\nexport const median = (src: Iterable<number>): number => {\n const original = Array.from(src);\n assertNonEmpty(original.length, 'median');\n\n const arr = original.filter(x => !Number.isNaN(x));\n if (arr.length === 0) return NaN;\n\n const mid = arr.length >> 1;\n if (arr.length % 2) {\n // Odd length: return middle element\n return quickselect(arr, mid);\n } else {\n // Even length: return average of two middle elements\n const upper = quickselect(arr, mid);\n const lower = quickselect(arr, mid - 1);\n return (lower + upper) / 2;\n }\n};\n\nexport const min = (src: Iterable<number>): number => {\n let result = Infinity, has = false;\n for (const v of src) { if (v < result) result = v; has = true; }\n assertHasValue(has, 'min');\n return result;\n};\n\nexport const max = (src: Iterable<number>): number => {\n let result = -Infinity, has = false;\n for (const v of src) { if (v > result) result = v; has = true; }\n assertHasValue(has, 'max');\n return result;\n};\n\n// Welford's online algorithm for numerical stability\nexport const variance = (src: Iterable<number>): number => {\n let count = 0;\n let mean = 0;\n let M2 = 0;\n\n for (const x of src) {\n count++;\n const delta = x - mean;\n mean += delta / count;\n const delta2 = x - mean;\n M2 += delta * delta2;\n }\n\n assertNonEmpty(count, 'variance');\n return M2 / count;\n};\n\nexport const stdDev = (src: Iterable<number>): number => Math.sqrt(variance(src));\n"],"mappings":"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","names":["count","count","mean","last","count","mean"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Base error class for all iterflow errors.
|
|
3
|
-
*/
|
|
4
1
|
declare class IterflowError extends Error {
|
|
5
2
|
constructor(msg: string);
|
|
6
3
|
}
|
|
7
|
-
/**
|
|
8
|
-
* Thrown by statistical methods when called on empty sequences.
|
|
9
|
-
*/
|
|
10
4
|
declare class EmptySequenceError extends IterflowError {
|
|
11
5
|
readonly op: string;
|
|
12
6
|
constructor(op: string);
|
|
@@ -15,46 +9,15 @@ type Predicate<T> = (v: T, i: number) => boolean;
|
|
|
15
9
|
type Mapper<T, U> = (v: T, i: number) => U;
|
|
16
10
|
type Reducer<T, U> = (acc: U, v: T, i: number) => U;
|
|
17
11
|
type FlatMapper<T, U> = (v: T, i: number) => Iterable<U>;
|
|
18
|
-
/**
|
|
19
|
-
* Type guard to check if a value is iterable.
|
|
20
|
-
*/
|
|
21
12
|
declare const isIterable: (v: unknown) => v is Iterable<unknown>;
|
|
22
13
|
|
|
23
|
-
/**
|
|
24
|
-
* Calculate the sum of all numbers.
|
|
25
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
26
|
-
*/
|
|
27
14
|
declare const sum: (src: Iterable<number>) => number;
|
|
28
|
-
/**
|
|
29
|
-
* Calculate the arithmetic mean.
|
|
30
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
31
|
-
*/
|
|
32
15
|
declare const mean: (src: Iterable<number>) => number;
|
|
33
|
-
/**
|
|
34
|
-
* Calculate the median (50th percentile) using Quickselect algorithm.
|
|
35
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
36
|
-
*/
|
|
37
16
|
declare const median: (src: Iterable<number>) => number;
|
|
38
|
-
/**
|
|
39
|
-
* Find the minimum value.
|
|
40
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
41
|
-
*/
|
|
42
17
|
declare const min: (src: Iterable<number>) => number;
|
|
43
|
-
/**
|
|
44
|
-
* Find the maximum value.
|
|
45
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
46
|
-
*/
|
|
47
18
|
declare const max: (src: Iterable<number>) => number;
|
|
48
|
-
/**
|
|
49
|
-
* Calculate the population variance using Welford's online algorithm.
|
|
50
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
51
|
-
*/
|
|
52
19
|
declare const variance: (src: Iterable<number>) => number;
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* iterflow - Lazy iterators with statistics and windowing
|
|
56
|
-
* @packageDocumentation
|
|
57
|
-
*/
|
|
20
|
+
declare const stdDev: (src: Iterable<number>) => number;
|
|
58
21
|
|
|
59
22
|
declare class Iterflow<T> implements Iterable<T> {
|
|
60
23
|
private readonly src;
|
|
@@ -68,22 +31,14 @@ declare class Iterflow<T> implements Iterable<T> {
|
|
|
68
31
|
takeWhile(fn: Predicate<T>): Iterflow<T>;
|
|
69
32
|
dropWhile(fn: Predicate<T>): Iterflow<T>;
|
|
70
33
|
distinct(): Iterflow<T>;
|
|
71
|
-
/**
|
|
72
|
-
* Yield [index, value] pairs.
|
|
73
|
-
*/
|
|
74
34
|
enumerate(): Iterflow<[number, T]>;
|
|
75
|
-
/**
|
|
76
|
-
* Append additional iterables to the sequence.
|
|
77
|
-
*/
|
|
78
35
|
concat<U>(...others: Iterable<U>[]): Iterflow<T | U>;
|
|
79
|
-
/**
|
|
80
|
-
* Create sliding windows of the specified size.
|
|
81
|
-
*/
|
|
82
36
|
window(size: number): Iterflow<T[]>;
|
|
83
|
-
/**
|
|
84
|
-
* Split the sequence into fixed-size chunks.
|
|
85
|
-
*/
|
|
86
37
|
chunk(size: number): Iterflow<T[]>;
|
|
38
|
+
zip<U>(other: Iterable<U>): Iterflow<[T, U]>;
|
|
39
|
+
zip<U, V>(other1: Iterable<U>, other2: Iterable<V>): Iterflow<[T, U, V]>;
|
|
40
|
+
streamingMean(this: Iterflow<number>): Iterflow<number>;
|
|
41
|
+
streamingVariance(this: Iterflow<number>): Iterflow<number>;
|
|
87
42
|
toArray(): T[];
|
|
88
43
|
reduce<U>(fn: Reducer<T, U>, init: U): U;
|
|
89
44
|
find(fn: Predicate<T>): T | undefined;
|
|
@@ -93,37 +48,14 @@ declare class Iterflow<T> implements Iterable<T> {
|
|
|
93
48
|
count(): number;
|
|
94
49
|
some(fn: Predicate<T>): boolean;
|
|
95
50
|
every(fn: Predicate<T>): boolean;
|
|
96
|
-
/**
|
|
97
|
-
* Calculate the sum of all numbers.
|
|
98
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
99
|
-
*/
|
|
100
51
|
sum(this: Iterflow<number>): number;
|
|
101
|
-
/**
|
|
102
|
-
* Calculate the arithmetic mean.
|
|
103
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
104
|
-
*/
|
|
105
52
|
mean(this: Iterflow<number>): number;
|
|
106
|
-
/**
|
|
107
|
-
* Calculate the median (50th percentile).
|
|
108
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
109
|
-
*/
|
|
110
53
|
median(this: Iterflow<number>): number;
|
|
111
|
-
/**
|
|
112
|
-
* Find the minimum value.
|
|
113
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
114
|
-
*/
|
|
115
54
|
min(this: Iterflow<number>): number;
|
|
116
|
-
/**
|
|
117
|
-
* Find the maximum value.
|
|
118
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
119
|
-
*/
|
|
120
55
|
max(this: Iterflow<number>): number;
|
|
121
|
-
/**
|
|
122
|
-
* Calculate the population variance.
|
|
123
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
124
|
-
*/
|
|
125
56
|
variance(this: Iterflow<number>): number;
|
|
57
|
+
stdDev(this: Iterflow<number>): number;
|
|
126
58
|
}
|
|
127
59
|
declare function iter<T>(src: Iterable<T>): Iterflow<T>;
|
|
128
60
|
|
|
129
|
-
export { EmptySequenceError, type FlatMapper, Iterflow, IterflowError, type Mapper, type Predicate, type Reducer, isIterable, iter, max, mean, median, min, sum, variance };
|
|
61
|
+
export { EmptySequenceError, type FlatMapper, Iterflow, IterflowError, type Mapper, type Predicate, type Reducer, isIterable, iter, max, mean, median, min, stdDev, sum, variance };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Base error class for all iterflow errors.
|
|
3
|
-
*/
|
|
4
1
|
declare class IterflowError extends Error {
|
|
5
2
|
constructor(msg: string);
|
|
6
3
|
}
|
|
7
|
-
/**
|
|
8
|
-
* Thrown by statistical methods when called on empty sequences.
|
|
9
|
-
*/
|
|
10
4
|
declare class EmptySequenceError extends IterflowError {
|
|
11
5
|
readonly op: string;
|
|
12
6
|
constructor(op: string);
|
|
@@ -15,46 +9,15 @@ type Predicate<T> = (v: T, i: number) => boolean;
|
|
|
15
9
|
type Mapper<T, U> = (v: T, i: number) => U;
|
|
16
10
|
type Reducer<T, U> = (acc: U, v: T, i: number) => U;
|
|
17
11
|
type FlatMapper<T, U> = (v: T, i: number) => Iterable<U>;
|
|
18
|
-
/**
|
|
19
|
-
* Type guard to check if a value is iterable.
|
|
20
|
-
*/
|
|
21
12
|
declare const isIterable: (v: unknown) => v is Iterable<unknown>;
|
|
22
13
|
|
|
23
|
-
/**
|
|
24
|
-
* Calculate the sum of all numbers.
|
|
25
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
26
|
-
*/
|
|
27
14
|
declare const sum: (src: Iterable<number>) => number;
|
|
28
|
-
/**
|
|
29
|
-
* Calculate the arithmetic mean.
|
|
30
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
31
|
-
*/
|
|
32
15
|
declare const mean: (src: Iterable<number>) => number;
|
|
33
|
-
/**
|
|
34
|
-
* Calculate the median (50th percentile) using Quickselect algorithm.
|
|
35
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
36
|
-
*/
|
|
37
16
|
declare const median: (src: Iterable<number>) => number;
|
|
38
|
-
/**
|
|
39
|
-
* Find the minimum value.
|
|
40
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
41
|
-
*/
|
|
42
17
|
declare const min: (src: Iterable<number>) => number;
|
|
43
|
-
/**
|
|
44
|
-
* Find the maximum value.
|
|
45
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
46
|
-
*/
|
|
47
18
|
declare const max: (src: Iterable<number>) => number;
|
|
48
|
-
/**
|
|
49
|
-
* Calculate the population variance using Welford's online algorithm.
|
|
50
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
51
|
-
*/
|
|
52
19
|
declare const variance: (src: Iterable<number>) => number;
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* iterflow - Lazy iterators with statistics and windowing
|
|
56
|
-
* @packageDocumentation
|
|
57
|
-
*/
|
|
20
|
+
declare const stdDev: (src: Iterable<number>) => number;
|
|
58
21
|
|
|
59
22
|
declare class Iterflow<T> implements Iterable<T> {
|
|
60
23
|
private readonly src;
|
|
@@ -68,22 +31,14 @@ declare class Iterflow<T> implements Iterable<T> {
|
|
|
68
31
|
takeWhile(fn: Predicate<T>): Iterflow<T>;
|
|
69
32
|
dropWhile(fn: Predicate<T>): Iterflow<T>;
|
|
70
33
|
distinct(): Iterflow<T>;
|
|
71
|
-
/**
|
|
72
|
-
* Yield [index, value] pairs.
|
|
73
|
-
*/
|
|
74
34
|
enumerate(): Iterflow<[number, T]>;
|
|
75
|
-
/**
|
|
76
|
-
* Append additional iterables to the sequence.
|
|
77
|
-
*/
|
|
78
35
|
concat<U>(...others: Iterable<U>[]): Iterflow<T | U>;
|
|
79
|
-
/**
|
|
80
|
-
* Create sliding windows of the specified size.
|
|
81
|
-
*/
|
|
82
36
|
window(size: number): Iterflow<T[]>;
|
|
83
|
-
/**
|
|
84
|
-
* Split the sequence into fixed-size chunks.
|
|
85
|
-
*/
|
|
86
37
|
chunk(size: number): Iterflow<T[]>;
|
|
38
|
+
zip<U>(other: Iterable<U>): Iterflow<[T, U]>;
|
|
39
|
+
zip<U, V>(other1: Iterable<U>, other2: Iterable<V>): Iterflow<[T, U, V]>;
|
|
40
|
+
streamingMean(this: Iterflow<number>): Iterflow<number>;
|
|
41
|
+
streamingVariance(this: Iterflow<number>): Iterflow<number>;
|
|
87
42
|
toArray(): T[];
|
|
88
43
|
reduce<U>(fn: Reducer<T, U>, init: U): U;
|
|
89
44
|
find(fn: Predicate<T>): T | undefined;
|
|
@@ -93,37 +48,14 @@ declare class Iterflow<T> implements Iterable<T> {
|
|
|
93
48
|
count(): number;
|
|
94
49
|
some(fn: Predicate<T>): boolean;
|
|
95
50
|
every(fn: Predicate<T>): boolean;
|
|
96
|
-
/**
|
|
97
|
-
* Calculate the sum of all numbers.
|
|
98
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
99
|
-
*/
|
|
100
51
|
sum(this: Iterflow<number>): number;
|
|
101
|
-
/**
|
|
102
|
-
* Calculate the arithmetic mean.
|
|
103
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
104
|
-
*/
|
|
105
52
|
mean(this: Iterflow<number>): number;
|
|
106
|
-
/**
|
|
107
|
-
* Calculate the median (50th percentile).
|
|
108
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
109
|
-
*/
|
|
110
53
|
median(this: Iterflow<number>): number;
|
|
111
|
-
/**
|
|
112
|
-
* Find the minimum value.
|
|
113
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
114
|
-
*/
|
|
115
54
|
min(this: Iterflow<number>): number;
|
|
116
|
-
/**
|
|
117
|
-
* Find the maximum value.
|
|
118
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
119
|
-
*/
|
|
120
55
|
max(this: Iterflow<number>): number;
|
|
121
|
-
/**
|
|
122
|
-
* Calculate the population variance.
|
|
123
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
124
|
-
*/
|
|
125
56
|
variance(this: Iterflow<number>): number;
|
|
57
|
+
stdDev(this: Iterflow<number>): number;
|
|
126
58
|
}
|
|
127
59
|
declare function iter<T>(src: Iterable<T>): Iterflow<T>;
|
|
128
60
|
|
|
129
|
-
export { EmptySequenceError, type FlatMapper, Iterflow, IterflowError, type Mapper, type Predicate, type Reducer, isIterable, iter, max, mean, median, min, sum, variance };
|
|
61
|
+
export { EmptySequenceError, type FlatMapper, Iterflow, IterflowError, type Mapper, type Predicate, type Reducer, isIterable, iter, max, mean, median, min, stdDev, sum, variance };
|
package/dist/index.js
CHANGED
|
@@ -158,6 +158,42 @@ function concat(src, ...others) {
|
|
|
158
158
|
for (const o of others) yield* o;
|
|
159
159
|
});
|
|
160
160
|
}
|
|
161
|
+
function zip(src, ...others) {
|
|
162
|
+
return makeTransform(src, function* (s) {
|
|
163
|
+
const iterators = [s[Symbol.iterator](), ...others.map((o) => o[Symbol.iterator]())];
|
|
164
|
+
while (true) {
|
|
165
|
+
const results = iterators.map((it) => it.next());
|
|
166
|
+
if (results.some((r) => r.done)) break;
|
|
167
|
+
yield results.map((r) => r.value);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
function streamingMean(src) {
|
|
172
|
+
return makeTransform(src, function* (s) {
|
|
173
|
+
let count2 = 0;
|
|
174
|
+
let mean2 = 0;
|
|
175
|
+
for (const x of s) {
|
|
176
|
+
count2++;
|
|
177
|
+
mean2 += (x - mean2) / count2;
|
|
178
|
+
yield mean2;
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
function streamingVariance(src) {
|
|
183
|
+
return makeTransform(src, function* (s) {
|
|
184
|
+
let count2 = 0;
|
|
185
|
+
let mean2 = 0;
|
|
186
|
+
let M2 = 0;
|
|
187
|
+
for (const x of s) {
|
|
188
|
+
count2++;
|
|
189
|
+
const delta = x - mean2;
|
|
190
|
+
mean2 += delta / count2;
|
|
191
|
+
const delta2 = x - mean2;
|
|
192
|
+
M2 += delta * delta2;
|
|
193
|
+
yield M2 / count2;
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}
|
|
161
197
|
|
|
162
198
|
// src/terminals.ts
|
|
163
199
|
function toArray(src) {
|
|
@@ -249,8 +285,10 @@ function quickselect(arr, k) {
|
|
|
249
285
|
return arr[left];
|
|
250
286
|
}
|
|
251
287
|
var median = (src) => {
|
|
252
|
-
const
|
|
253
|
-
assertNonEmpty(
|
|
288
|
+
const original = Array.from(src);
|
|
289
|
+
assertNonEmpty(original.length, "median");
|
|
290
|
+
const arr = original.filter((x) => !Number.isNaN(x));
|
|
291
|
+
if (arr.length === 0) return NaN;
|
|
254
292
|
const mid = arr.length >> 1;
|
|
255
293
|
if (arr.length % 2) {
|
|
256
294
|
return quickselect(arr, mid);
|
|
@@ -292,6 +330,7 @@ var variance = (src) => {
|
|
|
292
330
|
assertNonEmpty(count2, "variance");
|
|
293
331
|
return M2 / count2;
|
|
294
332
|
};
|
|
333
|
+
var stdDev = (src) => Math.sqrt(variance(src));
|
|
295
334
|
|
|
296
335
|
// src/index.ts
|
|
297
336
|
var Iterflow = class _Iterflow {
|
|
@@ -326,30 +365,30 @@ var Iterflow = class _Iterflow {
|
|
|
326
365
|
distinct() {
|
|
327
366
|
return new _Iterflow(distinct(this.src));
|
|
328
367
|
}
|
|
329
|
-
/**
|
|
330
|
-
* Yield [index, value] pairs.
|
|
331
|
-
*/
|
|
332
368
|
enumerate() {
|
|
333
369
|
return new _Iterflow(enumerate(this.src));
|
|
334
370
|
}
|
|
335
|
-
/**
|
|
336
|
-
* Append additional iterables to the sequence.
|
|
337
|
-
*/
|
|
338
371
|
concat(...others) {
|
|
339
372
|
return new _Iterflow(concat(this.src, ...others));
|
|
340
373
|
}
|
|
341
|
-
/**
|
|
342
|
-
* Create sliding windows of the specified size.
|
|
343
|
-
*/
|
|
344
374
|
window(size) {
|
|
345
375
|
return new _Iterflow(window(this.src, size));
|
|
346
376
|
}
|
|
347
|
-
/**
|
|
348
|
-
* Split the sequence into fixed-size chunks.
|
|
349
|
-
*/
|
|
350
377
|
chunk(size) {
|
|
351
378
|
return new _Iterflow(chunk(this.src, size));
|
|
352
379
|
}
|
|
380
|
+
zip(other, other2) {
|
|
381
|
+
if (other2 !== void 0) {
|
|
382
|
+
return new _Iterflow(zip(this.src, other, other2));
|
|
383
|
+
}
|
|
384
|
+
return new _Iterflow(zip(this.src, other));
|
|
385
|
+
}
|
|
386
|
+
streamingMean() {
|
|
387
|
+
return new _Iterflow(streamingMean(this.src));
|
|
388
|
+
}
|
|
389
|
+
streamingVariance() {
|
|
390
|
+
return new _Iterflow(streamingVariance(this.src));
|
|
391
|
+
}
|
|
353
392
|
// Terminals
|
|
354
393
|
toArray() {
|
|
355
394
|
return toArray(this.src);
|
|
@@ -378,49 +417,27 @@ var Iterflow = class _Iterflow {
|
|
|
378
417
|
every(fn) {
|
|
379
418
|
return every(this.src, fn);
|
|
380
419
|
}
|
|
381
|
-
// Stats (numbers only)
|
|
382
|
-
/**
|
|
383
|
-
* Calculate the sum of all numbers.
|
|
384
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
385
|
-
*/
|
|
386
420
|
sum() {
|
|
387
421
|
return sum(this.src);
|
|
388
422
|
}
|
|
389
|
-
/**
|
|
390
|
-
* Calculate the arithmetic mean.
|
|
391
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
392
|
-
*/
|
|
393
423
|
mean() {
|
|
394
424
|
return mean(this.src);
|
|
395
425
|
}
|
|
396
|
-
/**
|
|
397
|
-
* Calculate the median (50th percentile).
|
|
398
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
399
|
-
*/
|
|
400
426
|
median() {
|
|
401
427
|
return median(this.src);
|
|
402
428
|
}
|
|
403
|
-
/**
|
|
404
|
-
* Find the minimum value.
|
|
405
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
406
|
-
*/
|
|
407
429
|
min() {
|
|
408
430
|
return min(this.src);
|
|
409
431
|
}
|
|
410
|
-
/**
|
|
411
|
-
* Find the maximum value.
|
|
412
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
413
|
-
*/
|
|
414
432
|
max() {
|
|
415
433
|
return max(this.src);
|
|
416
434
|
}
|
|
417
|
-
/**
|
|
418
|
-
* Calculate the population variance.
|
|
419
|
-
* @throws {EmptySequenceError} If the sequence is empty.
|
|
420
|
-
*/
|
|
421
435
|
variance() {
|
|
422
436
|
return variance(this.src);
|
|
423
437
|
}
|
|
438
|
+
stdDev() {
|
|
439
|
+
return stdDev(this.src);
|
|
440
|
+
}
|
|
424
441
|
};
|
|
425
442
|
function iter(src) {
|
|
426
443
|
return new Iterflow(src);
|
|
@@ -435,6 +452,7 @@ export {
|
|
|
435
452
|
mean,
|
|
436
453
|
median,
|
|
437
454
|
min,
|
|
455
|
+
stdDev,
|
|
438
456
|
sum,
|
|
439
457
|
variance
|
|
440
458
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core.ts","../src/internal.ts","../src/transforms.ts","../src/terminals.ts","../src/index.ts"],"sourcesContent":["// Error classes\n/**\n * Base error class for all iterflow errors.\n */\nexport class IterflowError extends Error {\n constructor(msg: string) {\n super(msg);\n this.name = 'IterflowError';\n }\n}\n\n/**\n * Thrown by statistical methods when called on empty sequences.\n */\nexport class EmptySequenceError extends IterflowError {\n constructor(readonly op: string) {\n super(`Cannot compute ${op} of empty sequence`);\n this.name = 'EmptySequenceError';\n }\n}\n\n// Type definitions\nexport type Predicate<T> = (v: T, i: number) => boolean;\nexport type Mapper<T, U> = (v: T, i: number) => U;\nexport type Reducer<T, U> = (acc: U, v: T, i: number) => U;\nexport type FlatMapper<T, U> = (v: T, i: number) => Iterable<U>;\n\n// Utilities\n/**\n * Type guard to check if a value is iterable.\n */\nexport const isIterable = (v: unknown): v is Iterable<unknown> =>\n v != null && typeof v === 'object' && Symbol.iterator in v;\n","import { EmptySequenceError } from './core.js';\n\n// Generator factory\nexport function makeTransform<T, U>(\n src: Iterable<T>,\n generator: (src: Iterable<T>) => Generator<U>\n): Iterable<U> {\n return {\n *[Symbol.iterator]() {\n yield* generator(src);\n }\n };\n}\n\n// Iteration helpers\nexport function assertNonEmpty(count: number, op: string): void {\n if (count === 0) {\n throw new EmptySequenceError(op);\n }\n}\n\nexport function assertHasValue(has: boolean, op: string): void {\n if (!has) {\n throw new EmptySequenceError(op);\n }\n}\n\n// Validation helpers\nexport function validateInteger(n: number, param: string): void {\n if (!Number.isFinite(n)) {\n throw new RangeError(`${param} must be finite`);\n }\n if (!Number.isInteger(n)) {\n throw new TypeError(`${param} must be an integer`);\n }\n}\n\nexport function validateNonNegative(n: number, param: string): void {\n validateInteger(n, param);\n if (n < 0) {\n throw new RangeError(`${param} must be non-negative`);\n }\n}\n\nexport function validatePositive(n: number, param: string): void {\n validateInteger(n, param);\n if (n <= 0) {\n throw new RangeError(`${param} must be positive`);\n }\n}\n","import type { Predicate, Mapper, FlatMapper } from './core.js';\nimport { makeTransform, validateNonNegative, validatePositive } from './internal.js';\n\n// Mapping transforms\nexport function map<T, U>(src: Iterable<T>, fn: Mapper<T, U>): Iterable<U> {\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) yield fn(v, i++);\n });\n}\n\nexport function flatMap<T, U>(src: Iterable<T>, fn: FlatMapper<T, U>): Iterable<U> {\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) yield* fn(v, i++);\n });\n}\n\nexport function enumerate<T>(src: Iterable<T>): Iterable<[number, T]> {\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) yield [i++, v];\n });\n}\n\n// Filtering transforms\nexport function filter<T>(src: Iterable<T>, fn: Predicate<T>): Iterable<T> {\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) if (fn(v, i++)) yield v;\n });\n}\n\nexport function take<T>(src: Iterable<T>, n: number): Iterable<T> {\n validateNonNegative(n, 'Count');\n return makeTransform(src, function* (s) {\n let remaining = n;\n for (const v of s) {\n if (remaining-- <= 0) break;\n yield v;\n }\n });\n}\n\nexport function drop<T>(src: Iterable<T>, n: number): Iterable<T> {\n validateNonNegative(n, 'Count');\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) if (i++ >= n) yield v;\n });\n}\n\nexport function takeWhile<T>(src: Iterable<T>, fn: Predicate<T>): Iterable<T> {\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) {\n if (!fn(v, i++)) break;\n yield v;\n }\n });\n}\n\nexport function dropWhile<T>(src: Iterable<T>, fn: Predicate<T>): Iterable<T> {\n return makeTransform(src, function* (s) {\n let i = 0, dropping = true;\n for (const v of s) {\n if (dropping && !fn(v, i)) dropping = false;\n if (!dropping) yield v;\n i++;\n }\n });\n}\n\nexport function distinct<T>(src: Iterable<T>): Iterable<T> {\n return makeTransform(src, function* (s) {\n const seen = new Set<T>();\n for (const v of s) {\n if (!seen.has(v)) { seen.add(v); yield v; }\n }\n });\n}\n\n// Windowing transforms\nexport function window<T>(src: Iterable<T>, size: number): Iterable<T[]> {\n validatePositive(size, 'Window size');\n return makeTransform(src, function* (s) {\n const buf: T[] = [];\n for (const v of s) {\n buf.push(v);\n if (buf.length === size) { yield buf.slice(); buf.shift(); }\n }\n });\n}\n\nexport function chunk<T>(src: Iterable<T>, size: number): Iterable<T[]> {\n validatePositive(size, 'Chunk size');\n return makeTransform(src, function* (s) {\n let batch: T[] = [];\n for (const v of s) {\n batch.push(v);\n if (batch.length === size) { yield batch; batch = []; }\n }\n if (batch.length) yield batch;\n });\n}\n\n// Combining transforms\nexport function concat<T, U>(src: Iterable<T>, ...others: Iterable<U>[]): Iterable<T | U> {\n return makeTransform(src, function* (s) {\n yield* s;\n for (const o of others) yield* o;\n });\n}\n","import type { Predicate, Reducer } from './core.js';\nimport { assertNonEmpty, assertHasValue } from './internal.js';\n\n// Collection terminals\nexport function toArray<T>(src: Iterable<T>): T[] {\n return Array.from(src);\n}\n\nexport function reduce<T, U>(src: Iterable<T>, fn: Reducer<T, U>, init: U): U {\n let acc = init, i = 0;\n for (const v of src) acc = fn(acc, v, i++);\n return acc;\n}\n\nexport function find<T>(src: Iterable<T>, fn: Predicate<T>): T | undefined {\n let i = 0;\n for (const v of src) if (fn(v, i++)) return v;\n return undefined;\n}\n\nexport function forEach<T>(src: Iterable<T>, fn: (v: T, i: number) => void): void {\n let i = 0;\n for (const v of src) fn(v, i++);\n}\n\n// Testing terminals\nexport function first<T>(src: Iterable<T>): T | undefined {\n for (const v of src) return v;\n return undefined;\n}\n\nexport function last<T>(src: Iterable<T>): T | undefined {\n if (Array.isArray(src)) return src[src.length - 1];\n let last: T | undefined;\n for (const v of src) last = v;\n return last;\n}\n\nexport function count<T>(src: Iterable<T>): number {\n if (Array.isArray(src)) return src.length;\n let n = 0;\n for (const _ of src) n++;\n return n;\n}\n\nexport function some<T>(src: Iterable<T>, fn: Predicate<T>): boolean {\n let i = 0;\n for (const v of src) if (fn(v, i++)) return true;\n return false;\n}\n\nexport function every<T>(src: Iterable<T>, fn: Predicate<T>): boolean {\n let i = 0;\n for (const v of src) if (!fn(v, i++)) return false;\n return true;\n}\n\n// Statistical terminals\n/**\n * Calculate the sum of all numbers.\n * @throws {EmptySequenceError} If the sequence is empty.\n */\nexport const sum = (src: Iterable<number>): number => {\n let total = 0, count = 0;\n for (const v of src) { total += v; count++; }\n assertNonEmpty(count, 'sum');\n return total;\n};\n\n/**\n * Calculate the arithmetic mean.\n * @throws {EmptySequenceError} If the sequence is empty.\n */\nexport const mean = (src: Iterable<number>): number => {\n let total = 0, count = 0;\n for (const v of src) { total += v; count++; }\n assertNonEmpty(count, 'mean');\n return total / count;\n};\n\n/**\n * Partition array around a pivot for Quickselect.\n * @private\n */\nfunction partition(arr: number[], left: number, right: number): number {\n const pivot = arr[right]!;\n let i = left;\n for (let j = left; j < right; j++) {\n if (arr[j]! < pivot) {\n [arr[i], arr[j]] = [arr[j]!, arr[i]!];\n i++;\n }\n }\n [arr[i], arr[right]] = [arr[right]!, arr[i]!];\n return i;\n}\n\n/**\n * Find the k-th smallest element using Quickselect (Hoare's selection algorithm).\n * @private\n */\nfunction quickselect(arr: number[], k: number): number {\n let left = 0;\n let right = arr.length - 1;\n\n while (left < right) {\n const pivotIndex = partition(arr, left, right);\n if (pivotIndex === k) {\n return arr[k]!;\n } else if (pivotIndex > k) {\n right = pivotIndex - 1;\n } else {\n left = pivotIndex + 1;\n }\n }\n\n return arr[left]!;\n}\n\n/**\n * Calculate the median (50th percentile) using Quickselect algorithm.\n * @throws {EmptySequenceError} If the sequence is empty.\n */\nexport const median = (src: Iterable<number>): number => {\n const arr = Array.from(src);\n assertNonEmpty(arr.length, 'median');\n\n const mid = arr.length >> 1;\n if (arr.length % 2) {\n // Odd length: return middle element\n return quickselect(arr, mid);\n } else {\n // Even length: return average of two middle elements\n const upper = quickselect(arr, mid);\n const lower = quickselect(arr, mid - 1);\n return (lower + upper) / 2;\n }\n};\n\n/**\n * Find the minimum value.\n * @throws {EmptySequenceError} If the sequence is empty.\n */\nexport const min = (src: Iterable<number>): number => {\n let result = Infinity, has = false;\n for (const v of src) { if (v < result) result = v; has = true; }\n assertHasValue(has, 'min');\n return result;\n};\n\n/**\n * Find the maximum value.\n * @throws {EmptySequenceError} If the sequence is empty.\n */\nexport const max = (src: Iterable<number>): number => {\n let result = -Infinity, has = false;\n for (const v of src) { if (v > result) result = v; has = true; }\n assertHasValue(has, 'max');\n return result;\n};\n\n/**\n * Calculate the population variance using Welford's online algorithm.\n * @throws {EmptySequenceError} If the sequence is empty.\n */\nexport const variance = (src: Iterable<number>): number => {\n let count = 0;\n let mean = 0;\n let M2 = 0;\n\n for (const x of src) {\n count++;\n const delta = x - mean;\n mean += delta / count;\n const delta2 = x - mean;\n M2 += delta * delta2;\n }\n\n assertNonEmpty(count, 'variance');\n return M2 / count;\n};\n","/**\n * iterflow - Lazy iterators with statistics and windowing\n * @packageDocumentation\n */\n\nimport type { Predicate, Mapper, Reducer, FlatMapper } from './core.js';\nimport * as transforms from './transforms.js';\nimport * as terminals from './terminals.js';\n\n// Iterflow class\nexport class Iterflow<T> implements Iterable<T> {\n constructor(private readonly src: Iterable<T>) {}\n\n [Symbol.iterator](): Iterator<T> {\n return this.src[Symbol.iterator]();\n }\n\n // Transforms\n map<U>(fn: Mapper<T, U>): Iterflow<U> {\n return new Iterflow(transforms.map(this.src, fn));\n }\n\n filter(fn: Predicate<T>): Iterflow<T> {\n return new Iterflow(transforms.filter(this.src, fn));\n }\n\n flatMap<U>(fn: FlatMapper<T, U>): Iterflow<U> {\n return new Iterflow(transforms.flatMap(this.src, fn));\n }\n\n take(n: number): Iterflow<T> {\n return new Iterflow(transforms.take(this.src, n));\n }\n\n drop(n: number): Iterflow<T> {\n return new Iterflow(transforms.drop(this.src, n));\n }\n\n takeWhile(fn: Predicate<T>): Iterflow<T> {\n return new Iterflow(transforms.takeWhile(this.src, fn));\n }\n\n dropWhile(fn: Predicate<T>): Iterflow<T> {\n return new Iterflow(transforms.dropWhile(this.src, fn));\n }\n\n distinct(): Iterflow<T> {\n return new Iterflow(transforms.distinct(this.src));\n }\n\n /**\n * Yield [index, value] pairs.\n */\n enumerate(): Iterflow<[number, T]> {\n return new Iterflow(transforms.enumerate(this.src));\n }\n\n /**\n * Append additional iterables to the sequence.\n */\n concat<U>(...others: Iterable<U>[]): Iterflow<T | U> {\n return new Iterflow(transforms.concat(this.src, ...others));\n }\n\n /**\n * Create sliding windows of the specified size.\n */\n window(size: number): Iterflow<T[]> {\n return new Iterflow(transforms.window(this.src, size));\n }\n\n /**\n * Split the sequence into fixed-size chunks.\n */\n chunk(size: number): Iterflow<T[]> {\n return new Iterflow(transforms.chunk(this.src, size));\n }\n\n // Terminals\n toArray(): T[] {\n return terminals.toArray(this.src);\n }\n\n reduce<U>(fn: Reducer<T, U>, init: U): U {\n return terminals.reduce(this.src, fn, init);\n }\n\n find(fn: Predicate<T>): T | undefined {\n return terminals.find(this.src, fn);\n }\n\n forEach(fn: (v: T, i: number) => void): void {\n terminals.forEach(this.src, fn);\n }\n\n first(): T | undefined {\n return terminals.first(this.src);\n }\n\n last(): T | undefined {\n return terminals.last(this.src);\n }\n\n count(): number {\n return terminals.count(this.src);\n }\n\n some(fn: Predicate<T>): boolean {\n return terminals.some(this.src, fn);\n }\n\n every(fn: Predicate<T>): boolean {\n return terminals.every(this.src, fn);\n }\n\n // Stats (numbers only)\n /**\n * Calculate the sum of all numbers.\n * @throws {EmptySequenceError} If the sequence is empty.\n */\n sum(this: Iterflow<number>): number {\n return terminals.sum(this.src);\n }\n\n /**\n * Calculate the arithmetic mean.\n * @throws {EmptySequenceError} If the sequence is empty.\n */\n mean(this: Iterflow<number>): number {\n return terminals.mean(this.src);\n }\n\n /**\n * Calculate the median (50th percentile).\n * @throws {EmptySequenceError} If the sequence is empty.\n */\n median(this: Iterflow<number>): number {\n return terminals.median(this.src);\n }\n\n /**\n * Find the minimum value.\n * @throws {EmptySequenceError} If the sequence is empty.\n */\n min(this: Iterflow<number>): number {\n return terminals.min(this.src);\n }\n\n /**\n * Find the maximum value.\n * @throws {EmptySequenceError} If the sequence is empty.\n */\n max(this: Iterflow<number>): number {\n return terminals.max(this.src);\n }\n\n /**\n * Calculate the population variance.\n * @throws {EmptySequenceError} If the sequence is empty.\n */\n variance(this: Iterflow<number>): number {\n return terminals.variance(this.src);\n }\n}\n\n// Factory function\nexport function iter<T>(src: Iterable<T>): Iterflow<T> {\n return new Iterflow(src);\n}\n\n// Re-exports from other modules\nexport { IterflowError, EmptySequenceError, isIterable } from './core.js';\nexport type { Predicate, Mapper, Reducer, FlatMapper } from './core.js';\nexport { sum, mean, median, min, max, variance } from './terminals.js';\n"],"mappings":";AAIO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EACvC,YAAY,KAAa;AACvB,UAAM,GAAG;AACT,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,qBAAN,cAAiC,cAAc;AAAA,EACpD,YAAqB,IAAY;AAC/B,UAAM,kBAAkB,EAAE,oBAAoB;AAD3B;AAEnB,SAAK,OAAO;AAAA,EACd;AACF;AAYO,IAAM,aAAa,CAAC,MACzB,KAAK,QAAQ,OAAO,MAAM,YAAY,OAAO,YAAY;;;AC7BpD,SAAS,cACd,KACA,WACa;AACb,SAAO;AAAA,IACL,EAAE,OAAO,QAAQ,IAAI;AACnB,aAAO,UAAU,GAAG;AAAA,IACtB;AAAA,EACF;AACF;AAGO,SAAS,eAAeA,QAAe,IAAkB;AAC9D,MAAIA,WAAU,GAAG;AACf,UAAM,IAAI,mBAAmB,EAAE;AAAA,EACjC;AACF;AAEO,SAAS,eAAe,KAAc,IAAkB;AAC7D,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,mBAAmB,EAAE;AAAA,EACjC;AACF;AAGO,SAAS,gBAAgB,GAAW,OAAqB;AAC9D,MAAI,CAAC,OAAO,SAAS,CAAC,GAAG;AACvB,UAAM,IAAI,WAAW,GAAG,KAAK,iBAAiB;AAAA,EAChD;AACA,MAAI,CAAC,OAAO,UAAU,CAAC,GAAG;AACxB,UAAM,IAAI,UAAU,GAAG,KAAK,qBAAqB;AAAA,EACnD;AACF;AAEO,SAAS,oBAAoB,GAAW,OAAqB;AAClE,kBAAgB,GAAG,KAAK;AACxB,MAAI,IAAI,GAAG;AACT,UAAM,IAAI,WAAW,GAAG,KAAK,uBAAuB;AAAA,EACtD;AACF;AAEO,SAAS,iBAAiB,GAAW,OAAqB;AAC/D,kBAAgB,GAAG,KAAK;AACxB,MAAI,KAAK,GAAG;AACV,UAAM,IAAI,WAAW,GAAG,KAAK,mBAAmB;AAAA,EAClD;AACF;;;AC7CO,SAAS,IAAU,KAAkB,IAA+B;AACzE,SAAO,cAAc,KAAK,WAAW,GAAG;AACtC,QAAI,IAAI;AACR,eAAW,KAAK,EAAG,OAAM,GAAG,GAAG,GAAG;AAAA,EACpC,CAAC;AACH;AAEO,SAAS,QAAc,KAAkB,IAAmC;AACjF,SAAO,cAAc,KAAK,WAAW,GAAG;AACtC,QAAI,IAAI;AACR,eAAW,KAAK,EAAG,QAAO,GAAG,GAAG,GAAG;AAAA,EACrC,CAAC;AACH;AAEO,SAAS,UAAa,KAAyC;AACpE,SAAO,cAAc,KAAK,WAAW,GAAG;AACtC,QAAI,IAAI;AACR,eAAW,KAAK,EAAG,OAAM,CAAC,KAAK,CAAC;AAAA,EAClC,CAAC;AACH;AAGO,SAAS,OAAU,KAAkB,IAA+B;AACzE,SAAO,cAAc,KAAK,WAAW,GAAG;AACtC,QAAI,IAAI;AACR,eAAW,KAAK,EAAG,KAAI,GAAG,GAAG,GAAG,EAAG,OAAM;AAAA,EAC3C,CAAC;AACH;AAEO,SAAS,KAAQ,KAAkB,GAAwB;AAChE,sBAAoB,GAAG,OAAO;AAC9B,SAAO,cAAc,KAAK,WAAW,GAAG;AACtC,QAAI,YAAY;AAChB,eAAW,KAAK,GAAG;AACjB,UAAI,eAAe,EAAG;AACtB,YAAM;AAAA,IACR;AAAA,EACF,CAAC;AACH;AAEO,SAAS,KAAQ,KAAkB,GAAwB;AAChE,sBAAoB,GAAG,OAAO;AAC9B,SAAO,cAAc,KAAK,WAAW,GAAG;AACtC,QAAI,IAAI;AACR,eAAW,KAAK,EAAG,KAAI,OAAO,EAAG,OAAM;AAAA,EACzC,CAAC;AACH;AAEO,SAAS,UAAa,KAAkB,IAA+B;AAC5E,SAAO,cAAc,KAAK,WAAW,GAAG;AACtC,QAAI,IAAI;AACR,eAAW,KAAK,GAAG;AACjB,UAAI,CAAC,GAAG,GAAG,GAAG,EAAG;AACjB,YAAM;AAAA,IACR;AAAA,EACF,CAAC;AACH;AAEO,SAAS,UAAa,KAAkB,IAA+B;AAC5E,SAAO,cAAc,KAAK,WAAW,GAAG;AACtC,QAAI,IAAI,GAAG,WAAW;AACtB,eAAW,KAAK,GAAG;AACjB,UAAI,YAAY,CAAC,GAAG,GAAG,CAAC,EAAG,YAAW;AACtC,UAAI,CAAC,SAAU,OAAM;AACrB;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEO,SAAS,SAAY,KAA+B;AACzD,SAAO,cAAc,KAAK,WAAW,GAAG;AACtC,UAAM,OAAO,oBAAI,IAAO;AACxB,eAAW,KAAK,GAAG;AACjB,UAAI,CAAC,KAAK,IAAI,CAAC,GAAG;AAAE,aAAK,IAAI,CAAC;AAAG,cAAM;AAAA,MAAG;AAAA,IAC5C;AAAA,EACF,CAAC;AACH;AAGO,SAAS,OAAU,KAAkB,MAA6B;AACvE,mBAAiB,MAAM,aAAa;AACpC,SAAO,cAAc,KAAK,WAAW,GAAG;AACtC,UAAM,MAAW,CAAC;AAClB,eAAW,KAAK,GAAG;AACjB,UAAI,KAAK,CAAC;AACV,UAAI,IAAI,WAAW,MAAM;AAAE,cAAM,IAAI,MAAM;AAAG,YAAI,MAAM;AAAA,MAAG;AAAA,IAC7D;AAAA,EACF,CAAC;AACH;AAEO,SAAS,MAAS,KAAkB,MAA6B;AACtE,mBAAiB,MAAM,YAAY;AACnC,SAAO,cAAc,KAAK,WAAW,GAAG;AACtC,QAAI,QAAa,CAAC;AAClB,eAAW,KAAK,GAAG;AACjB,YAAM,KAAK,CAAC;AACZ,UAAI,MAAM,WAAW,MAAM;AAAE,cAAM;AAAO,gBAAQ,CAAC;AAAA,MAAG;AAAA,IACxD;AACA,QAAI,MAAM,OAAQ,OAAM;AAAA,EAC1B,CAAC;AACH;AAGO,SAAS,OAAa,QAAqB,QAAwC;AACxF,SAAO,cAAc,KAAK,WAAW,GAAG;AACtC,WAAO;AACP,eAAW,KAAK,OAAQ,QAAO;AAAA,EACjC,CAAC;AACH;;;AC5GO,SAAS,QAAW,KAAuB;AAChD,SAAO,MAAM,KAAK,GAAG;AACvB;AAEO,SAAS,OAAa,KAAkB,IAAmB,MAAY;AAC5E,MAAI,MAAM,MAAM,IAAI;AACpB,aAAW,KAAK,IAAK,OAAM,GAAG,KAAK,GAAG,GAAG;AACzC,SAAO;AACT;AAEO,SAAS,KAAQ,KAAkB,IAAiC;AACzE,MAAI,IAAI;AACR,aAAW,KAAK,IAAK,KAAI,GAAG,GAAG,GAAG,EAAG,QAAO;AAC5C,SAAO;AACT;AAEO,SAAS,QAAW,KAAkB,IAAqC;AAChF,MAAI,IAAI;AACR,aAAW,KAAK,IAAK,IAAG,GAAG,GAAG;AAChC;AAGO,SAAS,MAAS,KAAiC;AACxD,aAAW,KAAK,IAAK,QAAO;AAC5B,SAAO;AACT;AAEO,SAAS,KAAQ,KAAiC;AACvD,MAAI,MAAM,QAAQ,GAAG,EAAG,QAAO,IAAI,IAAI,SAAS,CAAC;AACjD,MAAIC;AACJ,aAAW,KAAK,IAAK,CAAAA,QAAO;AAC5B,SAAOA;AACT;AAEO,SAAS,MAAS,KAA0B;AACjD,MAAI,MAAM,QAAQ,GAAG,EAAG,QAAO,IAAI;AACnC,MAAI,IAAI;AACR,aAAW,KAAK,IAAK;AACrB,SAAO;AACT;AAEO,SAAS,KAAQ,KAAkB,IAA2B;AACnE,MAAI,IAAI;AACR,aAAW,KAAK,IAAK,KAAI,GAAG,GAAG,GAAG,EAAG,QAAO;AAC5C,SAAO;AACT;AAEO,SAAS,MAAS,KAAkB,IAA2B;AACpE,MAAI,IAAI;AACR,aAAW,KAAK,IAAK,KAAI,CAAC,GAAG,GAAG,GAAG,EAAG,QAAO;AAC7C,SAAO;AACT;AAOO,IAAM,MAAM,CAAC,QAAkC;AACpD,MAAI,QAAQ,GAAGC,SAAQ;AACvB,aAAW,KAAK,KAAK;AAAE,aAAS;AAAG,IAAAA;AAAA,EAAS;AAC5C,iBAAeA,QAAO,KAAK;AAC3B,SAAO;AACT;AAMO,IAAM,OAAO,CAAC,QAAkC;AACrD,MAAI,QAAQ,GAAGA,SAAQ;AACvB,aAAW,KAAK,KAAK;AAAE,aAAS;AAAG,IAAAA;AAAA,EAAS;AAC5C,iBAAeA,QAAO,MAAM;AAC5B,SAAO,QAAQA;AACjB;AAMA,SAAS,UAAU,KAAe,MAAc,OAAuB;AACrE,QAAM,QAAQ,IAAI,KAAK;AACvB,MAAI,IAAI;AACR,WAAS,IAAI,MAAM,IAAI,OAAO,KAAK;AACjC,QAAI,IAAI,CAAC,IAAK,OAAO;AACnB,OAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAI,IAAI,CAAC,CAAE;AACpC;AAAA,IACF;AAAA,EACF;AACA,GAAC,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,GAAI,IAAI,CAAC,CAAE;AAC5C,SAAO;AACT;AAMA,SAAS,YAAY,KAAe,GAAmB;AACrD,MAAI,OAAO;AACX,MAAI,QAAQ,IAAI,SAAS;AAEzB,SAAO,OAAO,OAAO;AACnB,UAAM,aAAa,UAAU,KAAK,MAAM,KAAK;AAC7C,QAAI,eAAe,GAAG;AACpB,aAAO,IAAI,CAAC;AAAA,IACd,WAAW,aAAa,GAAG;AACzB,cAAQ,aAAa;AAAA,IACvB,OAAO;AACL,aAAO,aAAa;AAAA,IACtB;AAAA,EACF;AAEA,SAAO,IAAI,IAAI;AACjB;AAMO,IAAM,SAAS,CAAC,QAAkC;AACvD,QAAM,MAAM,MAAM,KAAK,GAAG;AAC1B,iBAAe,IAAI,QAAQ,QAAQ;AAEnC,QAAM,MAAM,IAAI,UAAU;AAC1B,MAAI,IAAI,SAAS,GAAG;AAElB,WAAO,YAAY,KAAK,GAAG;AAAA,EAC7B,OAAO;AAEL,UAAM,QAAQ,YAAY,KAAK,GAAG;AAClC,UAAM,QAAQ,YAAY,KAAK,MAAM,CAAC;AACtC,YAAQ,QAAQ,SAAS;AAAA,EAC3B;AACF;AAMO,IAAM,MAAM,CAAC,QAAkC;AACpD,MAAI,SAAS,UAAU,MAAM;AAC7B,aAAW,KAAK,KAAK;AAAE,QAAI,IAAI,OAAQ,UAAS;AAAG,UAAM;AAAA,EAAM;AAC/D,iBAAe,KAAK,KAAK;AACzB,SAAO;AACT;AAMO,IAAM,MAAM,CAAC,QAAkC;AACpD,MAAI,SAAS,WAAW,MAAM;AAC9B,aAAW,KAAK,KAAK;AAAE,QAAI,IAAI,OAAQ,UAAS;AAAG,UAAM;AAAA,EAAM;AAC/D,iBAAe,KAAK,KAAK;AACzB,SAAO;AACT;AAMO,IAAM,WAAW,CAAC,QAAkC;AACzD,MAAIA,SAAQ;AACZ,MAAIC,QAAO;AACX,MAAI,KAAK;AAET,aAAW,KAAK,KAAK;AACnB,IAAAD;AACA,UAAM,QAAQ,IAAIC;AAClB,IAAAA,SAAQ,QAAQD;AAChB,UAAM,SAAS,IAAIC;AACnB,UAAM,QAAQ;AAAA,EAChB;AAEA,iBAAeD,QAAO,UAAU;AAChC,SAAO,KAAKA;AACd;;;AC1KO,IAAM,WAAN,MAAM,UAAmC;AAAA,EAC9C,YAA6B,KAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEhD,CAAC,OAAO,QAAQ,IAAiB;AAC/B,WAAO,KAAK,IAAI,OAAO,QAAQ,EAAE;AAAA,EACnC;AAAA;AAAA,EAGA,IAAO,IAA+B;AACpC,WAAO,IAAI,UAAoB,IAAI,KAAK,KAAK,EAAE,CAAC;AAAA,EAClD;AAAA,EAEA,OAAO,IAA+B;AACpC,WAAO,IAAI,UAAoB,OAAO,KAAK,KAAK,EAAE,CAAC;AAAA,EACrD;AAAA,EAEA,QAAW,IAAmC;AAC5C,WAAO,IAAI,UAAoB,QAAQ,KAAK,KAAK,EAAE,CAAC;AAAA,EACtD;AAAA,EAEA,KAAK,GAAwB;AAC3B,WAAO,IAAI,UAAoB,KAAK,KAAK,KAAK,CAAC,CAAC;AAAA,EAClD;AAAA,EAEA,KAAK,GAAwB;AAC3B,WAAO,IAAI,UAAoB,KAAK,KAAK,KAAK,CAAC,CAAC;AAAA,EAClD;AAAA,EAEA,UAAU,IAA+B;AACvC,WAAO,IAAI,UAAoB,UAAU,KAAK,KAAK,EAAE,CAAC;AAAA,EACxD;AAAA,EAEA,UAAU,IAA+B;AACvC,WAAO,IAAI,UAAoB,UAAU,KAAK,KAAK,EAAE,CAAC;AAAA,EACxD;AAAA,EAEA,WAAwB;AACtB,WAAO,IAAI,UAAoB,SAAS,KAAK,GAAG,CAAC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,YAAmC;AACjC,WAAO,IAAI,UAAoB,UAAU,KAAK,GAAG,CAAC;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAa,QAAwC;AACnD,WAAO,IAAI,UAAoB,OAAO,KAAK,KAAK,GAAG,MAAM,CAAC;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,MAA6B;AAClC,WAAO,IAAI,UAAoB,OAAO,KAAK,KAAK,IAAI,CAAC;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAA6B;AACjC,WAAO,IAAI,UAAoB,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,EACtD;AAAA;AAAA,EAGA,UAAe;AACb,WAAiB,QAAQ,KAAK,GAAG;AAAA,EACnC;AAAA,EAEA,OAAU,IAAmB,MAAY;AACvC,WAAiB,OAAO,KAAK,KAAK,IAAI,IAAI;AAAA,EAC5C;AAAA,EAEA,KAAK,IAAiC;AACpC,WAAiB,KAAK,KAAK,KAAK,EAAE;AAAA,EACpC;AAAA,EAEA,QAAQ,IAAqC;AAC3C,IAAU,QAAQ,KAAK,KAAK,EAAE;AAAA,EAChC;AAAA,EAEA,QAAuB;AACrB,WAAiB,MAAM,KAAK,GAAG;AAAA,EACjC;AAAA,EAEA,OAAsB;AACpB,WAAiB,KAAK,KAAK,GAAG;AAAA,EAChC;AAAA,EAEA,QAAgB;AACd,WAAiB,MAAM,KAAK,GAAG;AAAA,EACjC;AAAA,EAEA,KAAK,IAA2B;AAC9B,WAAiB,KAAK,KAAK,KAAK,EAAE;AAAA,EACpC;AAAA,EAEA,MAAM,IAA2B;AAC/B,WAAiB,MAAM,KAAK,KAAK,EAAE;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAoC;AAClC,WAAiB,IAAI,KAAK,GAAG;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAqC;AACnC,WAAiB,KAAK,KAAK,GAAG;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAuC;AACrC,WAAiB,OAAO,KAAK,GAAG;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAoC;AAClC,WAAiB,IAAI,KAAK,GAAG;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAoC;AAClC,WAAiB,IAAI,KAAK,GAAG;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAyC;AACvC,WAAiB,SAAS,KAAK,GAAG;AAAA,EACpC;AACF;AAGO,SAAS,KAAQ,KAA+B;AACrD,SAAO,IAAI,SAAS,GAAG;AACzB;","names":["count","last","count","mean"]}
|
|
1
|
+
{"version":3,"sources":["../src/core.ts","../src/internal.ts","../src/transforms.ts","../src/terminals.ts","../src/index.ts"],"sourcesContent":["export class IterflowError extends Error {\n constructor(msg: string) {\n super(msg);\n this.name = 'IterflowError';\n }\n}\n\nexport class EmptySequenceError extends IterflowError {\n constructor(readonly op: string) {\n super(`Cannot compute ${op} of empty sequence`);\n this.name = 'EmptySequenceError';\n }\n}\n\nexport type Predicate<T> = (v: T, i: number) => boolean;\nexport type Mapper<T, U> = (v: T, i: number) => U;\nexport type Reducer<T, U> = (acc: U, v: T, i: number) => U;\nexport type FlatMapper<T, U> = (v: T, i: number) => Iterable<U>;\n\nexport const isIterable = (v: unknown): v is Iterable<unknown> =>\n v != null && typeof v === 'object' && Symbol.iterator in v;\n","import { EmptySequenceError } from './core.js';\n\n// Generator factory\nexport function makeTransform<T, U>(\n src: Iterable<T>,\n generator: (src: Iterable<T>) => Generator<U>\n): Iterable<U> {\n return {\n *[Symbol.iterator]() {\n yield* generator(src);\n }\n };\n}\n\n// Iteration helpers\nexport function assertNonEmpty(count: number, op: string): void {\n if (count === 0) {\n throw new EmptySequenceError(op);\n }\n}\n\nexport function assertHasValue(has: boolean, op: string): void {\n if (!has) {\n throw new EmptySequenceError(op);\n }\n}\n\n// Validation helpers\nexport function validateInteger(n: number, param: string): void {\n if (!Number.isFinite(n)) {\n throw new RangeError(`${param} must be finite`);\n }\n if (!Number.isInteger(n)) {\n throw new TypeError(`${param} must be an integer`);\n }\n}\n\nexport function validateNonNegative(n: number, param: string): void {\n validateInteger(n, param);\n if (n < 0) {\n throw new RangeError(`${param} must be non-negative`);\n }\n}\n\nexport function validatePositive(n: number, param: string): void {\n validateInteger(n, param);\n if (n <= 0) {\n throw new RangeError(`${param} must be positive`);\n }\n}\n","import type { Predicate, Mapper, FlatMapper } from './core.js';\nimport { makeTransform, validateNonNegative, validatePositive } from './internal.js';\n\n// Mapping transforms\nexport function map<T, U>(src: Iterable<T>, fn: Mapper<T, U>): Iterable<U> {\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) yield fn(v, i++);\n });\n}\n\nexport function flatMap<T, U>(src: Iterable<T>, fn: FlatMapper<T, U>): Iterable<U> {\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) yield* fn(v, i++);\n });\n}\n\nexport function enumerate<T>(src: Iterable<T>): Iterable<[number, T]> {\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) yield [i++, v];\n });\n}\n\n// Filtering transforms\nexport function filter<T>(src: Iterable<T>, fn: Predicate<T>): Iterable<T> {\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) if (fn(v, i++)) yield v;\n });\n}\n\nexport function take<T>(src: Iterable<T>, n: number): Iterable<T> {\n validateNonNegative(n, 'Count');\n return makeTransform(src, function* (s) {\n let remaining = n;\n for (const v of s) {\n if (remaining-- <= 0) break;\n yield v;\n }\n });\n}\n\nexport function drop<T>(src: Iterable<T>, n: number): Iterable<T> {\n validateNonNegative(n, 'Count');\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) if (i++ >= n) yield v;\n });\n}\n\nexport function takeWhile<T>(src: Iterable<T>, fn: Predicate<T>): Iterable<T> {\n return makeTransform(src, function* (s) {\n let i = 0;\n for (const v of s) {\n if (!fn(v, i++)) break;\n yield v;\n }\n });\n}\n\nexport function dropWhile<T>(src: Iterable<T>, fn: Predicate<T>): Iterable<T> {\n return makeTransform(src, function* (s) {\n let i = 0, dropping = true;\n for (const v of s) {\n if (dropping && !fn(v, i)) dropping = false;\n if (!dropping) yield v;\n i++;\n }\n });\n}\n\nexport function distinct<T>(src: Iterable<T>): Iterable<T> {\n return makeTransform(src, function* (s) {\n const seen = new Set<T>();\n for (const v of s) {\n if (!seen.has(v)) { seen.add(v); yield v; }\n }\n });\n}\n\n// Windowing transforms\nexport function window<T>(src: Iterable<T>, size: number): Iterable<T[]> {\n validatePositive(size, 'Window size');\n return makeTransform(src, function* (s) {\n const buf: T[] = [];\n for (const v of s) {\n buf.push(v);\n if (buf.length === size) { yield buf.slice(); buf.shift(); }\n }\n });\n}\n\nexport function chunk<T>(src: Iterable<T>, size: number): Iterable<T[]> {\n validatePositive(size, 'Chunk size');\n return makeTransform(src, function* (s) {\n let batch: T[] = [];\n for (const v of s) {\n batch.push(v);\n if (batch.length === size) { yield batch; batch = []; }\n }\n if (batch.length) yield batch;\n });\n}\n\n// Combining transforms\nexport function concat<T, U>(src: Iterable<T>, ...others: Iterable<U>[]): Iterable<T | U> {\n return makeTransform(src, function* (s) {\n yield* s;\n for (const o of others) yield* o;\n });\n}\n\nexport function zip<T, U>(src: Iterable<T>, other: Iterable<U>): Iterable<[T, U]>;\nexport function zip<T, U, V>(src: Iterable<T>, other1: Iterable<U>, other2: Iterable<V>): Iterable<[T, U, V]>;\nexport function zip<T>(src: Iterable<T>, ...others: Iterable<unknown>[]): Iterable<unknown[]> {\n return makeTransform(src, function* (s) {\n const iterators = [s[Symbol.iterator](), ...others.map(o => o[Symbol.iterator]())];\n while (true) {\n const results = iterators.map(it => it.next());\n if (results.some(r => r.done)) break;\n yield results.map(r => r.value);\n }\n });\n}\n\n// Streaming statistics\nexport function streamingMean(src: Iterable<number>): Iterable<number> {\n return makeTransform(src, function* (s) {\n let count = 0;\n let mean = 0;\n for (const x of s) {\n count++;\n mean += (x - mean) / count;\n yield mean;\n }\n });\n}\n\nexport function streamingVariance(src: Iterable<number>): Iterable<number> {\n return makeTransform(src, function* (s) {\n let count = 0;\n let mean = 0;\n let M2 = 0;\n for (const x of s) {\n count++;\n const delta = x - mean;\n mean += delta / count;\n const delta2 = x - mean;\n M2 += delta * delta2;\n yield M2 / count;\n }\n });\n}\n","import type { Predicate, Reducer } from './core.js';\nimport { assertNonEmpty, assertHasValue } from './internal.js';\n\n// Collection terminals\nexport function toArray<T>(src: Iterable<T>): T[] {\n return Array.from(src);\n}\n\nexport function reduce<T, U>(src: Iterable<T>, fn: Reducer<T, U>, init: U): U {\n let acc = init, i = 0;\n for (const v of src) acc = fn(acc, v, i++);\n return acc;\n}\n\nexport function find<T>(src: Iterable<T>, fn: Predicate<T>): T | undefined {\n let i = 0;\n for (const v of src) if (fn(v, i++)) return v;\n return undefined;\n}\n\nexport function forEach<T>(src: Iterable<T>, fn: (v: T, i: number) => void): void {\n let i = 0;\n for (const v of src) fn(v, i++);\n}\n\n// Testing terminals\nexport function first<T>(src: Iterable<T>): T | undefined {\n for (const v of src) return v;\n return undefined;\n}\n\nexport function last<T>(src: Iterable<T>): T | undefined {\n if (Array.isArray(src)) return src[src.length - 1];\n let last: T | undefined;\n for (const v of src) last = v;\n return last;\n}\n\nexport function count<T>(src: Iterable<T>): number {\n if (Array.isArray(src)) return src.length;\n let n = 0;\n for (const _ of src) n++;\n return n;\n}\n\nexport function some<T>(src: Iterable<T>, fn: Predicate<T>): boolean {\n let i = 0;\n for (const v of src) if (fn(v, i++)) return true;\n return false;\n}\n\nexport function every<T>(src: Iterable<T>, fn: Predicate<T>): boolean {\n let i = 0;\n for (const v of src) if (!fn(v, i++)) return false;\n return true;\n}\n\n// Statistical terminals\nexport const sum = (src: Iterable<number>): number => {\n let total = 0, count = 0;\n for (const v of src) { total += v; count++; }\n assertNonEmpty(count, 'sum');\n return total;\n};\n\nexport const mean = (src: Iterable<number>): number => {\n let total = 0, count = 0;\n for (const v of src) { total += v; count++; }\n assertNonEmpty(count, 'mean');\n return total / count;\n};\n\nfunction partition(arr: number[], left: number, right: number): number {\n const pivot = arr[right]!;\n let i = left;\n for (let j = left; j < right; j++) {\n if (arr[j]! < pivot) {\n [arr[i], arr[j]] = [arr[j]!, arr[i]!];\n i++;\n }\n }\n [arr[i], arr[right]] = [arr[right]!, arr[i]!];\n return i;\n}\n\nfunction quickselect(arr: number[], k: number): number {\n let left = 0;\n let right = arr.length - 1;\n\n while (left < right) {\n const pivotIndex = partition(arr, left, right);\n if (pivotIndex === k) {\n return arr[k]!;\n } else if (pivotIndex > k) {\n right = pivotIndex - 1;\n } else {\n left = pivotIndex + 1;\n }\n }\n\n return arr[left]!;\n}\n\n// Quickselect median with NaN filtering\nexport const median = (src: Iterable<number>): number => {\n const original = Array.from(src);\n assertNonEmpty(original.length, 'median');\n\n const arr = original.filter(x => !Number.isNaN(x));\n if (arr.length === 0) return NaN;\n\n const mid = arr.length >> 1;\n if (arr.length % 2) {\n // Odd length: return middle element\n return quickselect(arr, mid);\n } else {\n // Even length: return average of two middle elements\n const upper = quickselect(arr, mid);\n const lower = quickselect(arr, mid - 1);\n return (lower + upper) / 2;\n }\n};\n\nexport const min = (src: Iterable<number>): number => {\n let result = Infinity, has = false;\n for (const v of src) { if (v < result) result = v; has = true; }\n assertHasValue(has, 'min');\n return result;\n};\n\nexport const max = (src: Iterable<number>): number => {\n let result = -Infinity, has = false;\n for (const v of src) { if (v > result) result = v; has = true; }\n assertHasValue(has, 'max');\n return result;\n};\n\n// Welford's online algorithm for numerical stability\nexport const variance = (src: Iterable<number>): number => {\n let count = 0;\n let mean = 0;\n let M2 = 0;\n\n for (const x of src) {\n count++;\n const delta = x - mean;\n mean += delta / count;\n const delta2 = x - mean;\n M2 += delta * delta2;\n }\n\n assertNonEmpty(count, 'variance');\n return M2 / count;\n};\n\nexport const stdDev = (src: Iterable<number>): number => Math.sqrt(variance(src));\n","import type { Predicate, Mapper, Reducer, FlatMapper } from './core.js';\nimport * as transforms from './transforms.js';\nimport * as terminals from './terminals.js';\n\n// Iterflow class\nexport class Iterflow<T> implements Iterable<T> {\n constructor(private readonly src: Iterable<T>) {}\n\n [Symbol.iterator](): Iterator<T> {\n return this.src[Symbol.iterator]();\n }\n\n // Transforms\n map<U>(fn: Mapper<T, U>): Iterflow<U> {\n return new Iterflow(transforms.map(this.src, fn));\n }\n\n filter(fn: Predicate<T>): Iterflow<T> {\n return new Iterflow(transforms.filter(this.src, fn));\n }\n\n flatMap<U>(fn: FlatMapper<T, U>): Iterflow<U> {\n return new Iterflow(transforms.flatMap(this.src, fn));\n }\n\n take(n: number): Iterflow<T> {\n return new Iterflow(transforms.take(this.src, n));\n }\n\n drop(n: number): Iterflow<T> {\n return new Iterflow(transforms.drop(this.src, n));\n }\n\n takeWhile(fn: Predicate<T>): Iterflow<T> {\n return new Iterflow(transforms.takeWhile(this.src, fn));\n }\n\n dropWhile(fn: Predicate<T>): Iterflow<T> {\n return new Iterflow(transforms.dropWhile(this.src, fn));\n }\n\n distinct(): Iterflow<T> {\n return new Iterflow(transforms.distinct(this.src));\n }\n\n enumerate(): Iterflow<[number, T]> {\n return new Iterflow(transforms.enumerate(this.src));\n }\n\n concat<U>(...others: Iterable<U>[]): Iterflow<T | U> {\n return new Iterflow(transforms.concat(this.src, ...others));\n }\n\n window(size: number): Iterflow<T[]> {\n return new Iterflow(transforms.window(this.src, size));\n }\n\n chunk(size: number): Iterflow<T[]> {\n return new Iterflow(transforms.chunk(this.src, size));\n }\n\n zip<U>(other: Iterable<U>): Iterflow<[T, U]>;\n zip<U, V>(other1: Iterable<U>, other2: Iterable<V>): Iterflow<[T, U, V]>;\n zip(other: Iterable<unknown>, other2?: Iterable<unknown>): Iterflow<unknown[]> {\n if (other2 !== undefined) {\n return new Iterflow(transforms.zip(this.src, other, other2));\n }\n return new Iterflow(transforms.zip(this.src, other));\n }\n\n streamingMean(this: Iterflow<number>): Iterflow<number> {\n return new Iterflow(transforms.streamingMean(this.src));\n }\n\n streamingVariance(this: Iterflow<number>): Iterflow<number> {\n return new Iterflow(transforms.streamingVariance(this.src));\n }\n\n // Terminals\n toArray(): T[] {\n return terminals.toArray(this.src);\n }\n\n reduce<U>(fn: Reducer<T, U>, init: U): U {\n return terminals.reduce(this.src, fn, init);\n }\n\n find(fn: Predicate<T>): T | undefined {\n return terminals.find(this.src, fn);\n }\n\n forEach(fn: (v: T, i: number) => void): void {\n terminals.forEach(this.src, fn);\n }\n\n first(): T | undefined {\n return terminals.first(this.src);\n }\n\n last(): T | undefined {\n return terminals.last(this.src);\n }\n\n count(): number {\n return terminals.count(this.src);\n }\n\n some(fn: Predicate<T>): boolean {\n return terminals.some(this.src, fn);\n }\n\n every(fn: Predicate<T>): boolean {\n return terminals.every(this.src, fn);\n }\n\n sum(this: Iterflow<number>): number {\n return terminals.sum(this.src);\n }\n\n mean(this: Iterflow<number>): number {\n return terminals.mean(this.src);\n }\n\n median(this: Iterflow<number>): number {\n return terminals.median(this.src);\n }\n\n min(this: Iterflow<number>): number {\n return terminals.min(this.src);\n }\n\n max(this: Iterflow<number>): number {\n return terminals.max(this.src);\n }\n\n variance(this: Iterflow<number>): number {\n return terminals.variance(this.src);\n }\n\n stdDev(this: Iterflow<number>): number {\n return terminals.stdDev(this.src);\n }\n}\n\n// Factory function\nexport function iter<T>(src: Iterable<T>): Iterflow<T> {\n return new Iterflow(src);\n}\n\n// Re-exports from other modules\nexport { IterflowError, EmptySequenceError, isIterable } from './core.js';\nexport type { Predicate, Mapper, Reducer, FlatMapper } from './core.js';\nexport { sum, mean, median, min, max, variance, stdDev } from './terminals.js';\n"],"mappings":"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","names":["count","count","mean","last","count","mean"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mathscapes/iterflow",
|
|
3
|
-
"version": "1.0.0-
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.0.0-rc3",
|
|
4
|
+
"description": "Composable streaming statistics pipelines for memory-efficient data processing",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
7
7
|
"module": "./dist/index.js",
|
|
@@ -69,11 +69,8 @@
|
|
|
69
69
|
"node": ">=18"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
72
|
-
"@types/lodash": "^4.14.202",
|
|
73
72
|
"@types/node": "^20.0.0",
|
|
74
73
|
"iter-ops": "^3.5.0",
|
|
75
|
-
"lodash": "^4.17.21",
|
|
76
|
-
"rxjs": "^7.8.1",
|
|
77
74
|
"tinybench": "^6.0.0",
|
|
78
75
|
"tsup": "^8.0.0",
|
|
79
76
|
"tsx": "^4.0.0",
|