synstate 0.1.2 → 1.0.1
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 +200 -147
- package/assets/old/synstate-icon-square.png +0 -0
- package/assets/synstate-logo.png +0 -0
- package/dist/core/class/child-observable-class.d.mts +2 -0
- package/dist/core/class/child-observable-class.d.mts.map +1 -1
- package/dist/core/class/child-observable-class.mjs +44 -13
- 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 +3 -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 -6
- package/dist/core/combine/combine.d.mts.map +1 -1
- package/dist/core/combine/combine.mjs +11 -12
- package/dist/core/combine/combine.mjs.map +1 -1
- package/dist/core/combine/merge.d.mts +7 -6
- package/dist/core/combine/merge.d.mts.map +1 -1
- package/dist/core/combine/merge.mjs +9 -9
- package/dist/core/combine/merge.mjs.map +1 -1
- package/dist/core/combine/zip.d.mts +21 -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 +0 -1
- package/dist/core/index.d.mts.map +1 -1
- package/dist/core/index.mjs +8 -13
- 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 +6 -5
- package/dist/core/operators/filter.d.mts.map +1 -1
- 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 +4 -4
- package/dist/core/operators/{map-with-index.d.mts → map.d.mts} +12 -11
- package/dist/core/operators/map.d.mts.map +1 -0
- package/dist/core/operators/{map-with-index.mjs → map.mjs} +17 -17
- package/dist/core/operators/map.mjs.map +1 -0
- package/dist/core/operators/merge-map.d.mts +56 -29
- package/dist/core/operators/merge-map.d.mts.map +1 -1
- package/dist/core/operators/merge-map.mjs +58 -31
- 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 +20 -8
- package/dist/core/operators/skip-if-no-change.d.mts.map +1 -1
- package/dist/core/operators/skip-if-no-change.mjs +23 -11
- 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 +19 -8
- package/dist/core/operators/skip-while.d.mts.map +1 -1
- package/dist/core/operators/skip-while.mjs +26 -11
- 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 +16 -7
- package/dist/core/operators/take-while.d.mts.map +1 -1
- package/dist/core/operators/take-while.mjs +18 -10
- 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 +9 -9
- package/dist/core/operators/with-buffered-from.mjs +12 -12
- package/dist/core/operators/with-buffered-from.mjs.map +1 -1
- package/dist/core/operators/with-current-value-from.d.mts +10 -9
- package/dist/core/operators/with-current-value-from.d.mts.map +1 -1
- package/dist/core/operators/with-current-value-from.mjs +13 -12
- 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.mjs +0 -1
- package/dist/core/predefined/index.mjs.map +1 -1
- package/dist/core/predefined/operators/attach-index.d.mts +50 -0
- package/dist/core/predefined/operators/attach-index.d.mts.map +1 -1
- package/dist/core/predefined/operators/attach-index.mjs +51 -2
- package/dist/core/predefined/operators/attach-index.mjs.map +1 -1
- package/dist/core/predefined/operators/index.d.mts +0 -1
- package/dist/core/predefined/operators/index.d.mts.map +1 -1
- package/dist/core/predefined/operators/index.mjs +0 -1
- package/dist/core/predefined/operators/index.mjs.map +1 -1
- package/dist/core/predefined/operators/map-optional.d.mts +48 -1
- package/dist/core/predefined/operators/map-optional.d.mts.map +1 -1
- package/dist/core/predefined/operators/map-optional.mjs +49 -1
- package/dist/core/predefined/operators/map-optional.mjs.map +1 -1
- package/dist/core/predefined/operators/map-result-err.d.mts +48 -1
- package/dist/core/predefined/operators/map-result-err.d.mts.map +1 -1
- package/dist/core/predefined/operators/map-result-err.mjs +49 -1
- package/dist/core/predefined/operators/map-result-err.mjs.map +1 -1
- package/dist/core/predefined/operators/map-result-ok.d.mts +48 -1
- package/dist/core/predefined/operators/map-result-ok.d.mts.map +1 -1
- package/dist/core/predefined/operators/map-result-ok.mjs +49 -1
- package/dist/core/predefined/operators/map-result-ok.mjs.map +1 -1
- package/dist/core/predefined/operators/map-to.d.mts +40 -0
- package/dist/core/predefined/operators/map-to.d.mts.map +1 -1
- package/dist/core/predefined/operators/map-to.mjs +43 -1
- package/dist/core/predefined/operators/map-to.mjs.map +1 -1
- package/dist/core/predefined/operators/pluck.d.mts +39 -0
- package/dist/core/predefined/operators/pluck.d.mts.map +1 -1
- package/dist/core/predefined/operators/pluck.mjs +42 -1
- package/dist/core/predefined/operators/pluck.mjs.map +1 -1
- package/dist/core/predefined/operators/skip.d.mts +48 -0
- package/dist/core/predefined/operators/skip.d.mts.map +1 -1
- package/dist/core/predefined/operators/skip.mjs +47 -0
- package/dist/core/predefined/operators/skip.mjs.map +1 -1
- package/dist/core/predefined/operators/take.d.mts +42 -0
- package/dist/core/predefined/operators/take.d.mts.map +1 -1
- package/dist/core/predefined/operators/take.mjs +41 -0
- package/dist/core/predefined/operators/take.mjs.map +1 -1
- package/dist/core/predefined/operators/unwrap-optional.d.mts +41 -1
- package/dist/core/predefined/operators/unwrap-optional.d.mts.map +1 -1
- package/dist/core/predefined/operators/unwrap-optional.mjs +42 -1
- package/dist/core/predefined/operators/unwrap-optional.mjs.map +1 -1
- package/dist/core/predefined/operators/unwrap-result-err.d.mts +41 -1
- package/dist/core/predefined/operators/unwrap-result-err.d.mts.map +1 -1
- package/dist/core/predefined/operators/unwrap-result-err.mjs +42 -1
- package/dist/core/predefined/operators/unwrap-result-err.mjs.map +1 -1
- package/dist/core/predefined/operators/unwrap-result-ok.d.mts +41 -1
- package/dist/core/predefined/operators/unwrap-result-ok.d.mts.map +1 -1
- package/dist/core/predefined/operators/unwrap-result-ok.mjs +42 -1
- package/dist/core/predefined/operators/unwrap-result-ok.mjs.map +1 -1
- package/dist/core/types/id.d.mts +2 -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 +10 -14
- package/dist/core/types/observable-family.d.mts.map +1 -1
- package/dist/core/types/observable-kind.d.mts +1 -0
- package/dist/core/types/observable-kind.d.mts.map +1 -1
- package/dist/core/types/observable.d.mts +5 -3
- package/dist/core/types/observable.d.mts.map +1 -1
- package/dist/core/types/observable.mjs.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/core/utils/utils.d.mts +2 -0
- package/dist/core/utils/utils.d.mts.map +1 -1
- package/dist/core/utils/utils.mjs.map +1 -1
- package/dist/entry-point.mjs +11 -14
- package/dist/entry-point.mjs.map +1 -1
- package/dist/index.mjs +11 -14
- package/dist/index.mjs.map +1 -1
- package/dist/types.d.mts +1 -2
- 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 +11 -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 +21 -14
- package/src/core/class/child-observable-class.mts +68 -14
- 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 +10 -9
- package/src/core/class/root-observable-class.mts +15 -10
- package/src/core/combine/combine.mts +14 -13
- package/src/core/combine/merge.mts +14 -14
- package/src/core/combine/zip.mts +27 -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 +0 -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-with-index.mts → map.mts} +20 -20
- package/src/core/operators/merge-map.mts +59 -32
- 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 +24 -12
- package/src/core/operators/skip-until.mts +9 -9
- package/src/core/operators/skip-while.mts +29 -12
- 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 +19 -11
- package/src/core/operators/{throttle-time.mts → throttle.mts} +58 -38
- package/src/core/operators/with-buffered-from.mts +13 -13
- package/src/core/operators/with-current-value-from.mts +14 -13
- package/src/core/operators/with-initial-value.mts +9 -9
- package/src/core/predefined/operators/attach-index.mts +52 -2
- package/src/core/predefined/operators/index.mts +0 -1
- package/src/core/predefined/operators/map-optional.mts +49 -2
- package/src/core/predefined/operators/map-result-err.mts +49 -2
- package/src/core/predefined/operators/map-result-ok.mts +49 -2
- package/src/core/predefined/operators/map-to.mts +41 -1
- package/src/core/predefined/operators/pluck.mts +40 -1
- package/src/core/predefined/operators/skip.mts +48 -0
- package/src/core/predefined/operators/take.mts +42 -0
- package/src/core/predefined/operators/unwrap-optional.mts +43 -2
- package/src/core/predefined/operators/unwrap-result-err.mts +43 -2
- package/src/core/predefined/operators/unwrap-result-ok.mts +43 -2
- package/src/core/types/id.mts +3 -1
- package/src/core/types/index.mts +1 -0
- package/src/core/types/observable-family.mts +13 -24
- package/src/core/types/observable-kind.mts +2 -0
- package/src/core/types/observable.mts +5 -4
- package/src/core/types/timer.mts +2 -0
- package/src/core/utils/id-maker.mts +4 -4
- package/src/core/utils/utils.mts +1 -0
- 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 +12 -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.map +0 -1
- 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/dist/core/predefined/operators/map.d.mts +0 -3
- package/dist/core/predefined/operators/map.d.mts.map +0 -1
- package/dist/core/predefined/operators/map.mjs +0 -8
- package/dist/core/predefined/operators/map.mjs.map +0 -1
- package/dist/globals.d.mts +0 -4
- 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/predefined/operators/map.mts +0 -5
- package/src/globals.d.mts +0 -4
- /package/assets/{synstate-icon.png → old/synstate-icon.png} +0 -0
|
@@ -25,39 +25,35 @@ import {
|
|
|
25
25
|
*
|
|
26
26
|
* const count$ = source<number>();
|
|
27
27
|
*
|
|
28
|
-
* const
|
|
28
|
+
* const valueHistory: number[] = [];
|
|
29
29
|
*
|
|
30
30
|
* count$.subscribe((value) => {
|
|
31
|
-
*
|
|
31
|
+
* valueHistory.push(value);
|
|
32
32
|
* });
|
|
33
33
|
*
|
|
34
34
|
* count$.next(1); // logs: 1
|
|
35
35
|
*
|
|
36
|
-
* assert.deepStrictEqual(
|
|
36
|
+
* assert.deepStrictEqual(valueHistory, [1]);
|
|
37
37
|
*
|
|
38
38
|
* count$.next(2); // logs: 2
|
|
39
39
|
*
|
|
40
|
-
* assert.deepStrictEqual(
|
|
40
|
+
* assert.deepStrictEqual(valueHistory, [1, 2]);
|
|
41
41
|
*
|
|
42
42
|
* count$.next(3); // logs: 3
|
|
43
43
|
*
|
|
44
|
-
* assert.deepStrictEqual(
|
|
44
|
+
* assert.deepStrictEqual(valueHistory, [1, 2, 3]);
|
|
45
45
|
* ```
|
|
46
46
|
*/
|
|
47
|
-
export function source<A>(
|
|
47
|
+
export function source<const A>(
|
|
48
|
+
initialValue: A,
|
|
49
|
+
): InitializedSourceObservable<A>;
|
|
48
50
|
|
|
49
|
-
export function source<A>(): SourceObservable<A>;
|
|
51
|
+
export function source<const A>(): SourceObservable<A>;
|
|
50
52
|
|
|
51
|
-
export function source<A>(...args: readonly A[]): SourceObservable<A> {
|
|
53
|
+
export function source<const A>(...args: readonly A[]): SourceObservable<A> {
|
|
52
54
|
return new SourceObservableClass<A>(...args);
|
|
53
55
|
}
|
|
54
56
|
|
|
55
|
-
/**
|
|
56
|
-
* Alias for `source`. Creates a new Observable source.
|
|
57
|
-
* @see source
|
|
58
|
-
*/
|
|
59
|
-
export const subject = source;
|
|
60
|
-
|
|
61
57
|
class SourceObservableClass<A>
|
|
62
58
|
extends RootObservableClass<A>
|
|
63
59
|
implements SourceObservable<A>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Optional } from 'ts-data-forge';
|
|
2
2
|
import { RootObservableClass } from '../class/index.mjs';
|
|
3
|
-
import { type TimerObservable } from '../types/index.mjs';
|
|
3
|
+
import { type TimerId, type TimerObservable } from '../types/index.mjs';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Creates an observable that emits 0 after a specified delay and then completes.
|
|
@@ -22,12 +22,12 @@ import { type TimerObservable } from '../types/index.mjs';
|
|
|
22
22
|
*
|
|
23
23
|
* const delayed$ = timer(100);
|
|
24
24
|
*
|
|
25
|
-
* const
|
|
25
|
+
* const valueHistory: number[] = [];
|
|
26
26
|
*
|
|
27
27
|
* await new Promise<void>((resolve) => {
|
|
28
28
|
* delayed$.subscribe(
|
|
29
29
|
* () => {
|
|
30
|
-
*
|
|
30
|
+
* valueHistory.push(1);
|
|
31
31
|
* },
|
|
32
32
|
* () => {
|
|
33
33
|
* resolve();
|
|
@@ -35,13 +35,16 @@ import { type TimerObservable } from '../types/index.mjs';
|
|
|
35
35
|
* );
|
|
36
36
|
* });
|
|
37
37
|
*
|
|
38
|
-
* assert.deepStrictEqual(
|
|
38
|
+
* assert.deepStrictEqual(valueHistory, [1]);
|
|
39
39
|
* ```
|
|
40
40
|
*/
|
|
41
41
|
export const timer = (
|
|
42
42
|
milliSeconds: number,
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
options?: Readonly<{
|
|
44
|
+
startManually?: boolean;
|
|
45
|
+
}>,
|
|
46
|
+
): TimerObservable =>
|
|
47
|
+
new TimerObservableClass(milliSeconds, options?.startManually ?? false);
|
|
45
48
|
|
|
46
49
|
class TimerObservableClass
|
|
47
50
|
extends RootObservableClass<0>
|
|
@@ -65,11 +68,11 @@ class TimerObservableClass
|
|
|
65
68
|
}
|
|
66
69
|
}
|
|
67
70
|
|
|
68
|
-
start():
|
|
71
|
+
start(): void {
|
|
69
72
|
if (this.#mut_isStarted) {
|
|
70
73
|
console.warn('cannot start twice');
|
|
71
74
|
|
|
72
|
-
return
|
|
75
|
+
return;
|
|
73
76
|
}
|
|
74
77
|
|
|
75
78
|
this.#mut_isStarted = true;
|
|
@@ -77,7 +80,7 @@ class TimerObservableClass
|
|
|
77
80
|
if (this.isCompleted) {
|
|
78
81
|
console.warn('cannot restart stopped TimerObservable');
|
|
79
82
|
|
|
80
|
-
return
|
|
83
|
+
return;
|
|
81
84
|
}
|
|
82
85
|
|
|
83
86
|
this.#mut_timerId = setTimeout(() => {
|
|
@@ -85,8 +88,6 @@ class TimerObservableClass
|
|
|
85
88
|
|
|
86
89
|
this.complete();
|
|
87
90
|
}, this.#milliSeconds);
|
|
88
|
-
|
|
89
|
-
return this;
|
|
90
91
|
}
|
|
91
92
|
|
|
92
93
|
#resetTimer(): void {
|
package/src/core/index.mts
CHANGED
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { Optional } from 'ts-data-forge';
|
|
2
|
+
import { AsyncChildObservableClass } from '../class/index.mjs';
|
|
3
|
+
import {
|
|
4
|
+
type AuditOperatorObservable,
|
|
5
|
+
type KeepInitialValueOperator,
|
|
6
|
+
type Observable,
|
|
7
|
+
type TimerId,
|
|
8
|
+
type UpdateToken,
|
|
9
|
+
} from '../types/index.mjs';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Ignores source values for duration milliseconds, then emits the most recent value from the source Observable, then repeats this process.
|
|
13
|
+
*
|
|
14
|
+
* Unlike `throttle` which emits the first value, `audit` emits the last value.
|
|
15
|
+
*
|
|
16
|
+
* @template A - The type of values from the source
|
|
17
|
+
* @param milliSeconds - The audit time window in milliseconds
|
|
18
|
+
* @returns An operator that audits emissions from the observable
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* // Timeline (250ms audit):
|
|
23
|
+
* //
|
|
24
|
+
* // Time(x50ms) 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
|
|
25
|
+
* //
|
|
26
|
+
* // input$ 0 2 3 9 10 11 12 13 14
|
|
27
|
+
* // |- 250ms -> |- 250ms -> |- 250ms -> |- 250ms ->
|
|
28
|
+
* // audited$ 2 3 11 14 (emitted at end of window)
|
|
29
|
+
* //
|
|
30
|
+
* // Explanation:
|
|
31
|
+
* // - audit emits the LAST value received during each time window
|
|
32
|
+
* // - Unlike throttle (which emits the FIRST value), audit emits the LAST
|
|
33
|
+
* // - Useful when you want the most recent value after a burst of events
|
|
34
|
+
*
|
|
35
|
+
* const input$ = source<number>();
|
|
36
|
+
*
|
|
37
|
+
* const audited$ = input$.pipe(audit(250));
|
|
38
|
+
*
|
|
39
|
+
* const valueHistory: number[] = [];
|
|
40
|
+
*
|
|
41
|
+
* audited$.subscribe((value) => {
|
|
42
|
+
* valueHistory.push(value);
|
|
43
|
+
* });
|
|
44
|
+
*
|
|
45
|
+
* const sleep = (ms: number): Promise<void> =>
|
|
46
|
+
* new Promise((resolve) => {
|
|
47
|
+
* setTimeout(resolve, ms);
|
|
48
|
+
* });
|
|
49
|
+
*
|
|
50
|
+
* input$.next(0);
|
|
51
|
+
*
|
|
52
|
+
* await sleep(200);
|
|
53
|
+
*
|
|
54
|
+
* input$.next(2);
|
|
55
|
+
*
|
|
56
|
+
* assert.deepStrictEqual(valueHistory, []);
|
|
57
|
+
*
|
|
58
|
+
* await sleep(100);
|
|
59
|
+
*
|
|
60
|
+
* assert.deepStrictEqual(valueHistory, [2]);
|
|
61
|
+
*
|
|
62
|
+
* input$.next(3);
|
|
63
|
+
*
|
|
64
|
+
* await sleep(300);
|
|
65
|
+
*
|
|
66
|
+
* assert.deepStrictEqual(valueHistory, [2, 3]);
|
|
67
|
+
*
|
|
68
|
+
* await sleep(300);
|
|
69
|
+
*
|
|
70
|
+
* input$.next(9);
|
|
71
|
+
*
|
|
72
|
+
* await sleep(100);
|
|
73
|
+
*
|
|
74
|
+
* input$.next(10);
|
|
75
|
+
*
|
|
76
|
+
* await sleep(100);
|
|
77
|
+
*
|
|
78
|
+
* input$.next(11);
|
|
79
|
+
*
|
|
80
|
+
* assert.deepStrictEqual(valueHistory, [2, 3]);
|
|
81
|
+
*
|
|
82
|
+
* await sleep(100);
|
|
83
|
+
*
|
|
84
|
+
* assert.deepStrictEqual(valueHistory, [2, 3, 11]);
|
|
85
|
+
*
|
|
86
|
+
* input$.next(12);
|
|
87
|
+
*
|
|
88
|
+
* await sleep(100);
|
|
89
|
+
*
|
|
90
|
+
* input$.next(13);
|
|
91
|
+
*
|
|
92
|
+
* assert.deepStrictEqual(valueHistory, [2, 3, 11]);
|
|
93
|
+
*
|
|
94
|
+
* await sleep(100);
|
|
95
|
+
*
|
|
96
|
+
* input$.next(14);
|
|
97
|
+
*
|
|
98
|
+
* assert.deepStrictEqual(valueHistory, [2, 3, 11]);
|
|
99
|
+
*
|
|
100
|
+
* await sleep(100);
|
|
101
|
+
*
|
|
102
|
+
* assert.deepStrictEqual(valueHistory, [2, 3, 11, 14]);
|
|
103
|
+
* ```
|
|
104
|
+
*/
|
|
105
|
+
export const audit = <A,>(
|
|
106
|
+
milliSeconds: number,
|
|
107
|
+
): KeepInitialValueOperator<A, A> =>
|
|
108
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
109
|
+
((parentObservable) =>
|
|
110
|
+
new AuditObservableClass(
|
|
111
|
+
parentObservable,
|
|
112
|
+
milliSeconds,
|
|
113
|
+
)) as KeepInitialValueOperator<A, A>;
|
|
114
|
+
|
|
115
|
+
class AuditObservableClass<A>
|
|
116
|
+
extends AsyncChildObservableClass<A, readonly [A]>
|
|
117
|
+
implements AuditOperatorObservable<A>
|
|
118
|
+
{
|
|
119
|
+
readonly #milliSeconds: number;
|
|
120
|
+
#mut_timerId: TimerId | undefined;
|
|
121
|
+
#mut_isSkipping: boolean;
|
|
122
|
+
|
|
123
|
+
constructor(parentObservable: Observable<A>, milliSeconds: number) {
|
|
124
|
+
super({
|
|
125
|
+
parents: [parentObservable],
|
|
126
|
+
initialValue: parentObservable.getSnapshot(),
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
this.#mut_isSkipping = false;
|
|
130
|
+
|
|
131
|
+
this.#mut_timerId = undefined;
|
|
132
|
+
|
|
133
|
+
this.#milliSeconds = milliSeconds;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
override tryUpdate(updateToken: UpdateToken): void {
|
|
137
|
+
const par = this.parents[0];
|
|
138
|
+
|
|
139
|
+
if (
|
|
140
|
+
par.updateToken !== updateToken ||
|
|
141
|
+
Optional.isNone(par.getSnapshot()) ||
|
|
142
|
+
this.#mut_isSkipping
|
|
143
|
+
) {
|
|
144
|
+
return; // skip update
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// set timer
|
|
148
|
+
this.#mut_isSkipping = true;
|
|
149
|
+
|
|
150
|
+
this.#mut_timerId = setTimeout(() => {
|
|
151
|
+
const sn = par.getSnapshot();
|
|
152
|
+
|
|
153
|
+
if (Optional.isNone(sn)) return;
|
|
154
|
+
|
|
155
|
+
this.startUpdate(sn.value);
|
|
156
|
+
|
|
157
|
+
this.#mut_isSkipping = false;
|
|
158
|
+
}, this.#milliSeconds);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
#resetTimer(): void {
|
|
162
|
+
if (this.#mut_timerId !== undefined) {
|
|
163
|
+
clearTimeout(this.#mut_timerId);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
override complete(): void {
|
|
168
|
+
this.#resetTimer();
|
|
169
|
+
|
|
170
|
+
super.complete();
|
|
171
|
+
}
|
|
172
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { Optional } from 'ts-data-forge';
|
|
2
|
+
import { AsyncChildObservableClass } from '../class/index.mjs';
|
|
3
|
+
import {
|
|
4
|
+
type DebounceOperatorObservable,
|
|
5
|
+
type KeepInitialValueOperator,
|
|
6
|
+
type Observable,
|
|
7
|
+
type TimerId,
|
|
8
|
+
type UpdateToken,
|
|
9
|
+
} from '../types/index.mjs';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Delays emissions from the source observable until a specified time has passed without another emission.
|
|
13
|
+
* Useful for handling user input events like typing or scrolling.
|
|
14
|
+
*
|
|
15
|
+
* @template A - The type of values from the source
|
|
16
|
+
* @param milliSeconds - The debounce duration in milliseconds
|
|
17
|
+
* @returns An operator that debounces the observable
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* // Timeline (250ms debounce):
|
|
22
|
+
* //
|
|
23
|
+
* // Time(x50ms) 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
|
|
24
|
+
* //
|
|
25
|
+
* // input$ 0 2 3 9 10 11 12 13 14
|
|
26
|
+
* // |- 250ms -> |- 250ms ->
|
|
27
|
+
* // debounced$ 3 14 (emitted after 250ms silence)
|
|
28
|
+
* //
|
|
29
|
+
* // Explanation:
|
|
30
|
+
* // - debounce emits the latest value AFTER a quiet period with no new emissions
|
|
31
|
+
* // - Unlike audit (which uses a fixed window), debounce resets the timer on every emission
|
|
32
|
+
* // - Useful for search-as-you-type and form validation
|
|
33
|
+
*
|
|
34
|
+
* const input$ = source<number>();
|
|
35
|
+
*
|
|
36
|
+
* const debounced$ = input$.pipe(debounce(250));
|
|
37
|
+
*
|
|
38
|
+
* const valueHistory: number[] = [];
|
|
39
|
+
*
|
|
40
|
+
* debounced$.subscribe((value) => {
|
|
41
|
+
* valueHistory.push(value);
|
|
42
|
+
* });
|
|
43
|
+
*
|
|
44
|
+
* const sleep = (ms: number): Promise<void> =>
|
|
45
|
+
* new Promise((resolve) => {
|
|
46
|
+
* setTimeout(resolve, ms);
|
|
47
|
+
* });
|
|
48
|
+
*
|
|
49
|
+
* input$.next(0);
|
|
50
|
+
*
|
|
51
|
+
* await sleep(200);
|
|
52
|
+
*
|
|
53
|
+
* input$.next(2);
|
|
54
|
+
*
|
|
55
|
+
* await sleep(100);
|
|
56
|
+
*
|
|
57
|
+
* input$.next(3);
|
|
58
|
+
*
|
|
59
|
+
* assert.deepStrictEqual(valueHistory, []);
|
|
60
|
+
*
|
|
61
|
+
* await sleep(300);
|
|
62
|
+
*
|
|
63
|
+
* assert.deepStrictEqual(valueHistory, [3]);
|
|
64
|
+
*
|
|
65
|
+
* await sleep(300);
|
|
66
|
+
*
|
|
67
|
+
* input$.next(9);
|
|
68
|
+
*
|
|
69
|
+
* await sleep(100);
|
|
70
|
+
*
|
|
71
|
+
* input$.next(10);
|
|
72
|
+
*
|
|
73
|
+
* await sleep(100);
|
|
74
|
+
*
|
|
75
|
+
* input$.next(11);
|
|
76
|
+
*
|
|
77
|
+
* await sleep(100);
|
|
78
|
+
*
|
|
79
|
+
* input$.next(12);
|
|
80
|
+
*
|
|
81
|
+
* await sleep(100);
|
|
82
|
+
*
|
|
83
|
+
* input$.next(13);
|
|
84
|
+
*
|
|
85
|
+
* await sleep(100);
|
|
86
|
+
*
|
|
87
|
+
* input$.next(14);
|
|
88
|
+
*
|
|
89
|
+
* assert.deepStrictEqual(valueHistory, [3]);
|
|
90
|
+
*
|
|
91
|
+
* await sleep(300);
|
|
92
|
+
*
|
|
93
|
+
* assert.deepStrictEqual(valueHistory, [3, 14]);
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
export const debounce = <A,>(
|
|
97
|
+
milliSeconds: number,
|
|
98
|
+
): KeepInitialValueOperator<A, A> =>
|
|
99
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
100
|
+
((parentObservable) =>
|
|
101
|
+
new DebounceObservableClass(
|
|
102
|
+
parentObservable,
|
|
103
|
+
milliSeconds,
|
|
104
|
+
)) as KeepInitialValueOperator<A, A>;
|
|
105
|
+
|
|
106
|
+
class DebounceObservableClass<A>
|
|
107
|
+
extends AsyncChildObservableClass<A, readonly [A]>
|
|
108
|
+
implements DebounceOperatorObservable<A>
|
|
109
|
+
{
|
|
110
|
+
readonly #milliSeconds: number;
|
|
111
|
+
#mut_timerId: TimerId | undefined;
|
|
112
|
+
|
|
113
|
+
constructor(parentObservable: Observable<A>, milliSeconds: number) {
|
|
114
|
+
super({
|
|
115
|
+
parents: [parentObservable],
|
|
116
|
+
initialValue: parentObservable.getSnapshot(),
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
this.#mut_timerId = undefined;
|
|
120
|
+
|
|
121
|
+
this.#milliSeconds = milliSeconds;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
override tryUpdate(updateToken: UpdateToken): void {
|
|
125
|
+
const par = this.parents[0];
|
|
126
|
+
|
|
127
|
+
const sn = par.getSnapshot();
|
|
128
|
+
|
|
129
|
+
if (par.updateToken !== updateToken || Optional.isNone(sn)) {
|
|
130
|
+
return; // skip update
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
this.#resetTimer();
|
|
134
|
+
|
|
135
|
+
// set timer
|
|
136
|
+
this.#mut_timerId = setTimeout(() => {
|
|
137
|
+
if (Optional.isNone(sn)) return;
|
|
138
|
+
|
|
139
|
+
this.startUpdate(sn.value);
|
|
140
|
+
}, this.#milliSeconds);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
#resetTimer(): void {
|
|
144
|
+
if (this.#mut_timerId !== undefined) {
|
|
145
|
+
clearTimeout(this.#mut_timerId);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
override complete(): void {
|
|
150
|
+
this.#resetTimer();
|
|
151
|
+
|
|
152
|
+
super.complete();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
type FilterOperatorObservable,
|
|
13
13
|
type InitializedObservable,
|
|
14
14
|
type Observable,
|
|
15
|
-
type
|
|
15
|
+
type UpdateToken,
|
|
16
16
|
} from '../types/index.mjs';
|
|
17
17
|
import { withInitialValue } from './with-initial-value.mjs';
|
|
18
18
|
|
|
@@ -40,29 +40,29 @@ import { withInitialValue } from './with-initial-value.mjs';
|
|
|
40
40
|
*
|
|
41
41
|
* const even$ = num$.pipe(filter((x) => x % 2 === 0));
|
|
42
42
|
*
|
|
43
|
-
* const
|
|
43
|
+
* const valueHistory: number[] = [];
|
|
44
44
|
*
|
|
45
45
|
* even$.subscribe((x) => {
|
|
46
|
-
*
|
|
46
|
+
* valueHistory.push(x);
|
|
47
47
|
* });
|
|
48
48
|
*
|
|
49
49
|
* num$.next(1); // nothing logged
|
|
50
50
|
*
|
|
51
51
|
* num$.next(2); // logs: 2
|
|
52
52
|
*
|
|
53
|
-
* assert.deepStrictEqual(
|
|
53
|
+
* assert.deepStrictEqual(valueHistory, [2]);
|
|
54
54
|
*
|
|
55
55
|
* num$.next(3); // nothing logged
|
|
56
56
|
*
|
|
57
57
|
* num$.next(4); // logs: 4
|
|
58
58
|
*
|
|
59
|
-
* assert.deepStrictEqual(
|
|
59
|
+
* assert.deepStrictEqual(valueHistory, [2, 4]);
|
|
60
60
|
*
|
|
61
61
|
* num$.next(5);
|
|
62
62
|
*
|
|
63
63
|
* num$.next(6);
|
|
64
64
|
*
|
|
65
|
-
* assert.deepStrictEqual(
|
|
65
|
+
* assert.deepStrictEqual(valueHistory, [2, 4, 6]);
|
|
66
66
|
* ```
|
|
67
67
|
*/
|
|
68
68
|
export function filter<A, B extends A>(
|
|
@@ -107,12 +107,12 @@ class FilterObservableClass<A>
|
|
|
107
107
|
this.#predicate = predicate;
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
override tryUpdate(
|
|
110
|
+
override tryUpdate(updateToken: UpdateToken): void {
|
|
111
111
|
const par = this.parents[0];
|
|
112
112
|
|
|
113
113
|
const sn = par.getSnapshot();
|
|
114
114
|
|
|
115
|
-
if (par.
|
|
115
|
+
if (par.updateToken !== updateToken || Optional.isNone(sn)) {
|
|
116
116
|
return; // skip update
|
|
117
117
|
}
|
|
118
118
|
|
|
@@ -120,7 +120,7 @@ class FilterObservableClass<A>
|
|
|
120
120
|
this.#mut_index === -1 ? asSafeUint(0) : SafeUint.add(1, this.#mut_index);
|
|
121
121
|
|
|
122
122
|
if (this.#predicate(sn.value, this.#mut_index)) {
|
|
123
|
-
this.setNext(sn.value,
|
|
123
|
+
this.setNext(sn.value, updateToken);
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
126
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export * from './audit
|
|
2
|
-
export * from './debounce
|
|
1
|
+
export * from './audit.mjs';
|
|
2
|
+
export * from './debounce.mjs';
|
|
3
3
|
export * from './filter.mjs';
|
|
4
|
-
export * from './map
|
|
4
|
+
export * from './map.mjs';
|
|
5
5
|
export * from './merge-map.mjs';
|
|
6
6
|
export * from './pairwise.mjs';
|
|
7
7
|
export * from './scan.mjs';
|
|
@@ -11,7 +11,7 @@ export * from './skip-while.mjs';
|
|
|
11
11
|
export * from './switch-map.mjs';
|
|
12
12
|
export * from './take-until.mjs';
|
|
13
13
|
export * from './take-while.mjs';
|
|
14
|
-
export * from './throttle
|
|
14
|
+
export * from './throttle.mjs';
|
|
15
15
|
export * from './with-buffered-from.mjs';
|
|
16
16
|
export * from './with-current-value-from.mjs';
|
|
17
17
|
export * from './with-initial-value.mjs';
|
|
@@ -4,9 +4,9 @@ import { source } from '../create/index.mjs';
|
|
|
4
4
|
import {
|
|
5
5
|
type InitializedObservable,
|
|
6
6
|
type KeepInitialValueOperator,
|
|
7
|
-
type
|
|
7
|
+
type MapOperatorObservable,
|
|
8
8
|
type Observable,
|
|
9
|
-
type
|
|
9
|
+
type UpdateToken,
|
|
10
10
|
} from '../types/index.mjs';
|
|
11
11
|
import { withInitialValue } from './with-initial-value.mjs';
|
|
12
12
|
|
|
@@ -22,8 +22,8 @@ import { withInitialValue } from './with-initial-value.mjs';
|
|
|
22
22
|
* ```ts
|
|
23
23
|
* // Timeline:
|
|
24
24
|
* //
|
|
25
|
-
* // num$ "
|
|
26
|
-
* // indexed$ "0:
|
|
25
|
+
* // num$ "A" "B" "C"
|
|
26
|
+
* // indexed$ "0: A" "1: B" "2: C"
|
|
27
27
|
* //
|
|
28
28
|
* // Explanation:
|
|
29
29
|
* // - mapWithIndex transforms each value along with its index
|
|
@@ -31,38 +31,38 @@ import { withInitialValue } from './with-initial-value.mjs';
|
|
|
31
31
|
*
|
|
32
32
|
* const num$ = source<string>();
|
|
33
33
|
*
|
|
34
|
-
* const indexed$ = num$.pipe(
|
|
34
|
+
* const indexed$ = num$.pipe(map((x, i) => `${i}: ${x}`));
|
|
35
35
|
*
|
|
36
|
-
* const
|
|
36
|
+
* const valueHistory: string[] = [];
|
|
37
37
|
*
|
|
38
38
|
* indexed$.subscribe((s) => {
|
|
39
|
-
*
|
|
39
|
+
* valueHistory.push(s);
|
|
40
40
|
* });
|
|
41
41
|
*
|
|
42
|
-
* num$.next('
|
|
42
|
+
* num$.next('A'); // 0: A
|
|
43
43
|
*
|
|
44
|
-
* num$.next('
|
|
44
|
+
* num$.next('B'); // 1: B
|
|
45
45
|
*
|
|
46
|
-
* num$.next('
|
|
46
|
+
* num$.next('C'); // 2: C
|
|
47
47
|
*
|
|
48
|
-
* assert.deepStrictEqual(
|
|
48
|
+
* assert.deepStrictEqual(valueHistory, ['0: A', '1: B', '2: C']);
|
|
49
49
|
* ```
|
|
50
50
|
*/
|
|
51
|
-
export const
|
|
51
|
+
export const map = <A, B>(
|
|
52
52
|
mapFn: (x: A, index: SafeUint | -1) => B,
|
|
53
53
|
): KeepInitialValueOperator<A, B> =>
|
|
54
54
|
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
55
55
|
((parentObservable) =>
|
|
56
|
-
new
|
|
56
|
+
new MapObservableClass(
|
|
57
57
|
parentObservable,
|
|
58
58
|
mapFn,
|
|
59
59
|
)) as KeepInitialValueOperator<A, B>;
|
|
60
60
|
|
|
61
61
|
/* implementation */
|
|
62
62
|
|
|
63
|
-
class
|
|
63
|
+
class MapObservableClass<A, B>
|
|
64
64
|
extends SyncChildObservableClass<B, readonly [A]>
|
|
65
|
-
implements
|
|
65
|
+
implements MapOperatorObservable<A, B>
|
|
66
66
|
{
|
|
67
67
|
readonly #mapFn: (x: A, index: SafeUint | -1) => B;
|
|
68
68
|
#mut_index: SafeUint | -1;
|
|
@@ -83,19 +83,19 @@ class MapWithIndexObservableClass<A, B>
|
|
|
83
83
|
this.#mapFn = mapFn;
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
-
override tryUpdate(
|
|
86
|
+
override tryUpdate(updateToken: UpdateToken): void {
|
|
87
87
|
const par = this.parents[0];
|
|
88
88
|
|
|
89
89
|
const sn = par.getSnapshot();
|
|
90
90
|
|
|
91
|
-
if (par.
|
|
91
|
+
if (par.updateToken !== updateToken || Optional.isNone(sn)) {
|
|
92
92
|
return; // skip update
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
this.#mut_index =
|
|
96
96
|
this.#mut_index === -1 ? asSafeUint(0) : SafeUint.add(1, this.#mut_index);
|
|
97
97
|
|
|
98
|
-
this.setNext(this.#mapFn(sn.value, this.#mut_index),
|
|
98
|
+
this.setNext(this.#mapFn(sn.value, this.#mut_index), updateToken);
|
|
99
99
|
}
|
|
100
100
|
}
|
|
101
101
|
|
|
@@ -107,7 +107,7 @@ if (import.meta.vitest !== undefined) {
|
|
|
107
107
|
{
|
|
108
108
|
const s: Observable<number> = source<number>();
|
|
109
109
|
|
|
110
|
-
const _d1 = s.pipe(
|
|
110
|
+
const _d1 = s.pipe(map((x, i) => x + i));
|
|
111
111
|
|
|
112
112
|
expectType<typeof _d1, Observable<number>>('=');
|
|
113
113
|
}
|
|
@@ -117,7 +117,7 @@ if (import.meta.vitest !== undefined) {
|
|
|
117
117
|
|
|
118
118
|
const m: InitializedObservable<number> = s.pipe(withInitialValue(0));
|
|
119
119
|
|
|
120
|
-
const _d = m.pipe(
|
|
120
|
+
const _d = m.pipe(map((x, i) => x + i));
|
|
121
121
|
|
|
122
122
|
expectType<typeof _d, InitializedObservable<number>>('=');
|
|
123
123
|
}
|