synstate 0.1.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +317 -298
- package/dist/core/class/child-observable-class.d.mts.map +1 -1
- package/dist/core/class/child-observable-class.mjs +43 -10
- package/dist/core/class/child-observable-class.mjs.map +1 -1
- package/dist/core/class/observable-base-class.d.mts +4 -4
- package/dist/core/class/observable-base-class.d.mts.map +1 -1
- package/dist/core/class/observable-base-class.mjs +8 -8
- package/dist/core/class/observable-base-class.mjs.map +1 -1
- package/dist/core/class/root-observable-class.d.mts +1 -1
- package/dist/core/class/root-observable-class.d.mts.map +1 -1
- package/dist/core/class/root-observable-class.mjs +9 -9
- package/dist/core/class/root-observable-class.mjs.map +1 -1
- package/dist/core/combine/combine.d.mts +7 -7
- package/dist/core/combine/combine.mjs +13 -14
- package/dist/core/combine/combine.mjs.map +1 -1
- package/dist/core/combine/merge.d.mts +6 -6
- package/dist/core/combine/merge.mjs +9 -9
- package/dist/core/combine/merge.mjs.map +1 -1
- package/dist/core/combine/zip.d.mts +20 -19
- package/dist/core/combine/zip.d.mts.map +1 -1
- package/dist/core/combine/zip.mjs +22 -21
- package/dist/core/combine/zip.mjs.map +1 -1
- package/dist/core/create/{interval.d.mts → counter.d.mts} +14 -12
- package/dist/core/create/counter.d.mts.map +1 -0
- package/dist/core/create/{interval.mjs → counter.mjs} +21 -23
- package/dist/core/create/counter.mjs.map +1 -0
- package/dist/core/create/from-abortable-promise.d.mts +29 -0
- package/dist/core/create/from-abortable-promise.d.mts.map +1 -0
- package/dist/core/create/from-abortable-promise.mjs +70 -0
- package/dist/core/create/from-abortable-promise.mjs.map +1 -0
- package/dist/core/create/from-promise.d.mts +9 -6
- package/dist/core/create/from-promise.d.mts.map +1 -1
- package/dist/core/create/from-promise.mjs +8 -5
- package/dist/core/create/from-promise.mjs.map +1 -1
- package/dist/core/create/from-subscribable.d.mts +4 -4
- package/dist/core/create/from-subscribable.mjs +4 -4
- package/dist/core/create/index.d.mts +3 -3
- package/dist/core/create/index.d.mts.map +1 -1
- package/dist/core/create/index.mjs +4 -4
- package/dist/core/create/just.d.mts +32 -0
- package/dist/core/create/just.d.mts.map +1 -0
- package/dist/core/create/just.mjs +44 -0
- package/dist/core/create/just.mjs.map +1 -0
- package/dist/core/create/source.d.mts +7 -12
- package/dist/core/create/source.d.mts.map +1 -1
- package/dist/core/create/source.mjs +1 -6
- package/dist/core/create/source.mjs.map +1 -1
- package/dist/core/create/timer.d.mts +6 -4
- package/dist/core/create/timer.d.mts.map +1 -1
- package/dist/core/create/timer.mjs +6 -7
- package/dist/core/create/timer.mjs.map +1 -1
- package/dist/core/index.d.mts +1 -1
- package/dist/core/index.d.mts.map +1 -1
- package/dist/core/index.mjs +21 -14
- package/dist/core/index.mjs.map +1 -1
- package/dist/core/operators/audit.d.mts +97 -0
- package/dist/core/operators/audit.d.mts.map +1 -0
- package/dist/core/operators/audit.mjs +144 -0
- package/dist/core/operators/audit.mjs.map +1 -0
- package/dist/core/operators/debounce.d.mts +88 -0
- package/dist/core/operators/debounce.d.mts.map +1 -0
- package/dist/core/operators/debounce.mjs +130 -0
- package/dist/core/operators/debounce.mjs.map +1 -0
- package/dist/core/operators/filter.d.mts +5 -5
- package/dist/core/operators/filter.mjs +3 -3
- package/dist/core/operators/filter.mjs.map +1 -1
- package/dist/core/operators/index.d.mts +4 -4
- package/dist/core/operators/index.d.mts.map +1 -1
- package/dist/core/operators/index.mjs +6 -6
- package/dist/core/operators/map.d.mts +41 -0
- package/dist/core/operators/map.d.mts.map +1 -0
- package/dist/core/operators/map.mjs +71 -0
- package/dist/core/operators/map.mjs.map +1 -0
- package/dist/core/operators/merge-map.d.mts +57 -30
- package/dist/core/operators/merge-map.d.mts.map +1 -1
- package/dist/core/operators/merge-map.mjs +59 -32
- package/dist/core/operators/merge-map.mjs.map +1 -1
- package/dist/core/operators/pairwise.d.mts +6 -6
- package/dist/core/operators/pairwise.mjs +9 -9
- package/dist/core/operators/pairwise.mjs.map +1 -1
- package/dist/core/operators/scan.d.mts +6 -6
- package/dist/core/operators/scan.mjs +9 -9
- package/dist/core/operators/scan.mjs.map +1 -1
- package/dist/core/operators/skip-if-no-change.d.mts +21 -9
- package/dist/core/operators/skip-if-no-change.d.mts.map +1 -1
- package/dist/core/operators/skip-if-no-change.mjs +25 -13
- package/dist/core/operators/skip-if-no-change.mjs.map +1 -1
- package/dist/core/operators/skip-until.d.mts +5 -5
- package/dist/core/operators/skip-until.mjs +8 -8
- package/dist/core/operators/skip-until.mjs.map +1 -1
- package/dist/core/operators/skip-while.d.mts +18 -9
- package/dist/core/operators/skip-while.d.mts.map +1 -1
- package/dist/core/operators/skip-while.mjs +28 -16
- package/dist/core/operators/skip-while.mjs.map +1 -1
- package/dist/core/operators/switch-map.d.mts +57 -26
- package/dist/core/operators/switch-map.d.mts.map +1 -1
- package/dist/core/operators/switch-map.mjs +59 -28
- package/dist/core/operators/switch-map.mjs.map +1 -1
- package/dist/core/operators/take-until.d.mts +5 -5
- package/dist/core/operators/take-until.mjs +8 -8
- package/dist/core/operators/take-until.mjs.map +1 -1
- package/dist/core/operators/take-while.d.mts +15 -8
- package/dist/core/operators/take-while.d.mts.map +1 -1
- package/dist/core/operators/take-while.mjs +19 -13
- package/dist/core/operators/take-while.mjs.map +1 -1
- package/dist/core/operators/throttle.d.mts +81 -0
- package/dist/core/operators/throttle.d.mts.map +1 -0
- package/dist/core/operators/throttle.mjs +126 -0
- package/dist/core/operators/throttle.mjs.map +1 -0
- package/dist/core/operators/with-buffered-from.d.mts +13 -9
- package/dist/core/operators/with-buffered-from.d.mts.map +1 -1
- package/dist/core/operators/with-buffered-from.mjs +17 -13
- package/dist/core/operators/with-buffered-from.mjs.map +1 -1
- package/dist/core/operators/with-current-value-from.d.mts +14 -9
- package/dist/core/operators/with-current-value-from.d.mts.map +1 -1
- package/dist/core/operators/with-current-value-from.mjs +18 -13
- package/dist/core/operators/with-current-value-from.mjs.map +1 -1
- package/dist/core/operators/with-initial-value.d.mts +5 -5
- package/dist/core/operators/with-initial-value.mjs +8 -8
- package/dist/core/operators/with-initial-value.mjs.map +1 -1
- package/dist/core/predefined/index.d.mts +2 -0
- package/dist/core/predefined/index.d.mts.map +1 -0
- package/dist/core/predefined/index.mjs +12 -0
- package/dist/core/predefined/index.mjs.map +1 -0
- package/dist/core/predefined/operators/attach-index.d.mts +57 -0
- package/dist/core/predefined/operators/attach-index.d.mts.map +1 -0
- package/dist/core/predefined/operators/attach-index.mjs +62 -0
- package/dist/core/predefined/operators/attach-index.mjs.map +1 -0
- package/dist/core/predefined/operators/index.d.mts +12 -0
- package/dist/core/predefined/operators/index.d.mts.map +1 -0
- package/dist/core/predefined/operators/index.mjs +12 -0
- package/dist/core/predefined/operators/index.mjs.map +1 -0
- package/dist/core/predefined/operators/map-optional.d.mts +51 -0
- package/dist/core/predefined/operators/map-optional.d.mts.map +1 -0
- package/dist/core/predefined/operators/map-optional.mjs +55 -0
- package/dist/core/predefined/operators/map-optional.mjs.map +1 -0
- package/dist/core/predefined/operators/map-result-err.d.mts +51 -0
- package/dist/core/predefined/operators/map-result-err.d.mts.map +1 -0
- package/dist/core/predefined/operators/map-result-err.mjs +55 -0
- package/dist/core/predefined/operators/map-result-err.mjs.map +1 -0
- package/dist/core/predefined/operators/map-result-ok.d.mts +51 -0
- package/dist/core/predefined/operators/map-result-ok.d.mts.map +1 -0
- package/dist/core/predefined/operators/map-result-ok.mjs +55 -0
- package/dist/core/predefined/operators/map-result-ok.mjs.map +1 -0
- package/dist/core/predefined/operators/map-to.d.mts +43 -0
- package/dist/core/predefined/operators/map-to.d.mts.map +1 -0
- package/dist/core/predefined/operators/map-to.mjs +48 -0
- package/dist/core/predefined/operators/map-to.mjs.map +1 -0
- package/dist/core/predefined/operators/pluck.d.mts +47 -0
- package/dist/core/predefined/operators/pluck.d.mts.map +1 -0
- package/dist/core/predefined/operators/pluck.mjs +52 -0
- package/dist/core/predefined/operators/pluck.mjs.map +1 -0
- package/dist/core/predefined/operators/skip.d.mts +50 -0
- package/dist/core/predefined/operators/skip.d.mts.map +1 -0
- package/dist/core/predefined/operators/skip.mjs +56 -0
- package/dist/core/predefined/operators/skip.mjs.map +1 -0
- package/dist/core/predefined/operators/take.d.mts +44 -0
- package/dist/core/predefined/operators/take.d.mts.map +1 -0
- package/dist/core/predefined/operators/take.mjs +49 -0
- package/dist/core/predefined/operators/take.mjs.map +1 -0
- package/dist/core/predefined/operators/unwrap-optional.d.mts +44 -0
- package/dist/core/predefined/operators/unwrap-optional.d.mts.map +1 -0
- package/dist/core/predefined/operators/unwrap-optional.mjs +50 -0
- package/dist/core/predefined/operators/unwrap-optional.mjs.map +1 -0
- package/dist/core/predefined/operators/unwrap-result-err.d.mts +44 -0
- package/dist/core/predefined/operators/unwrap-result-err.d.mts.map +1 -0
- package/dist/core/predefined/operators/unwrap-result-err.mjs +48 -0
- package/dist/core/predefined/operators/unwrap-result-err.mjs.map +1 -0
- package/dist/core/predefined/operators/unwrap-result-ok.d.mts +44 -0
- package/dist/core/predefined/operators/unwrap-result-ok.d.mts.map +1 -0
- package/dist/core/predefined/operators/unwrap-result-ok.mjs +50 -0
- package/dist/core/predefined/operators/unwrap-result-ok.mjs.map +1 -0
- package/dist/core/types/id.d.mts +1 -1
- package/dist/core/types/id.d.mts.map +1 -1
- package/dist/core/types/index.d.mts +1 -0
- package/dist/core/types/index.d.mts.map +1 -1
- package/dist/core/types/observable-family.d.mts +8 -14
- package/dist/core/types/observable-family.d.mts.map +1 -1
- package/dist/core/types/observable.d.mts +3 -3
- package/dist/core/types/observable.d.mts.map +1 -1
- package/dist/core/types/timer.d.mts +2 -0
- package/dist/core/types/timer.d.mts.map +1 -0
- package/dist/core/types/timer.mjs +2 -0
- package/dist/core/types/timer.mjs.map +1 -0
- package/dist/core/utils/id-maker.d.mts +2 -2
- package/dist/core/utils/id-maker.d.mts.map +1 -1
- package/dist/core/utils/id-maker.mjs +3 -3
- package/dist/core/utils/id-maker.mjs.map +1 -1
- package/dist/core/utils/index.mjs +1 -1
- package/dist/entry-point.mjs +24 -15
- package/dist/entry-point.mjs.map +1 -1
- package/dist/globals.d.mts +0 -3
- package/dist/index.mjs +24 -15
- package/dist/index.mjs.map +1 -1
- package/dist/utils/collect-to-array.d.mts +3 -0
- package/dist/utils/collect-to-array.d.mts.map +1 -0
- package/dist/utils/collect-to-array.mjs +11 -0
- package/dist/utils/collect-to-array.mjs.map +1 -0
- package/dist/utils/create-boolean-state.d.mts +40 -0
- package/dist/utils/create-boolean-state.d.mts.map +1 -0
- package/dist/utils/create-boolean-state.mjs +53 -0
- package/dist/utils/create-boolean-state.mjs.map +1 -0
- package/dist/utils/create-event-emitter.d.mts +4 -4
- package/dist/utils/create-event-emitter.mjs +4 -4
- package/dist/utils/create-reducer.d.mts +10 -7
- package/dist/utils/create-reducer.d.mts.map +1 -1
- package/dist/utils/create-reducer.mjs +7 -7
- package/dist/utils/create-reducer.mjs.map +1 -1
- package/dist/utils/create-state.d.mts +8 -48
- package/dist/utils/create-state.d.mts.map +1 -1
- package/dist/utils/create-state.mjs +10 -60
- package/dist/utils/create-state.mjs.map +1 -1
- package/dist/utils/index.d.mts +2 -0
- package/dist/utils/index.d.mts.map +1 -1
- package/dist/utils/index.mjs +3 -1
- package/dist/utils/index.mjs.map +1 -1
- package/package.json +17 -11
- package/src/core/class/child-observable-class.mts +65 -9
- package/src/core/class/circular-dependency-comparison.test.mts +142 -0
- package/src/core/class/circular-dependency.test.mts +251 -0
- package/src/core/class/observable-base-class.mts +9 -9
- package/src/core/class/root-observable-class.mts +14 -10
- package/src/core/combine/combine.mts +15 -15
- package/src/core/combine/merge.mts +13 -14
- package/src/core/combine/zip.mts +26 -25
- package/src/core/create/{interval.mts → counter.mts} +32 -30
- package/src/core/create/from-abortable-promise.mts +83 -0
- package/src/core/create/from-promise.mts +10 -7
- package/src/core/create/from-subscribable.mts +4 -4
- package/src/core/create/index.mts +3 -3
- package/src/core/create/just.mts +43 -0
- package/src/core/create/source.mts +10 -14
- package/src/core/create/timer.mts +12 -11
- package/src/core/index.mts +1 -1
- package/src/core/operators/audit.mts +172 -0
- package/src/core/operators/debounce.mts +154 -0
- package/src/core/operators/filter.mts +9 -9
- package/src/core/operators/index.mts +4 -4
- package/src/core/operators/map.mts +124 -0
- package/src/core/operators/merge-map.mts +60 -33
- package/src/core/operators/pairwise.mts +10 -10
- package/src/core/operators/scan.mts +10 -10
- package/src/core/operators/skip-if-no-change.mts +26 -14
- package/src/core/operators/skip-until.mts +9 -9
- package/src/core/operators/skip-while.mts +30 -28
- package/src/core/operators/switch-map.mts +60 -29
- package/src/core/operators/take-until.mts +9 -9
- package/src/core/operators/take-while.mts +21 -19
- package/src/core/operators/{throttle-time.mts → throttle.mts} +58 -38
- package/src/core/operators/with-buffered-from.mts +18 -14
- package/src/core/operators/with-current-value-from.mts +19 -14
- package/src/core/operators/with-initial-value.mts +9 -9
- package/src/core/predefined/index.mts +1 -0
- package/src/core/predefined/operators/attach-index.mts +62 -0
- package/src/core/predefined/operators/index.mts +11 -0
- package/src/core/predefined/operators/map-optional.mts +55 -0
- package/src/core/predefined/operators/map-result-err.mts +55 -0
- package/src/core/predefined/operators/map-result-ok.mts +55 -0
- package/src/core/predefined/operators/map-to.mts +45 -0
- package/src/core/predefined/operators/pluck.mts +51 -0
- package/src/core/predefined/operators/skip.mts +57 -0
- package/src/core/predefined/operators/take.mts +47 -0
- package/src/core/predefined/operators/unwrap-optional.mts +49 -0
- package/src/core/predefined/operators/unwrap-result-err.mts +48 -0
- package/src/core/predefined/operators/unwrap-result-ok.mts +49 -0
- package/src/core/types/id.mts +1 -1
- package/src/core/types/index.mts +1 -0
- package/src/core/types/observable-family.mts +8 -24
- package/src/core/types/observable.mts +3 -3
- package/src/core/types/timer.mts +2 -0
- package/src/core/utils/id-maker.mts +4 -4
- package/src/globals.d.mts +0 -3
- package/src/utils/collect-to-array.mts +17 -0
- package/src/utils/create-boolean-state.mts +68 -0
- package/src/utils/create-event-emitter.mts +4 -4
- package/src/utils/create-reducer.mts +11 -8
- package/src/utils/create-state.mts +10 -75
- package/src/utils/index.mts +2 -0
- package/dist/core/create/from-array.d.mts +0 -39
- package/dist/core/create/from-array.d.mts.map +0 -1
- package/dist/core/create/from-array.mjs +0 -65
- package/dist/core/create/from-array.mjs.map +0 -1
- package/dist/core/create/interval.d.mts.map +0 -1
- package/dist/core/create/interval.mjs.map +0 -1
- package/dist/core/create/of.d.mts +0 -39
- package/dist/core/create/of.d.mts.map +0 -1
- package/dist/core/create/of.mjs +0 -63
- package/dist/core/create/of.mjs.map +0 -1
- package/dist/core/operators/audit-time.d.mts +0 -62
- package/dist/core/operators/audit-time.d.mts.map +0 -1
- package/dist/core/operators/audit-time.mjs +0 -109
- package/dist/core/operators/audit-time.mjs.map +0 -1
- package/dist/core/operators/debounce-time.d.mts +0 -51
- package/dist/core/operators/debounce-time.d.mts.map +0 -1
- package/dist/core/operators/debounce-time.mjs +0 -93
- package/dist/core/operators/debounce-time.mjs.map +0 -1
- package/dist/core/operators/map-with-index.d.mts +0 -54
- package/dist/core/operators/map-with-index.d.mts.map +0 -1
- package/dist/core/operators/map-with-index.mjs +0 -88
- package/dist/core/operators/map-with-index.mjs.map +0 -1
- package/dist/core/operators/throttle-time.d.mts +0 -62
- package/dist/core/operators/throttle-time.d.mts.map +0 -1
- package/dist/core/operators/throttle-time.mjs +0 -107
- package/dist/core/operators/throttle-time.mjs.map +0 -1
- package/src/core/create/from-array.mts +0 -76
- package/src/core/create/of.mts +0 -73
- package/src/core/operators/audit-time.mts +0 -136
- package/src/core/operators/debounce-time.mts +0 -116
- package/src/core/operators/map-with-index.mts +0 -183
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import { Optional } from 'ts-data-forge';
|
|
2
|
-
import { AsyncChildObservableClass } from '../class/index.mjs';
|
|
3
|
-
import {
|
|
4
|
-
type AuditTimeOperatorObservable,
|
|
5
|
-
type KeepInitialValueOperator,
|
|
6
|
-
type Observable,
|
|
7
|
-
type UpdaterSymbol,
|
|
8
|
-
} from '../types/index.mjs';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Emits the last value from the source observable after a specified time window has passed.
|
|
12
|
-
* Unlike throttleTime which emits the first value, auditTime emits the last value.
|
|
13
|
-
*
|
|
14
|
-
* @template A - The type of values from the source
|
|
15
|
-
* @param milliSeconds - The audit time window in milliseconds
|
|
16
|
-
* @returns An operator that audits emissions from the observable
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* ```ts
|
|
20
|
-
* // Timeline (1000ms audit):
|
|
21
|
-
* //
|
|
22
|
-
* // Time(ms) 0 100 200 300 400 ... 1000 1100
|
|
23
|
-
* // input$ e1 e2 e3 e4 e5
|
|
24
|
-
* // audited$ e5 (emitted at end of window)
|
|
25
|
-
* // |-------1000ms window------> ^
|
|
26
|
-
* //
|
|
27
|
-
* // Explanation:
|
|
28
|
-
* // - auditTime emits the LAST value received during each time window
|
|
29
|
-
* // - Unlike throttleTime (which emits the FIRST value), audit emits the LAST
|
|
30
|
-
* // - At 0-1000ms: e1-e5 are received
|
|
31
|
-
* // - At 1000ms: e5 (the last value in the window) is emitted
|
|
32
|
-
* // - Useful when you want the most recent value after a burst of events
|
|
33
|
-
*
|
|
34
|
-
* const input$ = source<number>();
|
|
35
|
-
*
|
|
36
|
-
* const audited$ = input$.pipe(auditTime(200));
|
|
37
|
-
*
|
|
38
|
-
* const mut_history: number[] = [];
|
|
39
|
-
*
|
|
40
|
-
* audited$.subscribe((value) => {
|
|
41
|
-
* mut_history.push(value);
|
|
42
|
-
* });
|
|
43
|
-
*
|
|
44
|
-
* input$.next(1);
|
|
45
|
-
*
|
|
46
|
-
* input$.next(2);
|
|
47
|
-
*
|
|
48
|
-
* input$.next(3);
|
|
49
|
-
*
|
|
50
|
-
* assert.deepStrictEqual(mut_history, []);
|
|
51
|
-
*
|
|
52
|
-
* await new Promise((resolve) => {
|
|
53
|
-
* setTimeout(resolve, 250);
|
|
54
|
-
* });
|
|
55
|
-
*
|
|
56
|
-
* assert.deepStrictEqual(mut_history, [3]);
|
|
57
|
-
*
|
|
58
|
-
* input$.next(4);
|
|
59
|
-
*
|
|
60
|
-
* input$.next(5);
|
|
61
|
-
*
|
|
62
|
-
* await new Promise((resolve) => {
|
|
63
|
-
* setTimeout(resolve, 250);
|
|
64
|
-
* });
|
|
65
|
-
*
|
|
66
|
-
* assert.deepStrictEqual(mut_history, [3, 5]);
|
|
67
|
-
* ```
|
|
68
|
-
*/
|
|
69
|
-
export const auditTime = <A,>(
|
|
70
|
-
milliSeconds: number,
|
|
71
|
-
): KeepInitialValueOperator<A, A> =>
|
|
72
|
-
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
73
|
-
((parentObservable) =>
|
|
74
|
-
new AuditTimeObservableClass(
|
|
75
|
-
parentObservable,
|
|
76
|
-
milliSeconds,
|
|
77
|
-
)) as KeepInitialValueOperator<A, A>;
|
|
78
|
-
|
|
79
|
-
class AuditTimeObservableClass<A>
|
|
80
|
-
extends AsyncChildObservableClass<A, readonly [A]>
|
|
81
|
-
implements AuditTimeOperatorObservable<A>
|
|
82
|
-
{
|
|
83
|
-
readonly #milliSeconds: number;
|
|
84
|
-
#mut_timerId: TimerId | undefined;
|
|
85
|
-
#mut_isSkipping: boolean;
|
|
86
|
-
|
|
87
|
-
constructor(parentObservable: Observable<A>, milliSeconds: number) {
|
|
88
|
-
super({
|
|
89
|
-
parents: [parentObservable],
|
|
90
|
-
initialValue: parentObservable.getSnapshot(),
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
this.#mut_isSkipping = false;
|
|
94
|
-
|
|
95
|
-
this.#mut_timerId = undefined;
|
|
96
|
-
|
|
97
|
-
this.#milliSeconds = milliSeconds;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
override tryUpdate(updaterSymbol: UpdaterSymbol): void {
|
|
101
|
-
const par = this.parents[0];
|
|
102
|
-
|
|
103
|
-
if (
|
|
104
|
-
par.updaterSymbol !== updaterSymbol ||
|
|
105
|
-
Optional.isNone(par.getSnapshot()) ||
|
|
106
|
-
this.#mut_isSkipping
|
|
107
|
-
) {
|
|
108
|
-
return; // skip update
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// set timer
|
|
112
|
-
this.#mut_isSkipping = true;
|
|
113
|
-
|
|
114
|
-
this.#mut_timerId = setTimeout(() => {
|
|
115
|
-
const sn = par.getSnapshot();
|
|
116
|
-
|
|
117
|
-
if (Optional.isNone(sn)) return;
|
|
118
|
-
|
|
119
|
-
this.startUpdate(sn.value);
|
|
120
|
-
|
|
121
|
-
this.#mut_isSkipping = false;
|
|
122
|
-
}, this.#milliSeconds);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
#resetTimer(): void {
|
|
126
|
-
if (this.#mut_timerId !== undefined) {
|
|
127
|
-
clearTimeout(this.#mut_timerId);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
override complete(): void {
|
|
132
|
-
this.#resetTimer();
|
|
133
|
-
|
|
134
|
-
super.complete();
|
|
135
|
-
}
|
|
136
|
-
}
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import { Optional } from 'ts-data-forge';
|
|
2
|
-
import { AsyncChildObservableClass } from '../class/index.mjs';
|
|
3
|
-
import {
|
|
4
|
-
type DebounceTimeOperatorObservable,
|
|
5
|
-
type KeepInitialValueOperator,
|
|
6
|
-
type Observable,
|
|
7
|
-
type UpdaterSymbol,
|
|
8
|
-
} from '../types/index.mjs';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Delays emissions from the source observable until a specified time has passed without another emission.
|
|
12
|
-
* Useful for handling user input events like typing or scrolling.
|
|
13
|
-
*
|
|
14
|
-
* @template A - The type of values from the source
|
|
15
|
-
* @param milliSeconds - The debounce duration in milliseconds
|
|
16
|
-
* @returns An operator that debounces the observable
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* ```ts
|
|
20
|
-
* // Timeline (300ms debounce):
|
|
21
|
-
* //
|
|
22
|
-
* // Time(ms) 0 100 200 300 400 500 600 ... 900 1000
|
|
23
|
-
* // input$ 'h' 'he' 'hel' 'hello'
|
|
24
|
-
* // debounced$ 'hello' (emitted after 300ms silence)
|
|
25
|
-
* //
|
|
26
|
-
* // Explanation:
|
|
27
|
-
* // - At 0ms: 'h' is emitted, timer starts
|
|
28
|
-
* // - At 100ms: 'he' is emitted, timer resets
|
|
29
|
-
* // - At 200ms: 'hel' is emitted, timer resets
|
|
30
|
-
* // - At 300ms: 'hello' is emitted, timer resets
|
|
31
|
-
* // - At 600ms: No new emission for 300ms, 'hello' is finally emitted
|
|
32
|
-
*
|
|
33
|
-
* const input$ = source<string>();
|
|
34
|
-
*
|
|
35
|
-
* const debounced$ = input$.pipe(debounceTime(300));
|
|
36
|
-
*
|
|
37
|
-
* const mut_history: string[] = [];
|
|
38
|
-
*
|
|
39
|
-
* debounced$.subscribe((value) => {
|
|
40
|
-
* mut_history.push(value);
|
|
41
|
-
* });
|
|
42
|
-
*
|
|
43
|
-
* input$.next('h');
|
|
44
|
-
*
|
|
45
|
-
* input$.next('he');
|
|
46
|
-
*
|
|
47
|
-
* input$.next('hel');
|
|
48
|
-
*
|
|
49
|
-
* input$.next('hello');
|
|
50
|
-
*
|
|
51
|
-
* await new Promise((resolve) => {
|
|
52
|
-
* setTimeout(resolve, 400);
|
|
53
|
-
* });
|
|
54
|
-
*
|
|
55
|
-
* assert.deepStrictEqual(mut_history, ['hello']);
|
|
56
|
-
* ```
|
|
57
|
-
*/
|
|
58
|
-
export const debounceTime = <A,>(
|
|
59
|
-
milliSeconds: number,
|
|
60
|
-
): KeepInitialValueOperator<A, A> =>
|
|
61
|
-
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
62
|
-
((parentObservable) =>
|
|
63
|
-
new DebounceTimeObservableClass(
|
|
64
|
-
parentObservable,
|
|
65
|
-
milliSeconds,
|
|
66
|
-
)) as KeepInitialValueOperator<A, A>;
|
|
67
|
-
|
|
68
|
-
class DebounceTimeObservableClass<A>
|
|
69
|
-
extends AsyncChildObservableClass<A, readonly [A]>
|
|
70
|
-
implements DebounceTimeOperatorObservable<A>
|
|
71
|
-
{
|
|
72
|
-
readonly #milliSeconds: number;
|
|
73
|
-
#mut_timerId: TimerId | undefined;
|
|
74
|
-
|
|
75
|
-
constructor(parentObservable: Observable<A>, milliSeconds: number) {
|
|
76
|
-
super({
|
|
77
|
-
parents: [parentObservable],
|
|
78
|
-
initialValue: parentObservable.getSnapshot(),
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
this.#mut_timerId = undefined;
|
|
82
|
-
|
|
83
|
-
this.#milliSeconds = milliSeconds;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
override tryUpdate(updaterSymbol: UpdaterSymbol): void {
|
|
87
|
-
const par = this.parents[0];
|
|
88
|
-
|
|
89
|
-
const sn = par.getSnapshot();
|
|
90
|
-
|
|
91
|
-
if (par.updaterSymbol !== updaterSymbol || Optional.isNone(sn)) {
|
|
92
|
-
return; // skip update
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
this.#resetTimer();
|
|
96
|
-
|
|
97
|
-
// set timer
|
|
98
|
-
this.#mut_timerId = setTimeout(() => {
|
|
99
|
-
if (Optional.isNone(sn)) return;
|
|
100
|
-
|
|
101
|
-
this.startUpdate(sn.value);
|
|
102
|
-
}, this.#milliSeconds);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
#resetTimer(): void {
|
|
106
|
-
if (this.#mut_timerId !== undefined) {
|
|
107
|
-
clearTimeout(this.#mut_timerId);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
override complete(): void {
|
|
112
|
-
this.#resetTimer();
|
|
113
|
-
|
|
114
|
-
super.complete();
|
|
115
|
-
}
|
|
116
|
-
}
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Optional,
|
|
3
|
-
Result,
|
|
4
|
-
SafeUint,
|
|
5
|
-
asSafeUint,
|
|
6
|
-
expectType,
|
|
7
|
-
} from 'ts-data-forge';
|
|
8
|
-
import { SyncChildObservableClass } from '../class/index.mjs';
|
|
9
|
-
import { source } from '../create/index.mjs';
|
|
10
|
-
import {
|
|
11
|
-
type InitializedObservable,
|
|
12
|
-
type KeepInitialValueOperator,
|
|
13
|
-
type MapWithIndexOperatorObservable,
|
|
14
|
-
type Observable,
|
|
15
|
-
type UpdaterSymbol,
|
|
16
|
-
} from '../types/index.mjs';
|
|
17
|
-
import { withInitialValue } from './with-initial-value.mjs';
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Transforms each value emitted by the source using a mapping function that also receives the emission index.
|
|
21
|
-
*
|
|
22
|
-
* @template A - The type of values from the source
|
|
23
|
-
* @template B - The type of mapped values
|
|
24
|
-
* @param mapFn - A function that maps each value (receives value and index)
|
|
25
|
-
* @returns An operator that maps values with index
|
|
26
|
-
*
|
|
27
|
-
* @example
|
|
28
|
-
* ```ts
|
|
29
|
-
* // Timeline:
|
|
30
|
-
* //
|
|
31
|
-
* // num$ "a" "b" "c"
|
|
32
|
-
* // indexed$ "0: a" "1: b" "2: c"
|
|
33
|
-
* //
|
|
34
|
-
* // Explanation:
|
|
35
|
-
* // - mapWithIndex transforms each value along with its index
|
|
36
|
-
* // - Index starts at 0 and increments with each emission
|
|
37
|
-
*
|
|
38
|
-
* const num$ = source<string>();
|
|
39
|
-
*
|
|
40
|
-
* const indexed$ = num$.pipe(mapWithIndex((x, i) => `${i}: ${x}`));
|
|
41
|
-
*
|
|
42
|
-
* const mut_history: string[] = [];
|
|
43
|
-
*
|
|
44
|
-
* indexed$.subscribe((s) => {
|
|
45
|
-
* mut_history.push(s);
|
|
46
|
-
* });
|
|
47
|
-
*
|
|
48
|
-
* num$.next('a'); // 0: a
|
|
49
|
-
*
|
|
50
|
-
* num$.next('b'); // 1: b
|
|
51
|
-
*
|
|
52
|
-
* num$.next('c'); // 2: c
|
|
53
|
-
*
|
|
54
|
-
* assert.deepStrictEqual(mut_history, ['0: a', '1: b', '2: c']);
|
|
55
|
-
* ```
|
|
56
|
-
*/
|
|
57
|
-
export const mapWithIndex = <A, B>(
|
|
58
|
-
mapFn: (x: A, index: SafeUint | -1) => B,
|
|
59
|
-
): KeepInitialValueOperator<A, B> =>
|
|
60
|
-
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
61
|
-
((parentObservable) =>
|
|
62
|
-
new MapWithIndexObservableClass(
|
|
63
|
-
parentObservable,
|
|
64
|
-
mapFn,
|
|
65
|
-
)) as KeepInitialValueOperator<A, B>;
|
|
66
|
-
|
|
67
|
-
/* Specialized operators */
|
|
68
|
-
|
|
69
|
-
export const map = <A, B>(mapFn: (x: A) => B): KeepInitialValueOperator<A, B> =>
|
|
70
|
-
mapWithIndex(mapFn);
|
|
71
|
-
|
|
72
|
-
export const mapTo = <A, B>(value: B): KeepInitialValueOperator<A, B> =>
|
|
73
|
-
map(() => value);
|
|
74
|
-
|
|
75
|
-
export const pluck = <A, K extends keyof A>(
|
|
76
|
-
key: K,
|
|
77
|
-
): KeepInitialValueOperator<A, A[K]> => map((a) => a[key]);
|
|
78
|
-
|
|
79
|
-
export const getKey = pluck; // alias
|
|
80
|
-
|
|
81
|
-
export const attachIndex = <A,>(): KeepInitialValueOperator<
|
|
82
|
-
A,
|
|
83
|
-
readonly [SafeUint | -1, A]
|
|
84
|
-
> => mapWithIndex((a, i) => [i, a] as const);
|
|
85
|
-
|
|
86
|
-
export const withIndex = attachIndex; // alias
|
|
87
|
-
|
|
88
|
-
export const unwrapOptional = <
|
|
89
|
-
O extends UnknownOptional,
|
|
90
|
-
>(): KeepInitialValueOperator<O, Optional.Unwrap<O> | undefined> =>
|
|
91
|
-
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
92
|
-
map(Optional.unwrap as Fn<O, Optional.Unwrap<O> | undefined>);
|
|
93
|
-
|
|
94
|
-
export const unwrapResultOk = <
|
|
95
|
-
R extends UnknownResult,
|
|
96
|
-
>(): KeepInitialValueOperator<R, Result.UnwrapOk<R> | undefined> =>
|
|
97
|
-
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
98
|
-
map(Result.unwrapOk as Fn<R, Result.UnwrapOk<R> | undefined>);
|
|
99
|
-
|
|
100
|
-
export const unwrapResultErr = <
|
|
101
|
-
R extends UnknownResult,
|
|
102
|
-
>(): KeepInitialValueOperator<R, Result.UnwrapErr<R> | undefined> =>
|
|
103
|
-
map(Result.unwrapErr as Fn<R, Result.UnwrapErr<R> | undefined>);
|
|
104
|
-
|
|
105
|
-
export const mapOptional = <O extends UnknownOptional, B>(
|
|
106
|
-
mapFn: (x: Optional.Unwrap<O>) => B,
|
|
107
|
-
): KeepInitialValueOperator<O, Optional<B>> =>
|
|
108
|
-
map((a) => Optional.map(a, mapFn));
|
|
109
|
-
|
|
110
|
-
export const mapResultOk = <R extends UnknownResult, S2>(
|
|
111
|
-
mapFn: (x: Result.UnwrapOk<R>) => S2,
|
|
112
|
-
): KeepInitialValueOperator<R, Result<S2, Result.UnwrapErr<R>>> =>
|
|
113
|
-
map((a) => Result.map(a, mapFn));
|
|
114
|
-
|
|
115
|
-
export const mapResultErr = <R extends UnknownResult, E2>(
|
|
116
|
-
mapFn: (x: Result.UnwrapErr<R>) => E2,
|
|
117
|
-
): KeepInitialValueOperator<R, Result<Result.UnwrapOk<R>, E2>> =>
|
|
118
|
-
map((a) => Result.mapErr(a, mapFn));
|
|
119
|
-
|
|
120
|
-
/* implementation */
|
|
121
|
-
|
|
122
|
-
class MapWithIndexObservableClass<A, B>
|
|
123
|
-
extends SyncChildObservableClass<B, readonly [A]>
|
|
124
|
-
implements MapWithIndexOperatorObservable<A, B>
|
|
125
|
-
{
|
|
126
|
-
readonly #mapFn: (x: A, index: SafeUint | -1) => B;
|
|
127
|
-
#mut_index: SafeUint | -1;
|
|
128
|
-
|
|
129
|
-
constructor(
|
|
130
|
-
parentObservable: Observable<A>,
|
|
131
|
-
mapFn: (x: A, index: SafeUint | -1) => B,
|
|
132
|
-
) {
|
|
133
|
-
super({
|
|
134
|
-
parents: [parentObservable],
|
|
135
|
-
initialValue: Optional.map(parentObservable.getSnapshot(), (x) =>
|
|
136
|
-
mapFn(x, -1),
|
|
137
|
-
),
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
this.#mut_index = -1;
|
|
141
|
-
|
|
142
|
-
this.#mapFn = mapFn;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
override tryUpdate(updaterSymbol: UpdaterSymbol): void {
|
|
146
|
-
const par = this.parents[0];
|
|
147
|
-
|
|
148
|
-
const sn = par.getSnapshot();
|
|
149
|
-
|
|
150
|
-
if (par.updaterSymbol !== updaterSymbol || Optional.isNone(sn)) {
|
|
151
|
-
return; // skip update
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
this.#mut_index =
|
|
155
|
-
this.#mut_index === -1 ? asSafeUint(0) : SafeUint.add(1, this.#mut_index);
|
|
156
|
-
|
|
157
|
-
this.setNext(this.#mapFn(sn.value, this.#mut_index), updaterSymbol);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
if (import.meta.vitest !== undefined) {
|
|
162
|
-
test('type test', () => {
|
|
163
|
-
expect(1).toBe(1); // dummy
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
{
|
|
167
|
-
const s: Observable<number> = source<number>();
|
|
168
|
-
|
|
169
|
-
const _d1 = s.pipe(map((x) => x + 1));
|
|
170
|
-
|
|
171
|
-
expectType<typeof _d1, Observable<number>>('=');
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
{
|
|
175
|
-
const s = source<number>();
|
|
176
|
-
|
|
177
|
-
const m: InitializedObservable<number> = s.pipe(withInitialValue(0));
|
|
178
|
-
|
|
179
|
-
const _d = m.pipe(map((x) => x + 1));
|
|
180
|
-
|
|
181
|
-
expectType<typeof _d, InitializedObservable<number>>('=');
|
|
182
|
-
}
|
|
183
|
-
}
|