@johnhenry/iteration 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/async-channel.d.ts +24 -4
- package/dist/async-channel.d.ts.map +1 -1
- package/dist/async-channel.js +41 -38
- package/dist/async-channel.js.map +1 -1
- package/dist/combine.d.ts +146 -0
- package/dist/combine.d.ts.map +1 -0
- package/dist/combine.js +353 -0
- package/dist/combine.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +66 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +134 -0
- package/dist/internal.js.map +1 -0
- package/dist/iterator-tools.d.ts +13 -0
- package/dist/iterator-tools.d.ts.map +1 -1
- package/dist/iterator-tools.js +38 -18
- package/dist/iterator-tools.js.map +1 -1
- package/dist/itertools.d.ts.map +1 -1
- package/dist/itertools.js +42 -24
- package/dist/itertools.js.map +1 -1
- package/dist/tee.d.ts +24 -2
- package/dist/tee.d.ts.map +1 -1
- package/dist/tee.js +175 -2
- package/dist/tee.js.map +1 -1
- package/dist/time.d.ts +69 -0
- package/dist/time.d.ts.map +1 -0
- package/dist/time.js +234 -0
- package/dist/time.js.map +1 -0
- package/dist/transduce.d.ts +65 -0
- package/dist/transduce.d.ts.map +1 -1
- package/dist/transduce.js +33 -1
- package/dist/transduce.js.map +1 -1
- package/dist/transducers.d.ts.map +1 -1
- package/dist/transducers.js +86 -16
- package/dist/transducers.js.map +1 -1
- package/package.json +10 -2
- package/readme.md +338 -14
- package/src/async-channel.ts +63 -47
- package/src/combine.ts +441 -0
- package/src/index.ts +2 -0
- package/src/internal.ts +164 -0
- package/src/iterator-tools.ts +48 -20
- package/src/itertools.ts +36 -23
- package/src/tee.ts +202 -2
- package/src/time.ts +262 -0
- package/src/transduce.ts +113 -1
- package/src/transducers.ts +121 -30
package/dist/time.js
ADDED
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Time-based operators: debounceAsync and throttleAsync.
|
|
3
|
+
*
|
|
4
|
+
* Both drain their source eagerly (timing depends on when values arrive,
|
|
5
|
+
* not on when the consumer reads) and queue what they emit until the
|
|
6
|
+
* consumer reads it. Both take an injectable `clock`, so they can be driven
|
|
7
|
+
* by a fake clock in tests or by a host's own scheduler, and an optional
|
|
8
|
+
* `signal`. On abort, on a source error, and on consumer exit they clear
|
|
9
|
+
* their timer and close (`return()`) the source.
|
|
10
|
+
*/
|
|
11
|
+
import { throwIfAborted } from "./abort.js";
|
|
12
|
+
import { closeAll, createFailure, entryOf, listenAbort, pull, Wakeup } from "./internal.js";
|
|
13
|
+
/** The host's timers. */
|
|
14
|
+
export const systemClock = {
|
|
15
|
+
setTimeout: (callback, ms) => globalThis.setTimeout(callback, ms),
|
|
16
|
+
clearTimeout: (handle) => globalThis.clearTimeout(handle),
|
|
17
|
+
now: () => (typeof globalThis.performance?.now === "function" ? globalThis.performance.now() : Date.now()),
|
|
18
|
+
};
|
|
19
|
+
const checkMs = (name, ms) => {
|
|
20
|
+
if (!(typeof ms === "number" && ms >= 0 && Number.isFinite(ms))) {
|
|
21
|
+
throw new RangeError(`${name}: ms must be a finite number >= 0`);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Run the shared machinery of a time operator: pump the source, hand each
|
|
26
|
+
* value and the end to `hooks`, and yield whatever they emit, in order.
|
|
27
|
+
*/
|
|
28
|
+
const timed = async function* (iterable, { signal }, setup) {
|
|
29
|
+
throwIfAborted(signal);
|
|
30
|
+
const entry = entryOf(iterable);
|
|
31
|
+
const aborted = createFailure();
|
|
32
|
+
const wakeup = new Wakeup();
|
|
33
|
+
const queue = [];
|
|
34
|
+
let ended = false;
|
|
35
|
+
let stopped = false;
|
|
36
|
+
let sourceError;
|
|
37
|
+
const hooks = setup((value) => {
|
|
38
|
+
queue.push(value);
|
|
39
|
+
wakeup.wake();
|
|
40
|
+
});
|
|
41
|
+
const unlisten = listenAbort(signal, (reason) => {
|
|
42
|
+
aborted.fail(reason);
|
|
43
|
+
wakeup.wake();
|
|
44
|
+
});
|
|
45
|
+
const pump = async () => {
|
|
46
|
+
try {
|
|
47
|
+
while (!stopped) {
|
|
48
|
+
const result = await pull(entry);
|
|
49
|
+
if (stopped)
|
|
50
|
+
return;
|
|
51
|
+
if (result.done) {
|
|
52
|
+
hooks.onEnd();
|
|
53
|
+
ended = true;
|
|
54
|
+
wakeup.wake();
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
hooks.onValue(result.value);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
hooks.dispose(); // drop a waiting value; stop the timer
|
|
62
|
+
sourceError = { error };
|
|
63
|
+
wakeup.wake();
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
try {
|
|
67
|
+
void pump();
|
|
68
|
+
while (true) {
|
|
69
|
+
// Abort wins at once; a source error comes after the values that
|
|
70
|
+
// were already emitted.
|
|
71
|
+
if (aborted.failed)
|
|
72
|
+
throw aborted.error;
|
|
73
|
+
if (queue.length > 0) {
|
|
74
|
+
yield queue.shift();
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (sourceError)
|
|
78
|
+
throw sourceError.error;
|
|
79
|
+
if (ended)
|
|
80
|
+
return;
|
|
81
|
+
await Promise.race([wakeup.wait(), aborted.promise]);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
stopped = true;
|
|
86
|
+
hooks.dispose();
|
|
87
|
+
unlisten();
|
|
88
|
+
await closeAll([entry]);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Emit a value only after `ms` have passed with no newer value: a burst of
|
|
93
|
+
* values becomes its last value, emitted `ms` after the burst ends. When
|
|
94
|
+
* the source ends, a value still waiting is emitted at once.
|
|
95
|
+
*
|
|
96
|
+
* Emitted values queue until the consumer reads them. A source error is
|
|
97
|
+
* rethrown after the queued values; a value still waiting for its quiet
|
|
98
|
+
* period is dropped.
|
|
99
|
+
* @kind function
|
|
100
|
+
* @name debounceAsync
|
|
101
|
+
* @example
|
|
102
|
+
* ```javascript
|
|
103
|
+
* for await (const query of debounceAsync(250, keystrokes)) search(query);
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
export const debounceAsync = (ms, iterable, { clock = systemClock, signal } = {}) => {
|
|
107
|
+
checkMs("debounceAsync", ms);
|
|
108
|
+
return timed(iterable, { signal }, (emit) => {
|
|
109
|
+
let timer;
|
|
110
|
+
let armed = false;
|
|
111
|
+
let waiting = false;
|
|
112
|
+
let value;
|
|
113
|
+
let lastAt = 0;
|
|
114
|
+
const fire = () => {
|
|
115
|
+
armed = false;
|
|
116
|
+
if (!waiting)
|
|
117
|
+
return;
|
|
118
|
+
// Re-arm rather than reset the timer on every value: one timer per
|
|
119
|
+
// quiet period instead of one per value.
|
|
120
|
+
const elapsed = clock.now() - lastAt;
|
|
121
|
+
if (elapsed < ms) {
|
|
122
|
+
armed = true;
|
|
123
|
+
timer = clock.setTimeout(fire, ms - elapsed);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const out = value;
|
|
127
|
+
waiting = false;
|
|
128
|
+
value = undefined;
|
|
129
|
+
emit(out);
|
|
130
|
+
};
|
|
131
|
+
return {
|
|
132
|
+
onValue(next) {
|
|
133
|
+
value = next;
|
|
134
|
+
waiting = true;
|
|
135
|
+
lastAt = clock.now();
|
|
136
|
+
if (!armed) {
|
|
137
|
+
armed = true;
|
|
138
|
+
timer = clock.setTimeout(fire, ms);
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
onEnd() {
|
|
142
|
+
if (armed)
|
|
143
|
+
clock.clearTimeout(timer);
|
|
144
|
+
armed = false;
|
|
145
|
+
if (waiting) {
|
|
146
|
+
waiting = false;
|
|
147
|
+
emit(value);
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
dispose() {
|
|
151
|
+
if (armed)
|
|
152
|
+
clock.clearTimeout(timer);
|
|
153
|
+
armed = false;
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
});
|
|
157
|
+
};
|
|
158
|
+
/**
|
|
159
|
+
* Emit at most one value per `ms` window. A value arriving while no window
|
|
160
|
+
* is open opens one, and is emitted at once if `leading` (default `true`).
|
|
161
|
+
* With `trailing` (default `true`), the newest value that arrived during a
|
|
162
|
+
* window is emitted when the window closes, which opens the next window.
|
|
163
|
+
* When the source ends, a trailing value still waiting is emitted at once.
|
|
164
|
+
*
|
|
165
|
+
* `leading` and `trailing` cannot both be false. Emitted values queue
|
|
166
|
+
* until the consumer reads them. A source error is rethrown after the
|
|
167
|
+
* queued values; a trailing value still waiting is dropped.
|
|
168
|
+
* @kind function
|
|
169
|
+
* @name throttleAsync
|
|
170
|
+
* @example
|
|
171
|
+
* ```javascript
|
|
172
|
+
* for await (const position of throttleAsync(16, pointerMoves)) draw(position);
|
|
173
|
+
* ```
|
|
174
|
+
*/
|
|
175
|
+
export const throttleAsync = (ms, iterable, { leading = true, trailing = true, clock = systemClock, signal } = {}) => {
|
|
176
|
+
checkMs("throttleAsync", ms);
|
|
177
|
+
if (!leading && !trailing) {
|
|
178
|
+
throw new RangeError("throttleAsync: leading and trailing cannot both be false");
|
|
179
|
+
}
|
|
180
|
+
return timed(iterable, { signal }, (emit) => {
|
|
181
|
+
let timer;
|
|
182
|
+
let open = false;
|
|
183
|
+
let waiting = false;
|
|
184
|
+
let value;
|
|
185
|
+
const close = () => {
|
|
186
|
+
open = false;
|
|
187
|
+
if (trailing && waiting) {
|
|
188
|
+
const out = value;
|
|
189
|
+
waiting = false;
|
|
190
|
+
value = undefined;
|
|
191
|
+
emit(out);
|
|
192
|
+
openWindow();
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
const openWindow = () => {
|
|
196
|
+
open = true;
|
|
197
|
+
timer = clock.setTimeout(close, ms);
|
|
198
|
+
};
|
|
199
|
+
return {
|
|
200
|
+
onValue(next) {
|
|
201
|
+
if (open) {
|
|
202
|
+
if (trailing) {
|
|
203
|
+
value = next;
|
|
204
|
+
waiting = true;
|
|
205
|
+
}
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
if (leading) {
|
|
209
|
+
emit(next);
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
value = next;
|
|
213
|
+
waiting = true;
|
|
214
|
+
}
|
|
215
|
+
openWindow();
|
|
216
|
+
},
|
|
217
|
+
onEnd() {
|
|
218
|
+
if (open)
|
|
219
|
+
clock.clearTimeout(timer);
|
|
220
|
+
open = false;
|
|
221
|
+
if (trailing && waiting) {
|
|
222
|
+
waiting = false;
|
|
223
|
+
emit(value);
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
dispose() {
|
|
227
|
+
if (open)
|
|
228
|
+
clock.clearTimeout(timer);
|
|
229
|
+
open = false;
|
|
230
|
+
},
|
|
231
|
+
};
|
|
232
|
+
});
|
|
233
|
+
};
|
|
234
|
+
//# sourceMappingURL=time.js.map
|
package/dist/time.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.js","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"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"}
|
package/dist/transduce.d.ts
CHANGED
|
@@ -76,4 +76,69 @@ export declare function transduceSync<A, B, C, D>(t1: Transducer<A, B>, t2: Tran
|
|
|
76
76
|
export declare function transduceSync<A, B, C, D, E>(t1: Transducer<A, B>, t2: Transducer<B, C>, t3: Transducer<C, D>, t4: Transducer<D, E>): (itemCollection: Iterable<A>) => Generator<E>;
|
|
77
77
|
export declare function transduceSync<A, B, C, D, E, F>(t1: Transducer<A, B>, t2: Transducer<B, C>, t3: Transducer<C, D>, t4: Transducer<D, E>, t5: Transducer<E, F>): (itemCollection: Iterable<A>) => Generator<F>;
|
|
78
78
|
export declare function transduceSync(...functions: Array<Transducer<any, any>>): (itemCollection: Iterable<unknown>) => Generator<unknown>;
|
|
79
|
+
/**
|
|
80
|
+
* A push-driven transducer pipeline: feed values in one at a time with
|
|
81
|
+
* `step`, and flush with `complete` when the input ends.
|
|
82
|
+
*/
|
|
83
|
+
export interface PushTransducer<In, Out> {
|
|
84
|
+
/**
|
|
85
|
+
* Run one value through the pipeline and return what it emitted (often
|
|
86
|
+
* zero or one item; `group` and friends may emit several). Returns `[]`
|
|
87
|
+
* once the pipeline has halted or completed.
|
|
88
|
+
*/
|
|
89
|
+
step(value: In): Out[];
|
|
90
|
+
/**
|
|
91
|
+
* Flush stateful transducers (`.complete`, e.g. a trailing partial
|
|
92
|
+
* `group`) and return what they emitted. Call it once when the input
|
|
93
|
+
* ends, or after `halted` becomes true. Later calls return `[]`.
|
|
94
|
+
*/
|
|
95
|
+
complete(): Out[];
|
|
96
|
+
/**
|
|
97
|
+
* What the stateful transducers keep between steps, upstream first: a
|
|
98
|
+
* half-full `group`'s items, `partitionBy`'s open run, `accumulate`'s
|
|
99
|
+
* running value, `dedupe`'s last key. A copy: changing it changes nothing.
|
|
100
|
+
*/
|
|
101
|
+
held(): unknown[];
|
|
102
|
+
/**
|
|
103
|
+
* Let go of the held items `predicate` matches, and return how many. For a
|
|
104
|
+
* caller that must stop an operator keeping something (a value removed
|
|
105
|
+
* elsewhere). It never emits and never changes what is later emitted
|
|
106
|
+
* beyond leaving the dropped items out: a `group` still waits for its full
|
|
107
|
+
* size, a `partitionBy` run left empty is closed without being emitted,
|
|
108
|
+
* `accumulate` starts again from its initial value, and `dedupe` forgets
|
|
109
|
+
* its key (so an equal item passes once).
|
|
110
|
+
*/
|
|
111
|
+
drop(predicate: (held: unknown) => boolean): number;
|
|
112
|
+
/** True once a transducer returned HALT (e.g. `take(n)` saw item n + 1). */
|
|
113
|
+
readonly halted: boolean;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Drive transducers by pushing values in, with no iterator: for code that
|
|
117
|
+
* receives values by callback (an event handler, a wire in a dataflow
|
|
118
|
+
* graph). Uses the same left-to-right composition order, `.complete` flush
|
|
119
|
+
* protocol and HALT semantics as transduceSync:
|
|
120
|
+
* `transduceSync(...t)(xs)` yields exactly what pushing each `x` through
|
|
121
|
+
* `step` and then calling `complete()` returns.
|
|
122
|
+
*
|
|
123
|
+
* Like transduceSync, the items emitted by the step that returns HALT are
|
|
124
|
+
* discarded.
|
|
125
|
+
* @kind function
|
|
126
|
+
* @name transducePush
|
|
127
|
+
* @example
|
|
128
|
+
* ```javascript
|
|
129
|
+
* import { transducePush, transducers } from '@johnhenry/iteration';
|
|
130
|
+
* const { map, group } = transducers;
|
|
131
|
+
* const pipe = transducePush(map((x) => x * 10), group(2));
|
|
132
|
+
* pipe.step(1); // []
|
|
133
|
+
* pipe.step(2); // [[10, 20]]
|
|
134
|
+
* pipe.step(3); // []
|
|
135
|
+
* pipe.complete(); // [[30]]
|
|
136
|
+
* ```
|
|
137
|
+
*/
|
|
138
|
+
export declare function transducePush<A, B>(t1: Transducer<A, B>): PushTransducer<A, B>;
|
|
139
|
+
export declare function transducePush<A, B, C>(t1: Transducer<A, B>, t2: Transducer<B, C>): PushTransducer<A, C>;
|
|
140
|
+
export declare function transducePush<A, B, C, D>(t1: Transducer<A, B>, t2: Transducer<B, C>, t3: Transducer<C, D>): PushTransducer<A, D>;
|
|
141
|
+
export declare function transducePush<A, B, C, D, E>(t1: Transducer<A, B>, t2: Transducer<B, C>, t3: Transducer<C, D>, t4: Transducer<D, E>): PushTransducer<A, E>;
|
|
142
|
+
export declare function transducePush<A, B, C, D, E, F>(t1: Transducer<A, B>, t2: Transducer<B, C>, t3: Transducer<C, D>, t4: Transducer<D, E>, t5: Transducer<E, F>): PushTransducer<A, F>;
|
|
143
|
+
export declare function transducePush(...functions: Array<Transducer<any, any>>): PushTransducer<unknown, unknown>;
|
|
79
144
|
//# sourceMappingURL=transduce.d.ts.map
|
package/dist/transduce.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transduce.d.ts","sourceRoot":"","sources":["../src/transduce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,
|
|
1
|
+
{"version":3,"file":"transduce.d.ts","sourceRoot":"","sources":["../src/transduce.ts"],"names":[],"mappings":"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"}
|
package/dist/transduce.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { abortable } from "./abort.js";
|
|
2
|
-
import { reduceAsync, reduceSync } from "./iterator-tools.js";
|
|
2
|
+
import { HALT, reduceAsync, reduceSync } from "./iterator-tools.js";
|
|
3
3
|
/**
|
|
4
4
|
* The innermost reducer step ("emit"): pushes an emitted item onto the
|
|
5
5
|
* pending-emission buffer (the accumulator) and returns the buffer.
|
|
@@ -34,4 +34,36 @@ export function transduceAsync(...functions) {
|
|
|
34
34
|
export function transduceSync(...functions) {
|
|
35
35
|
return (itemCollection) => reduceSync(itemCollection, composeFunctions(...functions)(emit), []);
|
|
36
36
|
}
|
|
37
|
+
export function transducePush(...functions) {
|
|
38
|
+
const step = composeFunctions(...functions)(emit);
|
|
39
|
+
let halted = false;
|
|
40
|
+
let completed = false;
|
|
41
|
+
return {
|
|
42
|
+
step(value) {
|
|
43
|
+
if (halted || completed)
|
|
44
|
+
return [];
|
|
45
|
+
const out = step([], value);
|
|
46
|
+
if (out === HALT) {
|
|
47
|
+
halted = true;
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
return out;
|
|
51
|
+
},
|
|
52
|
+
complete() {
|
|
53
|
+
if (completed)
|
|
54
|
+
return [];
|
|
55
|
+
completed = true;
|
|
56
|
+
return step.complete ? step.complete([]) : [];
|
|
57
|
+
},
|
|
58
|
+
held() {
|
|
59
|
+
return step.held ? step.held() : [];
|
|
60
|
+
},
|
|
61
|
+
drop(predicate) {
|
|
62
|
+
return step.drop ? step.drop(predicate) : 0;
|
|
63
|
+
},
|
|
64
|
+
get halted() {
|
|
65
|
+
return halted;
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
37
69
|
//# sourceMappingURL=transduce.js.map
|
package/dist/transduce.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transduce.js","sourceRoot":"","sources":["../src/transduce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAsB,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAoB,WAAW,EAAE,UAAU,EAAmB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"transduce.js","sourceRoot":"","sources":["../src/transduce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAsB,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAoB,WAAW,EAAE,UAAU,EAAmB,MAAM,qBAAqB,CAAC;AAEvG;;;;;;;;GAQG;AACH,MAAM,IAAI,GAAyB,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;IAClD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,cAAsB,EACtB,OAAyD,EACzD,WAA+B,EAC/B,IAAe,EACf,MAAqF,EAC7E,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;AAEhE;;;;;GAKG;AACH,MAAM,gBAAgB,GACpB,CAAC,GAAG,SAA8C,EAAE,EAAE,CACtD,CAAC,KAA2B,EAAwB,EAAE,CACpD,SAAS,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;AA0D/D,MAAM,UAAU,cAAc,CAAC,GAAG,SAAsC;IACtE,OAAO,CAAC,cAA0D,EAAE,EAAE,MAAM,KAAoB,EAAE,EAAE,EAAE,CACpG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,gBAAgB,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACvH,CAAC;AAwDD,MAAM,UAAU,aAAa,CAAC,GAAG,SAAsC;IACrE,OAAO,CAAC,cAAiC,EAAE,EAAE,CAAC,UAAU,CAAC,cAAc,EAAE,gBAAgB,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AACrH,CAAC;AAmFD,MAAM,UAAU,aAAa,CAAC,GAAG,SAAsC;IACrE,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,OAAO;QACL,IAAI,CAAC,KAAK;YACR,IAAI,MAAM,IAAI,SAAS;gBAAE,OAAO,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC5B,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACjB,MAAM,GAAG,IAAI,CAAC;gBACd,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;QACD,QAAQ;YACN,IAAI,SAAS;gBAAE,OAAO,EAAE,CAAC;YACzB,SAAS,GAAG,IAAI,CAAC;YACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,CAAC;QACD,IAAI;YACF,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,SAAS;YACZ,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,MAAM;YACR,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transducers.d.ts","sourceRoot":"","sources":["../src/transducers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAA0B,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"transducers.d.ts","sourceRoot":"","sources":["../src/transducers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAA0B,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAoD9E;;;;;;GAMG;AACH,eAAO,MAAM,GAAG,GACb,EAAE,EAAE,GAAG,EAAE,WAAW,CAAC,IAAI,EAAE,EAAE,KAAK,GAAG,KAAG,UAAU,CAAC,EAAE,EAAE,GAAG,CAEe,CAAC;AAE7E;;;;;;GAMG;AACH,eAAO,MAAM,MAAM,GAChB,EAAE,EAAE,WAAW,CAAC,IAAI,EAAE,EAAE,KAAK,OAAO,KAAG,UAAU,CAAC,EAAE,EAAE,EAAE,CAEiC,CAAC;AAE7F;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,GACd,EAAE,EAAE,OAAO,MAAM,KAAG,UAAU,CAAC,EAAE,EAAE,EAAE,CAKrC,CAAC;AAEJ;;;;;;;;GAQG;AACH,eAAO,MAAM,IAAI,GACd,EAAE,EAAE,OAAO,MAAM,KAAG,UAAU,CAAC,EAAE,EAAE,EAAE,CAQrC,CAAC;AAEJ;;;;;;;;;GASG;AACH,eAAO,MAAM,MAAM,GAChB,EAAE,EAAE,WAAW,CAAC,IAAI,EAAE,EAAE,KAAK,OAAO,KAAG,UAAU,CAAC,EAAE,EAAE,EAAE,CAEiC,CAAC;AAE7F;;;;;;;;;;GAUG;AACH,eAAO,MAAM,KAAK,GACf,EAAE,EAAE,OAAO,MAAM,KAAG,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,CAqBvC,CAAC;AAEJ;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,GACpB,EAAE,EAAE,GAAG,GAAG,EAAE,EACX,OAAM,CAAC,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,GACmC,EACzE,UAAS,GAAyB,KACjC,UAAU,CAAC,EAAE,EAAE,GAAG,CAwBpB,CAAC;AAEJ;;;;;;;;;;GAUG;AACH,eAAO,MAAM,MAAM,GAChB,EAAE,EAAE,QAAO,CAAC,IAAI,EAAE,EAAE,KAAK,OAAkB,KAAG,UAAU,CAAC,EAAE,EAAE,EAAE,CAuB/D,CAAC;AAEJ;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GACnB,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,WAAW,GAAG,KAAG,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,GAAG,CActD,CAAC;AAEJ;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,WAAW,GACrB,EAAE,EAAE,QAAO,CAAC,IAAI,EAAE,EAAE,KAAK,OAAkB,KAAG,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,CA0CjE,CAAC;AAEJ;;;;;;;;GAQG;AACH,eAAO,MAAM,GAAG,GACb,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,OAAO,KAAG,UAAU,CAAC,EAAE,EAAE,EAAE,CAK9C,CAAC"}
|
package/dist/transducers.js
CHANGED
|
@@ -6,6 +6,50 @@
|
|
|
6
6
|
* @see transduceAsync
|
|
7
7
|
*/
|
|
8
8
|
import { HALT } from "./iterator-tools.js";
|
|
9
|
+
/**
|
|
10
|
+
* Give a stateless transducer's step the inner step's `.complete`, so the
|
|
11
|
+
* end-of-source flush cascades through it to a stateful transducer further
|
|
12
|
+
* down the pipeline (e.g. the trailing partial group in
|
|
13
|
+
* `transduceSync(map(f), group(2))`). A stateless step has nothing of its
|
|
14
|
+
* own to flush, so it forwards the inner `.complete` unchanged. Without
|
|
15
|
+
* this, `reduceSync`/`reduceAsync`/`transducePush` only ever saw the
|
|
16
|
+
* outermost step, which had no `.complete`, and the flush was lost.
|
|
17
|
+
* @ignore
|
|
18
|
+
*/
|
|
19
|
+
const forwardComplete = (next, step) => {
|
|
20
|
+
if (next.complete)
|
|
21
|
+
step.complete = next.complete;
|
|
22
|
+
if (next.held)
|
|
23
|
+
step.held = next.held;
|
|
24
|
+
if (next.drop)
|
|
25
|
+
step.drop = next.drop;
|
|
26
|
+
return step;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Give a stateful step `held`/`drop` over its own state, then the inner
|
|
30
|
+
* step's, so the hooks cascade the way `.complete` does. `own` lists the
|
|
31
|
+
* step's held items; `ownDrop` lets go of the ones `predicate` matches and
|
|
32
|
+
* returns how many.
|
|
33
|
+
* @ignore
|
|
34
|
+
*/
|
|
35
|
+
const holding = (next, step, own, ownDrop) => {
|
|
36
|
+
step.held = () => [...own(), ...(next.held ? next.held() : [])];
|
|
37
|
+
step.drop = (predicate) => ownDrop(predicate) + (next.drop ? next.drop(predicate) : 0);
|
|
38
|
+
return step;
|
|
39
|
+
};
|
|
40
|
+
/** Remove, in place, the items of `list` that `predicate` matches; returns how many. */
|
|
41
|
+
const dropFrom = (list, predicate) => {
|
|
42
|
+
let kept = 0;
|
|
43
|
+
let dropped = 0;
|
|
44
|
+
for (const item of list) {
|
|
45
|
+
if (predicate(item))
|
|
46
|
+
dropped++;
|
|
47
|
+
else
|
|
48
|
+
list[kept++] = item;
|
|
49
|
+
}
|
|
50
|
+
list.length = kept;
|
|
51
|
+
return dropped;
|
|
52
|
+
};
|
|
9
53
|
/**
|
|
10
54
|
* Create a transducer that maps values
|
|
11
55
|
* @kind function
|
|
@@ -13,7 +57,7 @@ import { HALT } from "./iterator-tools.js";
|
|
|
13
57
|
* @param transform transformation function applied to each item
|
|
14
58
|
* @returns transducer
|
|
15
59
|
*/
|
|
16
|
-
export const map = (transform) => (conjoin) => (init, item) => conjoin(init, transform(item));
|
|
60
|
+
export const map = (transform) => (conjoin) => forwardComplete(conjoin, (init, item) => conjoin(init, transform(item)));
|
|
17
61
|
/**
|
|
18
62
|
* Create a transducer that filters values
|
|
19
63
|
* @kind function
|
|
@@ -21,7 +65,7 @@ export const map = (transform) => (conjoin) => (init, item) => conjoin(init, tra
|
|
|
21
65
|
* @param predicate boolean function to determine if an item is emitted
|
|
22
66
|
* @returns transducer
|
|
23
67
|
*/
|
|
24
|
-
export const filter = (predicate) => (conjoin) => (init, item) => predicate(item) ? conjoin(init, item) : init;
|
|
68
|
+
export const filter = (predicate) => (conjoin) => forwardComplete(conjoin, (init, item) => (predicate(item) ? conjoin(init, item) : init));
|
|
25
69
|
/**
|
|
26
70
|
* Create a transducer that halts after a given number of values
|
|
27
71
|
* @kind function
|
|
@@ -32,7 +76,7 @@ export const filter = (predicate) => (conjoin) => (init, item) => predicate(item
|
|
|
32
76
|
export const take = (limit) => (conjoin) => {
|
|
33
77
|
let amount = 0;
|
|
34
78
|
// biome-ignore lint/complexity/noCommaOperator: deliberate single-expression step function
|
|
35
|
-
return (init, item) => (amount < limit ? (amount++, conjoin(init, item)) : HALT);
|
|
79
|
+
return forwardComplete(conjoin, (init, item) => (amount < limit ? (amount++, conjoin(init, item)) : HALT));
|
|
36
80
|
};
|
|
37
81
|
/**
|
|
38
82
|
* Create a transducer that drops the first N values
|
|
@@ -45,8 +89,11 @@ export const take = (limit) => (conjoin) => {
|
|
|
45
89
|
*/
|
|
46
90
|
export const drop = (limit) => (conjoin) => {
|
|
47
91
|
let amount = 0;
|
|
48
|
-
|
|
49
|
-
|
|
92
|
+
return forwardComplete(conjoin, (init, item) => {
|
|
93
|
+
const pass = amount >= limit;
|
|
94
|
+
amount++;
|
|
95
|
+
return pass ? conjoin(init, item) : init;
|
|
96
|
+
});
|
|
50
97
|
};
|
|
51
98
|
/**
|
|
52
99
|
* Create a transducer that rejects values matching a predicate.
|
|
@@ -58,7 +105,7 @@ export const drop = (limit) => (conjoin) => {
|
|
|
58
105
|
* @see filter
|
|
59
106
|
* @see drop
|
|
60
107
|
*/
|
|
61
|
-
export const reject = (predicate) => (conjoin) => (init, item) => predicate(item) ? init : conjoin(init, item);
|
|
108
|
+
export const reject = (predicate) => (conjoin) => forwardComplete(conjoin, (init, item) => (predicate(item) ? init : conjoin(init, item)));
|
|
62
109
|
/**
|
|
63
110
|
* Create a transducer that groups items by quantity before emitting.
|
|
64
111
|
* Note: this currently returns arrays -- would sets make more sense?
|
|
@@ -84,7 +131,7 @@ export const group = (limit) => (conjoin) => {
|
|
|
84
131
|
const buffer = out === HALT ? init : out;
|
|
85
132
|
return conjoin.complete ? conjoin.complete(buffer) : buffer;
|
|
86
133
|
};
|
|
87
|
-
return step;
|
|
134
|
+
return holding(conjoin, step, () => [...partition], (predicate) => dropFrom(partition, predicate));
|
|
88
135
|
};
|
|
89
136
|
/**
|
|
90
137
|
* Create a transducer that accumulates items into a result and emits them
|
|
@@ -102,10 +149,18 @@ export const accumulate = (func = (a, b) => (a + b), initial = 0) => (conjoin) =
|
|
|
102
149
|
// directly here would carry accumulated state over into the *next*
|
|
103
150
|
// transduce run that reuses this same accumulate(...) instance.
|
|
104
151
|
let accumulated = initial;
|
|
105
|
-
|
|
152
|
+
let has = false;
|
|
153
|
+
return holding(conjoin, forwardComplete(conjoin, (init, item) => {
|
|
106
154
|
accumulated = func(accumulated, item);
|
|
155
|
+
has = true;
|
|
107
156
|
return conjoin(init, accumulated);
|
|
108
|
-
}
|
|
157
|
+
}), () => (has ? [accumulated] : []), (predicate) => {
|
|
158
|
+
if (!has || !predicate(accumulated))
|
|
159
|
+
return 0;
|
|
160
|
+
accumulated = initial;
|
|
161
|
+
has = false;
|
|
162
|
+
return 1;
|
|
163
|
+
});
|
|
109
164
|
};
|
|
110
165
|
/**
|
|
111
166
|
* Create a transducer that skips consecutive duplicate items (by key).
|
|
@@ -121,7 +176,7 @@ export const accumulate = (func = (a, b) => (a + b), initial = 0) => (conjoin) =
|
|
|
121
176
|
export const dedupe = (keyFn = (x) => x) => (conjoin) => {
|
|
122
177
|
let hasLast = false;
|
|
123
178
|
let lastKey;
|
|
124
|
-
return (init, item) => {
|
|
179
|
+
return holding(conjoin, forwardComplete(conjoin, (init, item) => {
|
|
125
180
|
const key = keyFn(item);
|
|
126
181
|
if (hasLast && Object.is(key, lastKey)) {
|
|
127
182
|
return init;
|
|
@@ -129,7 +184,13 @@ export const dedupe = (keyFn = (x) => x) => (conjoin) => {
|
|
|
129
184
|
hasLast = true;
|
|
130
185
|
lastKey = key;
|
|
131
186
|
return conjoin(init, item);
|
|
132
|
-
}
|
|
187
|
+
}), () => (hasLast ? [lastKey] : []), (predicate) => {
|
|
188
|
+
if (!hasLast || !predicate(lastKey))
|
|
189
|
+
return 0;
|
|
190
|
+
hasLast = false;
|
|
191
|
+
lastKey = undefined;
|
|
192
|
+
return 1;
|
|
193
|
+
});
|
|
133
194
|
};
|
|
134
195
|
/**
|
|
135
196
|
* Create a transducer that inserts `separator` between consecutive
|
|
@@ -141,7 +202,7 @@ export const dedupe = (keyFn = (x) => x) => (conjoin) => {
|
|
|
141
202
|
*/
|
|
142
203
|
export const interpose = (separator) => (conjoin) => {
|
|
143
204
|
let started = false;
|
|
144
|
-
return (init, item) => {
|
|
205
|
+
return forwardComplete(conjoin, (init, item) => {
|
|
145
206
|
if (started) {
|
|
146
207
|
const out = conjoin(init, separator);
|
|
147
208
|
if (out === HALT) {
|
|
@@ -151,7 +212,7 @@ export const interpose = (separator) => (conjoin) => {
|
|
|
151
212
|
}
|
|
152
213
|
started = true;
|
|
153
214
|
return conjoin(init, item);
|
|
154
|
-
};
|
|
215
|
+
});
|
|
155
216
|
};
|
|
156
217
|
/**
|
|
157
218
|
* Create a transducer that groups consecutive items sharing a key into
|
|
@@ -194,7 +255,16 @@ export const partitionBy = (keyFn = (x) => x) => (conjoin) => {
|
|
|
194
255
|
const buffer = out === HALT ? init : out;
|
|
195
256
|
return conjoin.complete ? conjoin.complete(buffer) : buffer;
|
|
196
257
|
};
|
|
197
|
-
return step
|
|
258
|
+
return holding(conjoin, step, () => (hasCurrent ? [...bucket] : []), (predicate) => {
|
|
259
|
+
const dropped = dropFrom(bucket, predicate);
|
|
260
|
+
if (hasCurrent && bucket.length === 0) {
|
|
261
|
+
// A run with nothing left isn't open: the next item starts a fresh
|
|
262
|
+
// one, and complete() has no empty run to flush.
|
|
263
|
+
hasCurrent = false;
|
|
264
|
+
currentKey = undefined;
|
|
265
|
+
}
|
|
266
|
+
return dropped;
|
|
267
|
+
});
|
|
198
268
|
};
|
|
199
269
|
/**
|
|
200
270
|
* Create a transducer that calls `fn(item)` for its side effect and passes
|
|
@@ -205,8 +275,8 @@ export const partitionBy = (keyFn = (x) => x) => (conjoin) => {
|
|
|
205
275
|
* @param fn called with each item, for side effects
|
|
206
276
|
* @returns transducer
|
|
207
277
|
*/
|
|
208
|
-
export const tap = (fn) => (conjoin) => (init, item) => {
|
|
278
|
+
export const tap = (fn) => (conjoin) => forwardComplete(conjoin, (init, item) => {
|
|
209
279
|
fn(item);
|
|
210
280
|
return conjoin(init, item);
|
|
211
|
-
};
|
|
281
|
+
});
|
|
212
282
|
//# sourceMappingURL=transducers.js.map
|
package/dist/transducers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transducers.js","sourceRoot":"","sources":["../src/transducers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAqC,MAAM,qBAAqB,CAAC;AAE9E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,GAAG,GACd,CAAU,SAA4B,EAAuB,EAAE,CAC/D,CAAC,OAAO,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"transducers.js","sourceRoot":"","sources":["../src/transducers.ts"],"names":[],"mappings":"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"}
|