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
|
@@ -15,38 +15,39 @@ import '../utils/id-maker.mjs';
|
|
|
15
15
|
* ```ts
|
|
16
16
|
* // Timeline:
|
|
17
17
|
* //
|
|
18
|
-
* // letters$ '
|
|
18
|
+
* // letters$ 'A' 'B' 'C'
|
|
19
19
|
* // numbers$ 1 2 3
|
|
20
|
-
* // zipped$ ['
|
|
20
|
+
* // zipped$ ['A',1] ['B',2] ['C',3]
|
|
21
21
|
* //
|
|
22
22
|
* // Explanation:
|
|
23
23
|
* // - zip pairs values by their index from multiple sources
|
|
24
24
|
* // - Waits for all sources to emit at the same index
|
|
25
25
|
* // - Completes when any source completes
|
|
26
26
|
*
|
|
27
|
-
* const letters
|
|
27
|
+
* const [letters$, setLetter] = createState<string>('A');
|
|
28
28
|
*
|
|
29
|
-
* const numbers
|
|
29
|
+
* const [numbers$, setNumber] = createState<number>(1);
|
|
30
30
|
*
|
|
31
31
|
* const zipped$ = zip([letters$, numbers$]);
|
|
32
32
|
*
|
|
33
|
-
* const
|
|
33
|
+
* const valueHistory: (readonly [string, number])[] = [];
|
|
34
34
|
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* ([letter, num]) => {
|
|
38
|
-
* mut_history.push([letter, num]);
|
|
39
|
-
* },
|
|
40
|
-
* () => {
|
|
41
|
-
* resolve();
|
|
42
|
-
* },
|
|
43
|
-
* );
|
|
35
|
+
* zipped$.subscribe(([letter, num]) => {
|
|
36
|
+
* valueHistory.push([letter, num]);
|
|
44
37
|
* });
|
|
45
38
|
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
39
|
+
* for (const letter of ['B', 'C']) {
|
|
40
|
+
* setLetter(letter);
|
|
41
|
+
* }
|
|
42
|
+
*
|
|
43
|
+
* for (const num of [2, 3]) {
|
|
44
|
+
* setNumber(num);
|
|
45
|
+
* }
|
|
46
|
+
*
|
|
47
|
+
* assert.deepStrictEqual(valueHistory, [
|
|
48
|
+
* ['A', 1],
|
|
49
|
+
* ['B', 2],
|
|
50
|
+
* ['C', 3],
|
|
50
51
|
* ]);
|
|
51
52
|
* ```
|
|
52
53
|
*/
|
|
@@ -67,11 +68,11 @@ class ZipObservableClass extends SyncChildObservableClass {
|
|
|
67
68
|
});
|
|
68
69
|
this.#queues = Arr.map(parents, () => createQueue());
|
|
69
70
|
}
|
|
70
|
-
tryUpdate(
|
|
71
|
+
tryUpdate(updateToken) {
|
|
71
72
|
const queues = this.#queues;
|
|
72
73
|
for (const [index, par] of this.parents.entries()) {
|
|
73
74
|
const sn = par.getSnapshot();
|
|
74
|
-
if (par.
|
|
75
|
+
if (par.updateToken === updateToken && Optional.isSome(sn)) {
|
|
75
76
|
queues[index]?.enqueue(sn.value);
|
|
76
77
|
}
|
|
77
78
|
}
|
|
@@ -79,7 +80,7 @@ class ZipObservableClass extends SyncChildObservableClass {
|
|
|
79
80
|
const nextValue =
|
|
80
81
|
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
81
82
|
Arr.map(queues, (q) => Optional.unwrap(q.dequeue()));
|
|
82
|
-
this.setNext(nextValue,
|
|
83
|
+
this.setNext(nextValue, updateToken);
|
|
83
84
|
}
|
|
84
85
|
}
|
|
85
86
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zip.mjs","sources":["../../../src/core/combine/zip.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAiBA
|
|
1
|
+
{"version":3,"file":"zip.mjs","sources":["../../../src/core/combine/zip.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDG;AACI,MAAM,GAAG,GAAG,CACjB,OAAW;AAEX;AACA,IAAI,kBAAkB,CAAC,OAAO;AAEhC,MAAM,kBACJ,SAAQ,wBAA8B,CAAA;AAG7B,IAAA,OAAO;AAEhB,IAAA,WAAA,CAAY,OAAgB,EAAA;AAC1B,QAAA,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;AAEzD,QAAA,KAAK,CAAC;YACJ,OAAO;YACP,YAAY,EAAE,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM;kBAC7C,QAAQ,CAAC,IAAI;;AAEX,gBAAA,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAM;kBAE7C,QAAQ,CAAC,IAAI;AAClB,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,MAC9B,WAAW,EAAE,CACiB;;AAGzB,IAAA,SAAS,CAAC,WAAwB,EAAA;AACzC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO;AAE3B,QAAA,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE;AACjD,YAAA,MAAM,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE;AAE5B,YAAA,IAAI,GAAG,CAAC,WAAW,KAAK,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;gBAC1D,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC;;;AAIpC,QAAA,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;AACzC,YAAA,MAAM,SAAS;;YAEb,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAM;AAE3D,YAAA,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC;;;AAGzC;;;;"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type CounterObservable } from '../types/index.mjs';
|
|
2
2
|
/**
|
|
3
3
|
* Creates an observable that emits incremental numbers at a specified interval.
|
|
4
4
|
* Starts with 0 immediately after subscription, then emits 1, 2, 3, ... every interval.
|
|
5
5
|
*
|
|
6
|
-
* @param
|
|
6
|
+
* @param intervalMilliSeconds - The interval duration in milliseconds
|
|
7
7
|
* @param startManually - If true, waits for manual start (default: false)
|
|
8
8
|
* @returns An observable that emits sequential numbers
|
|
9
9
|
*
|
|
@@ -15,16 +15,16 @@ import { type IntervalObservable } from '../types/index.mjs';
|
|
|
15
15
|
* // tick$ 0 1 2 3 4 5 ...
|
|
16
16
|
* //
|
|
17
17
|
* // Explanation:
|
|
18
|
-
* // -
|
|
18
|
+
* // - counter emits incrementing numbers at specified intervals
|
|
19
19
|
* // - Starts at 0 and continues indefinitely
|
|
20
20
|
* // - Useful for periodic tasks or animations
|
|
21
21
|
*
|
|
22
|
-
* const tick$ =
|
|
22
|
+
* const tick$ = counter(100);
|
|
23
23
|
*
|
|
24
|
-
* const
|
|
24
|
+
* const valueHistory: number[] = [];
|
|
25
25
|
*
|
|
26
26
|
* const subscription = tick$.subscribe((count) => {
|
|
27
|
-
*
|
|
27
|
+
* valueHistory.push(count);
|
|
28
28
|
* });
|
|
29
29
|
*
|
|
30
30
|
* await new Promise((resolve) => {
|
|
@@ -33,14 +33,16 @@ import { type IntervalObservable } from '../types/index.mjs';
|
|
|
33
33
|
*
|
|
34
34
|
* subscription.unsubscribe();
|
|
35
35
|
*
|
|
36
|
-
* assert.isTrue(Arr.isArrayAtLeastLength(
|
|
36
|
+
* assert.isTrue(Arr.isArrayAtLeastLength(valueHistory, 3));
|
|
37
37
|
*
|
|
38
|
-
* assert.deepStrictEqual(
|
|
38
|
+
* assert.deepStrictEqual(valueHistory[0], 0);
|
|
39
39
|
*
|
|
40
|
-
* assert.deepStrictEqual(
|
|
40
|
+
* assert.deepStrictEqual(valueHistory[1], 1);
|
|
41
41
|
*
|
|
42
|
-
* assert.deepStrictEqual(
|
|
42
|
+
* assert.deepStrictEqual(valueHistory[2], 2);
|
|
43
43
|
* ```
|
|
44
44
|
*/
|
|
45
|
-
export declare const
|
|
46
|
-
|
|
45
|
+
export declare const counter: (intervalMilliSeconds: number, options?: Readonly<{
|
|
46
|
+
startManually?: boolean;
|
|
47
|
+
}>) => CounterObservable;
|
|
48
|
+
//# sourceMappingURL=counter.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"counter.d.mts","sourceRoot":"","sources":["../../../src/core/create/counter.mts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,iBAAiB,EAAgB,MAAM,oBAAoB,CAAC;AAE1E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,eAAO,MAAM,OAAO,GAClB,sBAAsB,MAAM,EAC5B,UAAU,QAAQ,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC,KACD,iBAIA,CAAC"}
|
|
@@ -6,7 +6,7 @@ import { RootObservableClass } from '../class/root-observable-class.mjs';
|
|
|
6
6
|
* Creates an observable that emits incremental numbers at a specified interval.
|
|
7
7
|
* Starts with 0 immediately after subscription, then emits 1, 2, 3, ... every interval.
|
|
8
8
|
*
|
|
9
|
-
* @param
|
|
9
|
+
* @param intervalMilliSeconds - The interval duration in milliseconds
|
|
10
10
|
* @param startManually - If true, waits for manual start (default: false)
|
|
11
11
|
* @returns An observable that emits sequential numbers
|
|
12
12
|
*
|
|
@@ -18,16 +18,16 @@ import { RootObservableClass } from '../class/root-observable-class.mjs';
|
|
|
18
18
|
* // tick$ 0 1 2 3 4 5 ...
|
|
19
19
|
* //
|
|
20
20
|
* // Explanation:
|
|
21
|
-
* // -
|
|
21
|
+
* // - counter emits incrementing numbers at specified intervals
|
|
22
22
|
* // - Starts at 0 and continues indefinitely
|
|
23
23
|
* // - Useful for periodic tasks or animations
|
|
24
24
|
*
|
|
25
|
-
* const tick$ =
|
|
25
|
+
* const tick$ = counter(100);
|
|
26
26
|
*
|
|
27
|
-
* const
|
|
27
|
+
* const valueHistory: number[] = [];
|
|
28
28
|
*
|
|
29
29
|
* const subscription = tick$.subscribe((count) => {
|
|
30
|
-
*
|
|
30
|
+
* valueHistory.push(count);
|
|
31
31
|
* });
|
|
32
32
|
*
|
|
33
33
|
* await new Promise((resolve) => {
|
|
@@ -36,52 +36,50 @@ import { RootObservableClass } from '../class/root-observable-class.mjs';
|
|
|
36
36
|
*
|
|
37
37
|
* subscription.unsubscribe();
|
|
38
38
|
*
|
|
39
|
-
* assert.isTrue(Arr.isArrayAtLeastLength(
|
|
39
|
+
* assert.isTrue(Arr.isArrayAtLeastLength(valueHistory, 3));
|
|
40
40
|
*
|
|
41
|
-
* assert.deepStrictEqual(
|
|
41
|
+
* assert.deepStrictEqual(valueHistory[0], 0);
|
|
42
42
|
*
|
|
43
|
-
* assert.deepStrictEqual(
|
|
43
|
+
* assert.deepStrictEqual(valueHistory[1], 1);
|
|
44
44
|
*
|
|
45
|
-
* assert.deepStrictEqual(
|
|
45
|
+
* assert.deepStrictEqual(valueHistory[2], 2);
|
|
46
46
|
* ```
|
|
47
47
|
*/
|
|
48
|
-
const
|
|
49
|
-
class
|
|
50
|
-
#
|
|
48
|
+
const counter = (intervalMilliSeconds, options) => new CounterObservableClass(intervalMilliSeconds, options?.startManually ?? false);
|
|
49
|
+
class CounterObservableClass extends RootObservableClass {
|
|
50
|
+
#intervalMilliSeconds;
|
|
51
51
|
#mut_counter;
|
|
52
52
|
#mut_timerId0;
|
|
53
53
|
#mut_timerId;
|
|
54
54
|
#mut_isStarted;
|
|
55
|
-
constructor(
|
|
55
|
+
constructor(intervalMilliSeconds, startManually) {
|
|
56
56
|
super({ initialValue: Optional.none });
|
|
57
|
-
this.#
|
|
57
|
+
this.#intervalMilliSeconds = intervalMilliSeconds;
|
|
58
58
|
this.#mut_counter = asSafeUint(0);
|
|
59
59
|
this.#mut_timerId0 = undefined;
|
|
60
60
|
this.#mut_timerId = undefined;
|
|
61
61
|
this.#mut_isStarted = false;
|
|
62
|
-
if (startManually
|
|
62
|
+
if (!startManually) {
|
|
63
63
|
this.start();
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
start() {
|
|
67
67
|
if (this.#mut_isStarted) {
|
|
68
68
|
console.warn('cannot start twice');
|
|
69
|
-
return
|
|
69
|
+
return;
|
|
70
70
|
}
|
|
71
71
|
this.#mut_isStarted = true;
|
|
72
72
|
if (this.isCompleted) {
|
|
73
|
-
console.warn('cannot restart stopped
|
|
74
|
-
return
|
|
73
|
+
console.warn('cannot restart stopped CounterObservable');
|
|
74
|
+
return;
|
|
75
75
|
}
|
|
76
|
-
// emit zero
|
|
77
76
|
this.#mut_timerId0 = setTimeout(() => {
|
|
78
77
|
this.startUpdate(this.#mut_counter);
|
|
79
78
|
}, 0);
|
|
80
79
|
this.#mut_timerId = setInterval(() => {
|
|
81
80
|
this.#mut_counter = SafeUint.add(1, this.#mut_counter);
|
|
82
81
|
this.startUpdate(this.#mut_counter);
|
|
83
|
-
}, this.#
|
|
84
|
-
return this;
|
|
82
|
+
}, this.#intervalMilliSeconds);
|
|
85
83
|
}
|
|
86
84
|
#resetTimer() {
|
|
87
85
|
if (this.#mut_timerId0 !== undefined && this.#mut_timerId !== undefined) {
|
|
@@ -95,5 +93,5 @@ class IntervalObservableClass extends RootObservableClass {
|
|
|
95
93
|
}
|
|
96
94
|
}
|
|
97
95
|
|
|
98
|
-
export {
|
|
99
|
-
//# sourceMappingURL=
|
|
96
|
+
export { counter };
|
|
97
|
+
//# sourceMappingURL=counter.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"counter.mjs","sources":["../../../src/core/create/counter.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CG;MACU,OAAO,GAAG,CACrB,oBAA4B,EAC5B,OAEE,KAEF,IAAI,sBAAsB,CACxB,oBAAoB,EACpB,OAAO,EAAE,aAAa,IAAI,KAAK;AAGnC,MAAM,sBACJ,SAAQ,mBAA6B,CAAA;AAG5B,IAAA,qBAAqB;AAC9B,IAAA,YAAY;AACZ,IAAA,aAAa;AACb,IAAA,YAAY;AACZ,IAAA,cAAc;IAEd,WAAA,CAAY,oBAA4B,EAAE,aAAsB,EAAA;QAC9D,KAAK,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;AAEtC,QAAA,IAAI,CAAC,qBAAqB,GAAG,oBAAoB;AAEjD,QAAA,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC;AAEjC,QAAA,IAAI,CAAC,aAAa,GAAG,SAAS;AAE9B,QAAA,IAAI,CAAC,YAAY,GAAG,SAAS;AAE7B,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;QAE3B,IAAI,CAAC,aAAa,EAAE;YAClB,IAAI,CAAC,KAAK,EAAE;QACd;IACF;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC;YAElC;QACF;AAEA,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAE1B,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AACpB,YAAA,OAAO,CAAC,IAAI,CAAC,0CAA0C,CAAC;YAExD;QACF;AAEA,QAAA,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,MAAK;AACnC,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC;QACrC,CAAC,EAAE,CAAC,CAAC;AAEL,QAAA,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,MAAK;AACnC,YAAA,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC;AAEtD,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC;AACrC,QAAA,CAAC,EAAE,IAAI,CAAC,qBAAqB,CAAC;IAChC;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE;AACvE,YAAA,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC;AAEjC,YAAA,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC;QAClC;IACF;IAES,QAAQ,GAAA;QACf,IAAI,CAAC,WAAW,EAAE;QAElB,KAAK,CAAC,QAAQ,EAAE;IAClB;AACD;;;;"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type FromPromiseObservable } from '../types/index.mjs';
|
|
2
|
+
/**
|
|
3
|
+
* Creates an observable from a Promise factory that receives an `AbortSignal`.
|
|
4
|
+
* When the observable is completed (e.g., by `switchMap` switching to a new
|
|
5
|
+
* inner observable), the `AbortController` is automatically aborted, cancelling
|
|
6
|
+
* the in-flight request.
|
|
7
|
+
*
|
|
8
|
+
* Emits `Result.ok(value)` when the promise resolves, or `Result.err(error)`
|
|
9
|
+
* when it rejects. Rejections caused by abort (`AbortError`) are silently
|
|
10
|
+
* ignored and do not emit.
|
|
11
|
+
*
|
|
12
|
+
* @template A - The type of the resolved value
|
|
13
|
+
* @template E - The type of the error (excluding AbortError)
|
|
14
|
+
* @param factory - A function that receives an `AbortSignal` and returns a Promise
|
|
15
|
+
* @returns An observable that emits the promise result
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* const results$ = query.pipe(
|
|
20
|
+
* switchMap((q) =>
|
|
21
|
+
* fromAbortablePromise((signal) =>
|
|
22
|
+
* fetch(`/api/search?q=${q}`, { signal }).then((r) => r.json()),
|
|
23
|
+
* ),
|
|
24
|
+
* ),
|
|
25
|
+
* );
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare const fromAbortablePromise: <A, E = unknown>(factory: (signal: AbortSignal) => Promise<A>) => FromPromiseObservable<A, E>;
|
|
29
|
+
//# sourceMappingURL=from-abortable-promise.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"from-abortable-promise.d.mts","sourceRoot":"","sources":["../../../src/core/create/from-abortable-promise.mts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,oBAAoB,GAAI,CAAC,EAAE,CAAC,GAAG,OAAO,EAEjD,SAAS,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,KAC3C,qBAAqB,CAAC,CAAC,EAAE,CAAC,CACqB,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Optional, Result } from 'ts-data-forge';
|
|
2
|
+
import '../utils/id-maker.mjs';
|
|
3
|
+
import { RootObservableClass } from '../class/root-observable-class.mjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Creates an observable from a Promise factory that receives an `AbortSignal`.
|
|
7
|
+
* When the observable is completed (e.g., by `switchMap` switching to a new
|
|
8
|
+
* inner observable), the `AbortController` is automatically aborted, cancelling
|
|
9
|
+
* the in-flight request.
|
|
10
|
+
*
|
|
11
|
+
* Emits `Result.ok(value)` when the promise resolves, or `Result.err(error)`
|
|
12
|
+
* when it rejects. Rejections caused by abort (`AbortError`) are silently
|
|
13
|
+
* ignored and do not emit.
|
|
14
|
+
*
|
|
15
|
+
* @template A - The type of the resolved value
|
|
16
|
+
* @template E - The type of the error (excluding AbortError)
|
|
17
|
+
* @param factory - A function that receives an `AbortSignal` and returns a Promise
|
|
18
|
+
* @returns An observable that emits the promise result
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* const results$ = query.pipe(
|
|
23
|
+
* switchMap((q) =>
|
|
24
|
+
* fromAbortablePromise((signal) =>
|
|
25
|
+
* fetch(`/api/search?q=${q}`, { signal }).then((r) => r.json()),
|
|
26
|
+
* ),
|
|
27
|
+
* ),
|
|
28
|
+
* );
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
const fromAbortablePromise = (
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
33
|
+
factory) => new FromAbortablePromiseObservableClass(factory);
|
|
34
|
+
class FromAbortablePromiseObservableClass extends RootObservableClass {
|
|
35
|
+
#abortController;
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
|
|
37
|
+
constructor(factory) {
|
|
38
|
+
super({ initialValue: Optional.none });
|
|
39
|
+
this.#abortController = new AbortController();
|
|
40
|
+
const promise = factory(this.#abortController.signal);
|
|
41
|
+
promise
|
|
42
|
+
.then((value) => {
|
|
43
|
+
if (this.isCompleted)
|
|
44
|
+
return;
|
|
45
|
+
this.startUpdate(Result.ok(value));
|
|
46
|
+
})
|
|
47
|
+
.catch((error) => {
|
|
48
|
+
if (this.isCompleted)
|
|
49
|
+
return;
|
|
50
|
+
// Silently ignore AbortError — it means the observable was
|
|
51
|
+
// intentionally completed (e.g., by switchMap).
|
|
52
|
+
if (error instanceof DOMException && error.name === 'AbortError') {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
this.startUpdate(Result.err(
|
|
56
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
57
|
+
error));
|
|
58
|
+
})
|
|
59
|
+
.finally(() => {
|
|
60
|
+
this.complete();
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
complete() {
|
|
64
|
+
this.#abortController.abort();
|
|
65
|
+
super.complete();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export { fromAbortablePromise };
|
|
70
|
+
//# sourceMappingURL=from-abortable-promise.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"from-abortable-promise.mjs","sources":["../../../src/core/create/from-abortable-promise.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAIA;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;AACI,MAAM,oBAAoB,GAAG;AAClC;AACA,OAA4C,KAE5C,IAAI,mCAAmC,CAAC,OAAO;AAEjD,MAAM,mCACJ,SAAQ,mBAAiC,CAAA;AAGhC,IAAA,gBAAgB;;AAGzB,IAAA,WAAA,CAAY,OAA4C,EAAA;QACtD,KAAK,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;AAEtC,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,eAAe,EAAE;QAE7C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;QAErD;AACG,aAAA,IAAI,CAAC,CAAC,KAAK,KAAI;YACd,IAAI,IAAI,CAAC,WAAW;gBAAE;YAEtB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AACpC,QAAA,CAAC;AACA,aAAA,KAAK,CAAC,CAAC,KAAc,KAAI;YACxB,IAAI,IAAI,CAAC,WAAW;gBAAE;;;YAItB,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE;gBAChE;YACF;AAEA,YAAA,IAAI,CAAC,WAAW,CACd,MAAM,CAAC,GAAG;;YAER,KAAU,CACX,CACF;AACH,QAAA,CAAC;aACA,OAAO,CAAC,MAAK;YACZ,IAAI,CAAC,QAAQ,EAAE;AACjB,QAAA,CAAC,CAAC;IACN;IAES,QAAQ,GAAA;AACf,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE;QAE7B,KAAK,CAAC,QAAQ,EAAE;IAClB;AACD;;;;"}
|
|
@@ -13,7 +13,7 @@ import { type FromPromiseObservable } from '../types/index.mjs';
|
|
|
13
13
|
* // Timeline:
|
|
14
14
|
* //
|
|
15
15
|
* // promise [pending...] -> resolved/rejected
|
|
16
|
-
* // data$
|
|
16
|
+
* // data$ Ok(value) or Err(error)
|
|
17
17
|
* //
|
|
18
18
|
* // Explanation:
|
|
19
19
|
* // - fromPromise converts a Promise into an observable
|
|
@@ -21,17 +21,20 @@ import { type FromPromiseObservable } from '../types/index.mjs';
|
|
|
21
21
|
* // - Completes after emitting the result
|
|
22
22
|
* // - Useful for integrating async operations into reactive flows
|
|
23
23
|
*
|
|
24
|
-
* const fetchData = async (): Promise<{ value: number }
|
|
24
|
+
* const fetchData = async (): Promise<Readonly<{ value: number }>> =>
|
|
25
|
+
* ({
|
|
26
|
+
* value: 42,
|
|
27
|
+
* }) as const;
|
|
25
28
|
*
|
|
26
29
|
* const data$ = fromPromise(fetchData());
|
|
27
30
|
*
|
|
28
|
-
* const
|
|
31
|
+
* const valueHistory: Readonly<{ value: number }>[] = [];
|
|
29
32
|
*
|
|
30
33
|
* await new Promise<void>((resolve) => {
|
|
31
34
|
* data$.subscribe(
|
|
32
35
|
* (result) => {
|
|
33
36
|
* if (Result.isOk(result)) {
|
|
34
|
-
*
|
|
37
|
+
* valueHistory.push(result.value);
|
|
35
38
|
* }
|
|
36
39
|
* },
|
|
37
40
|
* () => {
|
|
@@ -40,8 +43,8 @@ import { type FromPromiseObservable } from '../types/index.mjs';
|
|
|
40
43
|
* );
|
|
41
44
|
* });
|
|
42
45
|
*
|
|
43
|
-
* assert.deepStrictEqual(
|
|
46
|
+
* assert.deepStrictEqual(valueHistory, [{ value: 42 }]);
|
|
44
47
|
* ```
|
|
45
48
|
*/
|
|
46
|
-
export declare const fromPromise: <A, E = unknown>(promise:
|
|
49
|
+
export declare const fromPromise: <A, E = unknown>(promise: Promise<A>) => FromPromiseObservable<A, E>;
|
|
47
50
|
//# sourceMappingURL=from-promise.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"from-promise.d.mts","sourceRoot":"","sources":["../../../src/core/create/from-promise.mts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE
|
|
1
|
+
{"version":3,"file":"from-promise.d.mts","sourceRoot":"","sources":["../../../src/core/create/from-promise.mts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,CAAC,GAAG,OAAO,EACxC,SAAS,OAAO,CAAC,CAAC,CAAC,KAClB,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAA4C,CAAC"}
|
|
@@ -16,7 +16,7 @@ import { RootObservableClass } from '../class/root-observable-class.mjs';
|
|
|
16
16
|
* // Timeline:
|
|
17
17
|
* //
|
|
18
18
|
* // promise [pending...] -> resolved/rejected
|
|
19
|
-
* // data$
|
|
19
|
+
* // data$ Ok(value) or Err(error)
|
|
20
20
|
* //
|
|
21
21
|
* // Explanation:
|
|
22
22
|
* // - fromPromise converts a Promise into an observable
|
|
@@ -24,17 +24,20 @@ import { RootObservableClass } from '../class/root-observable-class.mjs';
|
|
|
24
24
|
* // - Completes after emitting the result
|
|
25
25
|
* // - Useful for integrating async operations into reactive flows
|
|
26
26
|
*
|
|
27
|
-
* const fetchData = async (): Promise<{ value: number }
|
|
27
|
+
* const fetchData = async (): Promise<Readonly<{ value: number }>> =>
|
|
28
|
+
* ({
|
|
29
|
+
* value: 42,
|
|
30
|
+
* }) as const;
|
|
28
31
|
*
|
|
29
32
|
* const data$ = fromPromise(fetchData());
|
|
30
33
|
*
|
|
31
|
-
* const
|
|
34
|
+
* const valueHistory: Readonly<{ value: number }>[] = [];
|
|
32
35
|
*
|
|
33
36
|
* await new Promise<void>((resolve) => {
|
|
34
37
|
* data$.subscribe(
|
|
35
38
|
* (result) => {
|
|
36
39
|
* if (Result.isOk(result)) {
|
|
37
|
-
*
|
|
40
|
+
* valueHistory.push(result.value);
|
|
38
41
|
* }
|
|
39
42
|
* },
|
|
40
43
|
* () => {
|
|
@@ -43,7 +46,7 @@ import { RootObservableClass } from '../class/root-observable-class.mjs';
|
|
|
43
46
|
* );
|
|
44
47
|
* });
|
|
45
48
|
*
|
|
46
|
-
* assert.deepStrictEqual(
|
|
49
|
+
* assert.deepStrictEqual(valueHistory, [{ value: 42 }]);
|
|
47
50
|
* ```
|
|
48
51
|
*/
|
|
49
52
|
const fromPromise = (promise) => new FromPromiseObservableClass(promise);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"from-promise.mjs","sources":["../../../src/core/create/from-promise.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAIA
|
|
1
|
+
{"version":3,"file":"from-promise.mjs","sources":["../../../src/core/create/from-promise.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CG;AACI,MAAM,WAAW,GAAG,CACzB,OAAmB,KACa,IAAI,0BAA0B,CAAC,OAAO;AAExE,MAAM,0BACJ,SAAQ,mBAAiC,CAAA;AAGzC,IAAA,WAAA,CAAY,OAAmB,EAAA;QAC7B,KAAK,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEtC;AACG,aAAA,IAAI,CAAC,CAAC,KAAK,KAAI;YACd,IAAI,IAAI,CAAC,WAAW;gBAAE;YAEtB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AACpC,QAAA,CAAC;AACA,aAAA,KAAK,CAAC,CAAC,KAAc,KAAI;YACxB,IAAI,IAAI,CAAC,WAAW;gBAAE;AAEtB,YAAA,IAAI,CAAC,WAAW,CACd,MAAM,CAAC,GAAG;;YAER,KAAU,CACX,CACF;AACH,QAAA,CAAC;aACA,OAAO,CAAC,MAAK;YACZ,IAAI,CAAC,QAAQ,EAAE;AACjB,QAAA,CAAC,CAAC;IACN;AACD;;;;"}
|
|
@@ -35,17 +35,17 @@ import { type FromSubscribableObservable, type Subscribable } from '../types/ind
|
|
|
35
35
|
*
|
|
36
36
|
* return { unsubscribe: () => {} };
|
|
37
37
|
* },
|
|
38
|
-
* };
|
|
38
|
+
* } as const;
|
|
39
39
|
*
|
|
40
40
|
* const observable$ = fromSubscribable<number>(customSubscribable);
|
|
41
41
|
*
|
|
42
|
-
* const
|
|
42
|
+
* const valueHistory: number[] = [];
|
|
43
43
|
*
|
|
44
44
|
* await new Promise<void>((resolve) => {
|
|
45
45
|
* observable$.subscribe(
|
|
46
46
|
* (result) => {
|
|
47
47
|
* if (Result.isOk(result)) {
|
|
48
|
-
*
|
|
48
|
+
* valueHistory.push(result.value);
|
|
49
49
|
* }
|
|
50
50
|
* },
|
|
51
51
|
* () => {
|
|
@@ -54,7 +54,7 @@ import { type FromSubscribableObservable, type Subscribable } from '../types/ind
|
|
|
54
54
|
* );
|
|
55
55
|
* });
|
|
56
56
|
*
|
|
57
|
-
* assert.deepStrictEqual(
|
|
57
|
+
* assert.deepStrictEqual(valueHistory, [1, 2, 3]);
|
|
58
58
|
* ```
|
|
59
59
|
*/
|
|
60
60
|
export declare const fromSubscribable: <A, E = unknown>(subscribable: Subscribable<A>) => FromSubscribableObservable<A, E>;
|
|
@@ -38,17 +38,17 @@ import { RootObservableClass } from '../class/root-observable-class.mjs';
|
|
|
38
38
|
*
|
|
39
39
|
* return { unsubscribe: () => {} };
|
|
40
40
|
* },
|
|
41
|
-
* };
|
|
41
|
+
* } as const;
|
|
42
42
|
*
|
|
43
43
|
* const observable$ = fromSubscribable<number>(customSubscribable);
|
|
44
44
|
*
|
|
45
|
-
* const
|
|
45
|
+
* const valueHistory: number[] = [];
|
|
46
46
|
*
|
|
47
47
|
* await new Promise<void>((resolve) => {
|
|
48
48
|
* observable$.subscribe(
|
|
49
49
|
* (result) => {
|
|
50
50
|
* if (Result.isOk(result)) {
|
|
51
|
-
*
|
|
51
|
+
* valueHistory.push(result.value);
|
|
52
52
|
* }
|
|
53
53
|
* },
|
|
54
54
|
* () => {
|
|
@@ -57,7 +57,7 @@ import { RootObservableClass } from '../class/root-observable-class.mjs';
|
|
|
57
57
|
* );
|
|
58
58
|
* });
|
|
59
59
|
*
|
|
60
|
-
* assert.deepStrictEqual(
|
|
60
|
+
* assert.deepStrictEqual(valueHistory, [1, 2, 3]);
|
|
61
61
|
* ```
|
|
62
62
|
*/
|
|
63
63
|
const fromSubscribable = (subscribable) => new FromSubscribableObservableClass(subscribable);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export * from './
|
|
1
|
+
export * from './counter.mjs';
|
|
2
|
+
export * from './from-abortable-promise.mjs';
|
|
2
3
|
export * from './from-promise.mjs';
|
|
3
4
|
export * from './from-subscribable.mjs';
|
|
4
|
-
export * from './
|
|
5
|
-
export * from './of.mjs';
|
|
5
|
+
export * from './just.mjs';
|
|
6
6
|
export * from './source.mjs';
|
|
7
7
|
export * from './timer.mjs';
|
|
8
8
|
//# sourceMappingURL=index.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/core/create/index.mts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/core/create/index.mts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { counter } from './counter.mjs';
|
|
2
|
+
export { fromAbortablePromise } from './from-abortable-promise.mjs';
|
|
2
3
|
export { fromPromise } from './from-promise.mjs';
|
|
3
4
|
export { fromSubscribable } from './from-subscribable.mjs';
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
6
|
-
export { source, subject } from './source.mjs';
|
|
5
|
+
export { just } from './just.mjs';
|
|
6
|
+
export { source } from './source.mjs';
|
|
7
7
|
export { timer } from './timer.mjs';
|
|
8
8
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type InitializedRootObservable } from '../types/index.mjs';
|
|
2
|
+
/**
|
|
3
|
+
* Creates an Observable that holds a single static value and immediately
|
|
4
|
+
* completes. Useful inside `switchMap` to emit a fallback value when no
|
|
5
|
+
* asynchronous work is needed.
|
|
6
|
+
*
|
|
7
|
+
* @template A - The type of the value
|
|
8
|
+
* @param value - The value to emit
|
|
9
|
+
* @returns An initialized Observable that holds the value and is already completed
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* const greeting$ = just('hello');
|
|
14
|
+
*
|
|
15
|
+
* const valueHistory: string[] = [];
|
|
16
|
+
*
|
|
17
|
+
* greeting$.subscribe(
|
|
18
|
+
* (value) => {
|
|
19
|
+
* valueHistory.push(value);
|
|
20
|
+
* },
|
|
21
|
+
* () => {
|
|
22
|
+
* // onComplete — called immediately since just() completes right away
|
|
23
|
+
* },
|
|
24
|
+
* );
|
|
25
|
+
*
|
|
26
|
+
* assert.deepStrictEqual(valueHistory, ['hello']);
|
|
27
|
+
*
|
|
28
|
+
* assert.strictEqual(greeting$.isCompleted, true);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare const just: <const A>(value: A) => InitializedRootObservable<A>;
|
|
32
|
+
//# sourceMappingURL=just.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"just.d.mts","sourceRoot":"","sources":["../../../src/core/create/just.mts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,IAAI,GAAI,KAAK,CAAC,CAAC,EAAG,OAAO,CAAC,KAAG,yBAAyB,CAAC,CAAC,CASpE,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Optional } from 'ts-data-forge';
|
|
2
|
+
import '../utils/id-maker.mjs';
|
|
3
|
+
import { RootObservableClass } from '../class/root-observable-class.mjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Creates an Observable that holds a single static value and immediately
|
|
7
|
+
* completes. Useful inside `switchMap` to emit a fallback value when no
|
|
8
|
+
* asynchronous work is needed.
|
|
9
|
+
*
|
|
10
|
+
* @template A - The type of the value
|
|
11
|
+
* @param value - The value to emit
|
|
12
|
+
* @returns An initialized Observable that holds the value and is already completed
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* const greeting$ = just('hello');
|
|
17
|
+
*
|
|
18
|
+
* const valueHistory: string[] = [];
|
|
19
|
+
*
|
|
20
|
+
* greeting$.subscribe(
|
|
21
|
+
* (value) => {
|
|
22
|
+
* valueHistory.push(value);
|
|
23
|
+
* },
|
|
24
|
+
* () => {
|
|
25
|
+
* // onComplete — called immediately since just() completes right away
|
|
26
|
+
* },
|
|
27
|
+
* );
|
|
28
|
+
*
|
|
29
|
+
* assert.deepStrictEqual(valueHistory, ['hello']);
|
|
30
|
+
*
|
|
31
|
+
* assert.strictEqual(greeting$.isCompleted, true);
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
const just = (value) => {
|
|
35
|
+
const obs = new RootObservableClass({
|
|
36
|
+
initialValue: Optional.some(value),
|
|
37
|
+
});
|
|
38
|
+
obs.complete();
|
|
39
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
40
|
+
return obs;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export { just };
|
|
44
|
+
//# sourceMappingURL=just.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"just.mjs","sources":["../../../src/core/create/just.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BG;AACI,MAAM,IAAI,GAAG,CAAW,KAAQ,KAAkC;AACvE,IAAA,MAAM,GAAG,GAAG,IAAI,mBAAmB,CAAI;AACrC,QAAA,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AACnC,KAAA,CAAC;IAEF,GAAG,CAAC,QAAQ,EAAE;;AAGd,IAAA,OAAO,GAAmC;AAC5C;;;;"}
|