@mathscapes/iterflow 1.0.0-rc1
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/LICENSE +21 -0
- package/README.md +154 -0
- package/dist/index.cjs +478 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +129 -0
- package/dist/index.d.ts +129 -0
- package/dist/index.js +441 -0
- package/dist/index.js.map +1 -0
- package/package.json +82 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Mathscapes Research
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# Iterflow
|
|
2
|
+
|
|
3
|
+
Lazy iterators with built-in statistics and windowing. Zero dependencies.
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
import { iter } from '@mathscapes/iterflow';
|
|
7
|
+
|
|
8
|
+
// Rolling average of stock prices
|
|
9
|
+
const prices = [100, 102, 101, 105, 107, 110];
|
|
10
|
+
iter(prices)
|
|
11
|
+
.window(5)
|
|
12
|
+
.map(w => iter(w).mean())
|
|
13
|
+
.toArray();
|
|
14
|
+
|
|
15
|
+
// Process millions of records with constant memory
|
|
16
|
+
function* hugeDataset() {
|
|
17
|
+
for (let i = 0; i < 1000000; i++) {
|
|
18
|
+
yield { valid: i % 2 === 0, value: i };
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
iter(hugeDataset())
|
|
22
|
+
.filter(x => x.valid)
|
|
23
|
+
.map(x => x.value)
|
|
24
|
+
.take(1000)
|
|
25
|
+
.sum();
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Install
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
npm install @mathscapes/iterflow
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Why?
|
|
35
|
+
|
|
36
|
+
Native arrays are eager. Native Iterator Helpers (ES2025) add lazy ops, but no statistics or windowing.
|
|
37
|
+
|
|
38
|
+
## API Reference
|
|
39
|
+
|
|
40
|
+
### Factory Function
|
|
41
|
+
|
|
42
|
+
- `iter<T>(src: Iterable<T>): Iterflow<T>` Wrap any iterable.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
### Transform Methods
|
|
47
|
+
|
|
48
|
+
Transform methods return a new `Iterflow<T>` and are lazily evaluated. No computation happens until a terminal method is called.
|
|
49
|
+
|
|
50
|
+
- `.map<U>(fn: (v: T, i: number) => U): Iterflow<U>` Transform each element.
|
|
51
|
+
- `.filter(fn: (v: T, i: number) => boolean): Iterflow<T>` Keep matching elements.
|
|
52
|
+
- `.flatMap<U>(fn: (v: T, i: number) => Iterable<U>): Iterflow<U>` Map and flatten.
|
|
53
|
+
- `.take(n: number): Iterflow<T>` First n elements.
|
|
54
|
+
- `.drop(n: number): Iterflow<T>` Skip first n elements.
|
|
55
|
+
- `.takeWhile(fn: (v: T, i: number) => boolean): Iterflow<T>` Take while predicate is true.
|
|
56
|
+
- `.dropWhile(fn: (v: T, i: number) => boolean): Iterflow<T>` Skip while predicate is true.
|
|
57
|
+
- `.distinct(): Iterflow<T>` Remove duplicates.
|
|
58
|
+
- `.enumerate(): Iterflow<[number, T]>` Yield [index, value] pairs.
|
|
59
|
+
- `.concat<U>(...others: Iterable<U>[]): Iterflow<T | U>` Append iterables.
|
|
60
|
+
- `.window(size: number): Iterflow<T[]>` Sliding windows.
|
|
61
|
+
- `.chunk(size: number): Iterflow<T[]>` Fixed-size chunks.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
### Terminal Methods
|
|
66
|
+
|
|
67
|
+
Terminal methods consume the iterator and return concrete values.
|
|
68
|
+
|
|
69
|
+
- `.toArray(): T[]` Collect to array.
|
|
70
|
+
- `.reduce<U>(fn: (acc: U, v: T, i: number) => U, init: U): U` Fold to single value.
|
|
71
|
+
- `.find(fn: (v: T, i: number) => boolean): T | undefined` First matching element.
|
|
72
|
+
- `.forEach(fn: (v: T, i: number) => void): void` Execute function for each.
|
|
73
|
+
- `.first(): T | undefined` First element.
|
|
74
|
+
- `.last(): T | undefined` Last element.
|
|
75
|
+
- `.count(): number` Count elements.
|
|
76
|
+
- `.some(fn: (v: T, i: number) => boolean): boolean` Any match?
|
|
77
|
+
- `.every(fn: (v: T, i: number) => boolean): boolean` All match?
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
### Statistical Methods
|
|
82
|
+
|
|
83
|
+
Statistical methods only work on `Iterflow<number>` and throw `EmptySequenceError` on empty sequences.
|
|
84
|
+
|
|
85
|
+
- `.sum(): number` Sum.
|
|
86
|
+
- `.mean(): number` Arithmetic mean.
|
|
87
|
+
- `.median(): number` Median (50th percentile).
|
|
88
|
+
- `.min(): number` Minimum.
|
|
89
|
+
- `.max(): number` Maximum.
|
|
90
|
+
- `.variance(): number` Population variance.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
### Standalone Functions
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
import { sum, mean, median, min, max, variance } from '@mathscapes/iterflow';
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
- `sum(src: Iterable<number>): number`
|
|
101
|
+
- `mean(src: Iterable<number>): number`
|
|
102
|
+
- `median(src: Iterable<number>): number`
|
|
103
|
+
- `min(src: Iterable<number>): number`
|
|
104
|
+
- `max(src: Iterable<number>): number`
|
|
105
|
+
- `variance(src: Iterable<number>): number`
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
### Error Classes
|
|
110
|
+
|
|
111
|
+
- `IterflowError` Base error class.
|
|
112
|
+
- `EmptySequenceError` Thrown by statistical methods on empty sequences. Has `op: string` property.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
### Type Exports
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
import type { Predicate, Mapper, Reducer, FlatMapper } from '@mathscapes/iterflow';
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
- `Predicate<T>` = `(v: T, i: number) => boolean`
|
|
123
|
+
- `Mapper<T, U>` = `(v: T, i: number) => U`
|
|
124
|
+
- `Reducer<T, U>` = `(acc: U, v: T, i: number) => U`
|
|
125
|
+
- `FlatMapper<T, U>` = `(v: T, i: number) => Iterable<U>`
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
### Utility Functions
|
|
130
|
+
|
|
131
|
+
- `isIterable(v: unknown): v is Iterable<unknown>` Type guard for iterables.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Benchmarks
|
|
136
|
+
|
|
137
|
+
Performance benchmarks comparing iterflow against Lodash, iter-ops, RxJS, and native methods are available in the [`benchmarks/`](benchmarks/) directory. See [benchmarks/README.md](benchmarks/README.md) for reproduction instructions.
|
|
138
|
+
|
|
139
|
+
## Examples
|
|
140
|
+
|
|
141
|
+
See the [`examples/`](examples/) directory for examples comparing iterflow with native JavaScript, Lodash, and RxJS.
|
|
142
|
+
|
|
143
|
+
## TypeScript
|
|
144
|
+
|
|
145
|
+
Full type inference. Statistical methods are constrained to `Iterflow<number>`:
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
iter(['a', 'b', 'c']).sum() // TypeScript error
|
|
149
|
+
iter([1, 2, 3]).sum() // OK: number
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## License
|
|
153
|
+
|
|
154
|
+
MIT
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
EmptySequenceError: () => EmptySequenceError,
|
|
24
|
+
Iterflow: () => Iterflow,
|
|
25
|
+
IterflowError: () => IterflowError,
|
|
26
|
+
isIterable: () => isIterable,
|
|
27
|
+
iter: () => iter,
|
|
28
|
+
max: () => max,
|
|
29
|
+
mean: () => mean,
|
|
30
|
+
median: () => median,
|
|
31
|
+
min: () => min,
|
|
32
|
+
sum: () => sum,
|
|
33
|
+
variance: () => variance
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(index_exports);
|
|
36
|
+
|
|
37
|
+
// src/core.ts
|
|
38
|
+
var IterflowError = class extends Error {
|
|
39
|
+
constructor(msg) {
|
|
40
|
+
super(msg);
|
|
41
|
+
this.name = "IterflowError";
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
var EmptySequenceError = class extends IterflowError {
|
|
45
|
+
constructor(op) {
|
|
46
|
+
super(`Cannot compute ${op} of empty sequence`);
|
|
47
|
+
this.op = op;
|
|
48
|
+
this.name = "EmptySequenceError";
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
var isIterable = (v) => v != null && typeof v === "object" && Symbol.iterator in v;
|
|
52
|
+
|
|
53
|
+
// src/internal.ts
|
|
54
|
+
function makeTransform(src, generator) {
|
|
55
|
+
return {
|
|
56
|
+
*[Symbol.iterator]() {
|
|
57
|
+
yield* generator(src);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function assertNonEmpty(count2, op) {
|
|
62
|
+
if (count2 === 0) {
|
|
63
|
+
throw new EmptySequenceError(op);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function assertHasValue(has, op) {
|
|
67
|
+
if (!has) {
|
|
68
|
+
throw new EmptySequenceError(op);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function validateInteger(n, param) {
|
|
72
|
+
if (!Number.isFinite(n)) {
|
|
73
|
+
throw new RangeError(`${param} must be finite`);
|
|
74
|
+
}
|
|
75
|
+
if (!Number.isInteger(n)) {
|
|
76
|
+
throw new TypeError(`${param} must be an integer`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function validateNonNegative(n, param) {
|
|
80
|
+
validateInteger(n, param);
|
|
81
|
+
if (n < 0) {
|
|
82
|
+
throw new RangeError(`${param} must be non-negative`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
function validatePositive(n, param) {
|
|
86
|
+
validateInteger(n, param);
|
|
87
|
+
if (n <= 0) {
|
|
88
|
+
throw new RangeError(`${param} must be positive`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// src/transforms.ts
|
|
93
|
+
function map(src, fn) {
|
|
94
|
+
return makeTransform(src, function* (s) {
|
|
95
|
+
let i = 0;
|
|
96
|
+
for (const v of s) yield fn(v, i++);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
function flatMap(src, fn) {
|
|
100
|
+
return makeTransform(src, function* (s) {
|
|
101
|
+
let i = 0;
|
|
102
|
+
for (const v of s) yield* fn(v, i++);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
function enumerate(src) {
|
|
106
|
+
return makeTransform(src, function* (s) {
|
|
107
|
+
let i = 0;
|
|
108
|
+
for (const v of s) yield [i++, v];
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
function filter(src, fn) {
|
|
112
|
+
return makeTransform(src, function* (s) {
|
|
113
|
+
let i = 0;
|
|
114
|
+
for (const v of s) if (fn(v, i++)) yield v;
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
function take(src, n) {
|
|
118
|
+
validateNonNegative(n, "Count");
|
|
119
|
+
return makeTransform(src, function* (s) {
|
|
120
|
+
let remaining = n;
|
|
121
|
+
for (const v of s) {
|
|
122
|
+
if (remaining-- <= 0) break;
|
|
123
|
+
yield v;
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
function drop(src, n) {
|
|
128
|
+
validateNonNegative(n, "Count");
|
|
129
|
+
return makeTransform(src, function* (s) {
|
|
130
|
+
let i = 0;
|
|
131
|
+
for (const v of s) if (i++ >= n) yield v;
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
function takeWhile(src, fn) {
|
|
135
|
+
return makeTransform(src, function* (s) {
|
|
136
|
+
let i = 0;
|
|
137
|
+
for (const v of s) {
|
|
138
|
+
if (!fn(v, i++)) break;
|
|
139
|
+
yield v;
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
function dropWhile(src, fn) {
|
|
144
|
+
return makeTransform(src, function* (s) {
|
|
145
|
+
let i = 0, dropping = true;
|
|
146
|
+
for (const v of s) {
|
|
147
|
+
if (dropping && !fn(v, i)) dropping = false;
|
|
148
|
+
if (!dropping) yield v;
|
|
149
|
+
i++;
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
function distinct(src) {
|
|
154
|
+
return makeTransform(src, function* (s) {
|
|
155
|
+
const seen = /* @__PURE__ */ new Set();
|
|
156
|
+
for (const v of s) {
|
|
157
|
+
if (!seen.has(v)) {
|
|
158
|
+
seen.add(v);
|
|
159
|
+
yield v;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
function window(src, size) {
|
|
165
|
+
validatePositive(size, "Window size");
|
|
166
|
+
return makeTransform(src, function* (s) {
|
|
167
|
+
const buf = [];
|
|
168
|
+
for (const v of s) {
|
|
169
|
+
buf.push(v);
|
|
170
|
+
if (buf.length === size) {
|
|
171
|
+
yield buf.slice();
|
|
172
|
+
buf.shift();
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
function chunk(src, size) {
|
|
178
|
+
validatePositive(size, "Chunk size");
|
|
179
|
+
return makeTransform(src, function* (s) {
|
|
180
|
+
let batch = [];
|
|
181
|
+
for (const v of s) {
|
|
182
|
+
batch.push(v);
|
|
183
|
+
if (batch.length === size) {
|
|
184
|
+
yield batch;
|
|
185
|
+
batch = [];
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (batch.length) yield batch;
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
function concat(src, ...others) {
|
|
192
|
+
return makeTransform(src, function* (s) {
|
|
193
|
+
yield* s;
|
|
194
|
+
for (const o of others) yield* o;
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// src/terminals.ts
|
|
199
|
+
function toArray(src) {
|
|
200
|
+
return Array.from(src);
|
|
201
|
+
}
|
|
202
|
+
function reduce(src, fn, init) {
|
|
203
|
+
let acc = init, i = 0;
|
|
204
|
+
for (const v of src) acc = fn(acc, v, i++);
|
|
205
|
+
return acc;
|
|
206
|
+
}
|
|
207
|
+
function find(src, fn) {
|
|
208
|
+
let i = 0;
|
|
209
|
+
for (const v of src) if (fn(v, i++)) return v;
|
|
210
|
+
return void 0;
|
|
211
|
+
}
|
|
212
|
+
function forEach(src, fn) {
|
|
213
|
+
let i = 0;
|
|
214
|
+
for (const v of src) fn(v, i++);
|
|
215
|
+
}
|
|
216
|
+
function first(src) {
|
|
217
|
+
for (const v of src) return v;
|
|
218
|
+
return void 0;
|
|
219
|
+
}
|
|
220
|
+
function last(src) {
|
|
221
|
+
if (Array.isArray(src)) return src[src.length - 1];
|
|
222
|
+
let last2;
|
|
223
|
+
for (const v of src) last2 = v;
|
|
224
|
+
return last2;
|
|
225
|
+
}
|
|
226
|
+
function count(src) {
|
|
227
|
+
if (Array.isArray(src)) return src.length;
|
|
228
|
+
let n = 0;
|
|
229
|
+
for (const _ of src) n++;
|
|
230
|
+
return n;
|
|
231
|
+
}
|
|
232
|
+
function some(src, fn) {
|
|
233
|
+
let i = 0;
|
|
234
|
+
for (const v of src) if (fn(v, i++)) return true;
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
function every(src, fn) {
|
|
238
|
+
let i = 0;
|
|
239
|
+
for (const v of src) if (!fn(v, i++)) return false;
|
|
240
|
+
return true;
|
|
241
|
+
}
|
|
242
|
+
var sum = (src) => {
|
|
243
|
+
let total = 0, count2 = 0;
|
|
244
|
+
for (const v of src) {
|
|
245
|
+
total += v;
|
|
246
|
+
count2++;
|
|
247
|
+
}
|
|
248
|
+
assertNonEmpty(count2, "sum");
|
|
249
|
+
return total;
|
|
250
|
+
};
|
|
251
|
+
var mean = (src) => {
|
|
252
|
+
let total = 0, count2 = 0;
|
|
253
|
+
for (const v of src) {
|
|
254
|
+
total += v;
|
|
255
|
+
count2++;
|
|
256
|
+
}
|
|
257
|
+
assertNonEmpty(count2, "mean");
|
|
258
|
+
return total / count2;
|
|
259
|
+
};
|
|
260
|
+
function partition(arr, left, right) {
|
|
261
|
+
const pivot = arr[right];
|
|
262
|
+
let i = left;
|
|
263
|
+
for (let j = left; j < right; j++) {
|
|
264
|
+
if (arr[j] < pivot) {
|
|
265
|
+
[arr[i], arr[j]] = [arr[j], arr[i]];
|
|
266
|
+
i++;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
[arr[i], arr[right]] = [arr[right], arr[i]];
|
|
270
|
+
return i;
|
|
271
|
+
}
|
|
272
|
+
function quickselect(arr, k) {
|
|
273
|
+
let left = 0;
|
|
274
|
+
let right = arr.length - 1;
|
|
275
|
+
while (left < right) {
|
|
276
|
+
const pivotIndex = partition(arr, left, right);
|
|
277
|
+
if (pivotIndex === k) {
|
|
278
|
+
return arr[k];
|
|
279
|
+
} else if (pivotIndex > k) {
|
|
280
|
+
right = pivotIndex - 1;
|
|
281
|
+
} else {
|
|
282
|
+
left = pivotIndex + 1;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return arr[left];
|
|
286
|
+
}
|
|
287
|
+
var median = (src) => {
|
|
288
|
+
const arr = Array.from(src);
|
|
289
|
+
assertNonEmpty(arr.length, "median");
|
|
290
|
+
const mid = arr.length >> 1;
|
|
291
|
+
if (arr.length % 2) {
|
|
292
|
+
return quickselect(arr, mid);
|
|
293
|
+
} else {
|
|
294
|
+
const upper = quickselect(arr, mid);
|
|
295
|
+
const lower = quickselect(arr, mid - 1);
|
|
296
|
+
return (lower + upper) / 2;
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
var min = (src) => {
|
|
300
|
+
let result = Infinity, has = false;
|
|
301
|
+
for (const v of src) {
|
|
302
|
+
if (v < result) result = v;
|
|
303
|
+
has = true;
|
|
304
|
+
}
|
|
305
|
+
assertHasValue(has, "min");
|
|
306
|
+
return result;
|
|
307
|
+
};
|
|
308
|
+
var max = (src) => {
|
|
309
|
+
let result = -Infinity, has = false;
|
|
310
|
+
for (const v of src) {
|
|
311
|
+
if (v > result) result = v;
|
|
312
|
+
has = true;
|
|
313
|
+
}
|
|
314
|
+
assertHasValue(has, "max");
|
|
315
|
+
return result;
|
|
316
|
+
};
|
|
317
|
+
var variance = (src) => {
|
|
318
|
+
let count2 = 0;
|
|
319
|
+
let mean2 = 0;
|
|
320
|
+
let M2 = 0;
|
|
321
|
+
for (const x of src) {
|
|
322
|
+
count2++;
|
|
323
|
+
const delta = x - mean2;
|
|
324
|
+
mean2 += delta / count2;
|
|
325
|
+
const delta2 = x - mean2;
|
|
326
|
+
M2 += delta * delta2;
|
|
327
|
+
}
|
|
328
|
+
assertNonEmpty(count2, "variance");
|
|
329
|
+
return M2 / count2;
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
// src/index.ts
|
|
333
|
+
var Iterflow = class _Iterflow {
|
|
334
|
+
constructor(src) {
|
|
335
|
+
this.src = src;
|
|
336
|
+
}
|
|
337
|
+
[Symbol.iterator]() {
|
|
338
|
+
return this.src[Symbol.iterator]();
|
|
339
|
+
}
|
|
340
|
+
// Transforms
|
|
341
|
+
map(fn) {
|
|
342
|
+
return new _Iterflow(map(this.src, fn));
|
|
343
|
+
}
|
|
344
|
+
filter(fn) {
|
|
345
|
+
return new _Iterflow(filter(this.src, fn));
|
|
346
|
+
}
|
|
347
|
+
flatMap(fn) {
|
|
348
|
+
return new _Iterflow(flatMap(this.src, fn));
|
|
349
|
+
}
|
|
350
|
+
take(n) {
|
|
351
|
+
return new _Iterflow(take(this.src, n));
|
|
352
|
+
}
|
|
353
|
+
drop(n) {
|
|
354
|
+
return new _Iterflow(drop(this.src, n));
|
|
355
|
+
}
|
|
356
|
+
takeWhile(fn) {
|
|
357
|
+
return new _Iterflow(takeWhile(this.src, fn));
|
|
358
|
+
}
|
|
359
|
+
dropWhile(fn) {
|
|
360
|
+
return new _Iterflow(dropWhile(this.src, fn));
|
|
361
|
+
}
|
|
362
|
+
distinct() {
|
|
363
|
+
return new _Iterflow(distinct(this.src));
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Yield [index, value] pairs.
|
|
367
|
+
*/
|
|
368
|
+
enumerate() {
|
|
369
|
+
return new _Iterflow(enumerate(this.src));
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Append additional iterables to the sequence.
|
|
373
|
+
*/
|
|
374
|
+
concat(...others) {
|
|
375
|
+
return new _Iterflow(concat(this.src, ...others));
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Create sliding windows of the specified size.
|
|
379
|
+
*/
|
|
380
|
+
window(size) {
|
|
381
|
+
return new _Iterflow(window(this.src, size));
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Split the sequence into fixed-size chunks.
|
|
385
|
+
*/
|
|
386
|
+
chunk(size) {
|
|
387
|
+
return new _Iterflow(chunk(this.src, size));
|
|
388
|
+
}
|
|
389
|
+
// Terminals
|
|
390
|
+
toArray() {
|
|
391
|
+
return toArray(this.src);
|
|
392
|
+
}
|
|
393
|
+
reduce(fn, init) {
|
|
394
|
+
return reduce(this.src, fn, init);
|
|
395
|
+
}
|
|
396
|
+
find(fn) {
|
|
397
|
+
return find(this.src, fn);
|
|
398
|
+
}
|
|
399
|
+
forEach(fn) {
|
|
400
|
+
forEach(this.src, fn);
|
|
401
|
+
}
|
|
402
|
+
first() {
|
|
403
|
+
return first(this.src);
|
|
404
|
+
}
|
|
405
|
+
last() {
|
|
406
|
+
return last(this.src);
|
|
407
|
+
}
|
|
408
|
+
count() {
|
|
409
|
+
return count(this.src);
|
|
410
|
+
}
|
|
411
|
+
some(fn) {
|
|
412
|
+
return some(this.src, fn);
|
|
413
|
+
}
|
|
414
|
+
every(fn) {
|
|
415
|
+
return every(this.src, fn);
|
|
416
|
+
}
|
|
417
|
+
// Stats (numbers only)
|
|
418
|
+
/**
|
|
419
|
+
* Calculate the sum of all numbers.
|
|
420
|
+
* @throws {EmptySequenceError} If the sequence is empty.
|
|
421
|
+
*/
|
|
422
|
+
sum() {
|
|
423
|
+
return sum(this.src);
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Calculate the arithmetic mean.
|
|
427
|
+
* @throws {EmptySequenceError} If the sequence is empty.
|
|
428
|
+
*/
|
|
429
|
+
mean() {
|
|
430
|
+
return mean(this.src);
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Calculate the median (50th percentile).
|
|
434
|
+
* @throws {EmptySequenceError} If the sequence is empty.
|
|
435
|
+
*/
|
|
436
|
+
median() {
|
|
437
|
+
return median(this.src);
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Find the minimum value.
|
|
441
|
+
* @throws {EmptySequenceError} If the sequence is empty.
|
|
442
|
+
*/
|
|
443
|
+
min() {
|
|
444
|
+
return min(this.src);
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Find the maximum value.
|
|
448
|
+
* @throws {EmptySequenceError} If the sequence is empty.
|
|
449
|
+
*/
|
|
450
|
+
max() {
|
|
451
|
+
return max(this.src);
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Calculate the population variance.
|
|
455
|
+
* @throws {EmptySequenceError} If the sequence is empty.
|
|
456
|
+
*/
|
|
457
|
+
variance() {
|
|
458
|
+
return variance(this.src);
|
|
459
|
+
}
|
|
460
|
+
};
|
|
461
|
+
function iter(src) {
|
|
462
|
+
return new Iterflow(src);
|
|
463
|
+
}
|
|
464
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
465
|
+
0 && (module.exports = {
|
|
466
|
+
EmptySequenceError,
|
|
467
|
+
Iterflow,
|
|
468
|
+
IterflowError,
|
|
469
|
+
isIterable,
|
|
470
|
+
iter,
|
|
471
|
+
max,
|
|
472
|
+
mean,
|
|
473
|
+
median,
|
|
474
|
+
min,
|
|
475
|
+
sum,
|
|
476
|
+
variance
|
|
477
|
+
});
|
|
478
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +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"]}
|