@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # Iterflow
2
2
 
3
- Lazy iterators with built-in statistics and windowing. Zero dependencies.
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
- Native arrays are eager. Native Iterator Helpers (ES2025) add lazy ops, but no statistics or windowing.
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 arr = Array.from(src);
289
- assertNonEmpty(arr.length, "median");
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
  });
@@ -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 arr = Array.from(src);
253
- assertNonEmpty(arr.length, "median");
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":"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","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-rc1",
4
- "description": "Lazy iterator utilities with built-in statistics and windowing for memory-efficient data processing",
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",