synstate 3.4.0 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -8
- package/dist/core/authoring.d.mts +7 -0
- package/dist/core/authoring.d.mts.map +1 -0
- package/dist/core/authoring.mjs +7 -0
- package/dist/core/authoring.mjs.map +1 -0
- package/dist/core/class/child-observable-class.d.mts +93 -0
- package/dist/core/class/child-observable-class.d.mts.map +1 -0
- package/dist/core/class/child-observable-class.mjs +248 -0
- package/dist/core/class/child-observable-class.mjs.map +1 -0
- package/dist/core/class/create-child-observable.d.mts +159 -0
- package/dist/core/class/create-child-observable.d.mts.map +1 -0
- package/dist/core/class/create-child-observable.mjs +183 -0
- package/dist/core/class/create-child-observable.mjs.map +1 -0
- package/dist/core/class/create-root-observable.d.mts +37 -0
- package/dist/core/class/create-root-observable.d.mts.map +1 -0
- package/dist/core/class/create-root-observable.mjs +52 -0
- package/dist/core/class/create-root-observable.mjs.map +1 -0
- package/dist/core/class/index.d.mts +9 -0
- package/dist/core/class/index.d.mts.map +1 -0
- package/dist/core/class/index.mjs +9 -0
- package/dist/core/class/index.mjs.map +1 -0
- package/dist/core/class/manager-observable-class.d.mts +26 -0
- package/dist/core/class/manager-observable-class.d.mts.map +1 -0
- package/dist/core/class/manager-observable-class.mjs +116 -0
- package/dist/core/class/manager-observable-class.mjs.map +1 -0
- package/dist/core/class/observable-base-class.d.mts +97 -0
- package/dist/core/class/observable-base-class.d.mts.map +1 -0
- package/dist/core/class/observable-base-class.mjs +219 -0
- package/dist/core/class/observable-base-class.mjs.map +1 -0
- package/dist/core/class/observable-node.d.mts +40 -0
- package/dist/core/class/observable-node.d.mts.map +1 -0
- package/dist/core/class/observable-node.mjs +10 -0
- package/dist/core/class/observable-node.mjs.map +1 -0
- package/dist/core/class/propagation-state.d.mts +24 -0
- package/dist/core/class/propagation-state.d.mts.map +1 -0
- package/dist/core/class/propagation-state.mjs +66 -0
- package/dist/core/class/propagation-state.mjs.map +1 -0
- package/dist/core/class/root-observable-class.d.mts +23 -0
- package/dist/core/class/root-observable-class.d.mts.map +1 -0
- package/dist/core/class/root-observable-class.mjs +58 -0
- package/dist/core/class/root-observable-class.mjs.map +1 -0
- package/dist/core/combine/combine.d.mts.map +1 -1
- package/dist/core/combine/combine.mjs +25 -14
- package/dist/core/combine/combine.mjs.map +1 -1
- package/dist/core/combine/merge.d.mts.map +1 -1
- package/dist/core/combine/merge.mjs +26 -14
- package/dist/core/combine/merge.mjs.map +1 -1
- package/dist/core/combine/zip.d.mts.map +1 -1
- package/dist/core/combine/zip.mjs +43 -25
- package/dist/core/combine/zip.mjs.map +1 -1
- package/dist/core/create/counter.d.mts.map +1 -1
- package/dist/core/create/counter.mjs +65 -44
- package/dist/core/create/counter.mjs.map +1 -1
- package/dist/core/create/empty.d.mts +32 -0
- package/dist/core/create/empty.d.mts.map +1 -0
- package/dist/core/create/empty.mjs +39 -0
- package/dist/core/create/empty.mjs.map +1 -0
- package/dist/core/create/from-abortable-promise.d.mts.map +1 -1
- package/dist/core/create/from-abortable-promise.mjs +26 -18
- package/dist/core/create/from-abortable-promise.mjs.map +1 -1
- package/dist/core/create/from-promise.d.mts.map +1 -1
- package/dist/core/create/from-promise.mjs +30 -21
- package/dist/core/create/from-promise.mjs.map +1 -1
- package/dist/core/create/from-subscribable.d.mts.map +1 -1
- package/dist/core/create/from-subscribable.mjs +37 -24
- package/dist/core/create/from-subscribable.mjs.map +1 -1
- package/dist/core/create/index.d.mts +1 -0
- package/dist/core/create/index.d.mts.map +1 -1
- package/dist/core/create/index.mjs +1 -0
- package/dist/core/create/index.mjs.map +1 -1
- package/dist/core/create/just.d.mts.map +1 -1
- package/dist/core/create/just.mjs +4 -2
- package/dist/core/create/just.mjs.map +1 -1
- package/dist/core/create/source.d.mts.map +1 -1
- package/dist/core/create/source.mjs +27 -17
- package/dist/core/create/source.mjs.map +1 -1
- package/dist/core/create/timer.d.mts.map +1 -1
- package/dist/core/create/timer.mjs +40 -25
- package/dist/core/create/timer.mjs.map +1 -1
- package/dist/core/index.d.mts +2 -0
- package/dist/core/index.d.mts.map +1 -1
- package/dist/core/index.mjs +2 -0
- package/dist/core/index.mjs.map +1 -1
- package/dist/core/operators/audit.d.mts +3 -0
- package/dist/core/operators/audit.d.mts.map +1 -1
- package/dist/core/operators/audit.mjs +56 -28
- package/dist/core/operators/audit.mjs.map +1 -1
- package/dist/core/operators/debounce.d.mts +3 -0
- package/dist/core/operators/debounce.d.mts.map +1 -1
- package/dist/core/operators/debounce.mjs +57 -26
- package/dist/core/operators/debounce.mjs.map +1 -1
- package/dist/core/operators/filter.d.mts.map +1 -1
- package/dist/core/operators/filter.mjs +35 -21
- package/dist/core/operators/filter.mjs.map +1 -1
- package/dist/core/operators/index.d.mts +1 -0
- package/dist/core/operators/index.d.mts.map +1 -1
- package/dist/core/operators/index.mjs +1 -0
- package/dist/core/operators/index.mjs.map +1 -1
- package/dist/core/operators/map.d.mts.map +1 -1
- package/dist/core/operators/map.mjs +31 -17
- package/dist/core/operators/map.mjs.map +1 -1
- package/dist/core/operators/merge-map.d.mts +5 -0
- package/dist/core/operators/merge-map.d.mts.map +1 -1
- package/dist/core/operators/merge-map.mjs +52 -26
- package/dist/core/operators/merge-map.mjs.map +1 -1
- package/dist/core/operators/pairwise.d.mts.map +1 -1
- package/dist/core/operators/pairwise.mjs +31 -20
- package/dist/core/operators/pairwise.mjs.map +1 -1
- package/dist/core/operators/scan.d.mts.map +1 -1
- package/dist/core/operators/scan.mjs +27 -14
- package/dist/core/operators/scan.mjs.map +1 -1
- package/dist/core/operators/skip-if-no-change.d.mts.map +1 -1
- package/dist/core/operators/skip-if-no-change.mjs +33 -19
- package/dist/core/operators/skip-if-no-change.mjs.map +1 -1
- package/dist/core/operators/skip-until.d.mts.map +1 -1
- package/dist/core/operators/skip-until.mjs +40 -26
- package/dist/core/operators/skip-until.mjs.map +1 -1
- package/dist/core/operators/skip-while.d.mts.map +1 -1
- package/dist/core/operators/skip-while.mjs +35 -20
- package/dist/core/operators/skip-while.mjs.map +1 -1
- package/dist/core/operators/switch-map.d.mts +5 -0
- package/dist/core/operators/switch-map.d.mts.map +1 -1
- package/dist/core/operators/switch-map.mjs +56 -25
- package/dist/core/operators/switch-map.mjs.map +1 -1
- package/dist/core/operators/take-until.d.mts.map +1 -1
- package/dist/core/operators/take-until.mjs +36 -29
- package/dist/core/operators/take-until.mjs.map +1 -1
- package/dist/core/operators/take-while.d.mts.map +1 -1
- package/dist/core/operators/take-while.mjs +36 -22
- package/dist/core/operators/take-while.mjs.map +1 -1
- package/dist/core/{predefined/operators → operators}/take.d.mts +7 -3
- package/dist/core/operators/take.d.mts.map +1 -0
- package/dist/core/operators/take.mjs +102 -0
- package/dist/core/operators/take.mjs.map +1 -0
- package/dist/core/operators/throttle.d.mts.map +1 -1
- package/dist/core/operators/throttle.mjs +41 -26
- package/dist/core/operators/throttle.mjs.map +1 -1
- package/dist/core/operators/with-buffered-from.d.mts.map +1 -1
- package/dist/core/operators/with-buffered-from.mjs +43 -39
- package/dist/core/operators/with-buffered-from.mjs.map +1 -1
- package/dist/core/operators/with-current-value-from.d.mts.map +1 -1
- package/dist/core/operators/with-current-value-from.mjs +36 -21
- package/dist/core/operators/with-current-value-from.mjs.map +1 -1
- package/dist/core/operators/with-initial-value.d.mts.map +1 -1
- package/dist/core/operators/with-initial-value.mjs +24 -12
- package/dist/core/operators/with-initial-value.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/scope/index.d.mts +2 -0
- package/dist/core/scope/index.d.mts.map +1 -0
- package/dist/core/scope/index.mjs +2 -0
- package/dist/core/scope/index.mjs.map +1 -0
- package/dist/core/scope/scope.d.mts +51 -0
- package/dist/core/scope/scope.d.mts.map +1 -0
- package/dist/core/scope/scope.mjs +194 -0
- package/dist/core/scope/scope.mjs.map +1 -0
- package/dist/core/types/id.d.mts +0 -2
- 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/index.mjs +1 -0
- package/dist/core/types/index.mjs.map +1 -1
- package/dist/core/types/observable-family.d.mts +1 -0
- package/dist/core/types/observable-family.d.mts.map +1 -1
- package/dist/core/types/observable.d.mts +40 -28
- package/dist/core/types/observable.d.mts.map +1 -1
- package/dist/core/types/observable.mjs +24 -0
- package/dist/core/types/observable.mjs.map +1 -1
- package/dist/core/types/scope.d.mts +27 -0
- package/dist/core/types/scope.d.mts.map +1 -0
- package/dist/core/types/scope.mjs +2 -0
- package/dist/core/types/scope.mjs.map +1 -0
- package/dist/core/utils/current-scope.d.mts +30 -0
- package/dist/core/utils/current-scope.d.mts.map +1 -0
- package/dist/core/utils/current-scope.mjs +26 -0
- package/dist/core/utils/current-scope.mjs.map +1 -0
- package/dist/core/utils/id-maker.d.mts +14 -3
- package/dist/core/utils/id-maker.d.mts.map +1 -1
- package/dist/core/utils/id-maker.mjs +18 -14
- package/dist/core/utils/id-maker.mjs.map +1 -1
- package/dist/core/utils/index.d.mts +2 -1
- package/dist/core/utils/index.d.mts.map +1 -1
- package/dist/core/utils/index.mjs +2 -1
- package/dist/core/utils/index.mjs.map +1 -1
- package/dist/core/utils/max-depth.d.mts +1 -0
- package/dist/core/utils/max-depth.d.mts.map +1 -1
- package/dist/core/utils/max-depth.mjs +9 -7
- package/dist/core/utils/max-depth.mjs.map +1 -1
- package/dist/core/utils/observable-brand.d.mts +13 -0
- package/dist/core/utils/observable-brand.d.mts.map +1 -0
- package/dist/core/utils/observable-brand.mjs +13 -0
- package/dist/core/utils/observable-brand.mjs.map +1 -0
- package/dist/utils/create-boolean-state.d.mts +2 -2
- package/dist/utils/create-reducer.d.mts +7 -7
- package/dist/utils/create-reducer.mjs +2 -2
- package/dist/utils/create-reducer.mjs.map +1 -1
- package/dist/utils/create-state.d.mts +2 -2
- package/package.json +17 -17
- package/src/core/authoring.mts +19 -0
- package/src/core/class/child-observable-class.mts +374 -0
- package/src/core/{base → class}/circular-dependency-comparison.test.mts +46 -38
- package/src/core/{base → class}/circular-dependency.test.mts +38 -2
- package/src/core/class/complete-propagation.test.mts +264 -0
- package/src/core/class/create-child-observable.mts +370 -0
- package/src/core/class/create-root-observable.mts +107 -0
- package/src/core/class/index.mts +8 -0
- package/src/core/class/manager-observable-class.mts +166 -0
- package/src/core/class/observable-base-class.mts +315 -0
- package/src/core/{base → class}/observable-base.test.mts +1 -1
- package/src/core/class/observable-node.mts +54 -0
- package/src/core/class/propagation-order.test.mts +92 -0
- package/src/core/class/propagation-state.mts +80 -0
- package/src/core/class/remove-completed.test.mts +369 -0
- package/src/core/class/root-observable-class.mts +85 -0
- package/src/core/{base → class}/write-during-propagation.test.mts +3 -3
- package/src/core/combine/combine.mts +67 -55
- package/src/core/combine/merge.mts +33 -23
- package/src/core/combine/zip.mts +95 -81
- package/src/core/create/counter.mts +95 -65
- package/src/core/create/empty.mts +42 -0
- package/src/core/create/empty.test.mts +65 -0
- package/src/core/create/from-abortable-promise.mts +54 -42
- package/src/core/create/from-promise.mts +38 -29
- package/src/core/create/from-subscribable.mts +62 -45
- package/src/core/create/from-subscribable.test.mts +8 -3
- package/src/core/create/index.mts +1 -0
- package/src/core/create/just.mts +4 -5
- package/src/core/create/source.mts +29 -20
- package/src/core/create/timer.mts +51 -32
- package/src/core/index.mts +2 -0
- package/src/core/operators/audit.mts +79 -45
- package/src/core/operators/debounce-audit-complete.test.mts +121 -0
- package/src/core/operators/debounce.mts +81 -40
- package/src/core/operators/filter.mts +48 -31
- package/src/core/operators/index.mts +1 -0
- package/src/core/operators/inner-ownership.test.mts +280 -0
- package/src/core/operators/map.mts +49 -32
- package/src/core/operators/merge-map.mts +81 -43
- package/src/core/operators/pairwise.mts +40 -30
- package/src/core/operators/scan.mts +41 -24
- package/src/core/operators/skip-if-no-change.mts +45 -31
- package/src/core/operators/skip-until.mts +55 -41
- package/src/core/operators/skip-while.mts +49 -31
- package/src/core/operators/switch-map.mts +74 -35
- package/src/core/operators/take-until-skip-until-teardown.test.mts +18 -12
- package/src/core/operators/take-until.mts +45 -41
- package/src/core/operators/take-while.mts +50 -33
- package/src/core/operators/take.mts +138 -0
- package/src/core/operators/throttle.mts +55 -38
- package/src/core/operators/with-buffered-from.mts +42 -44
- package/src/core/operators/with-buffered-from.test.mts +4 -3
- package/src/core/operators/with-current-value-from.mts +39 -25
- package/src/core/operators/with-initial-value.mts +30 -21
- package/src/core/predefined/operators/index.mts +0 -1
- package/src/core/scope/index.mts +1 -0
- package/src/core/scope/scope.mts +260 -0
- package/src/core/scope/scope.test.mts +462 -0
- package/src/core/types/id.mts +0 -4
- package/src/core/types/index.mts +1 -0
- package/src/core/types/observable-family.mts +2 -0
- package/src/core/types/observable.mts +77 -42
- package/src/core/types/scope.mts +27 -0
- package/src/core/utils/current-scope.mts +61 -0
- package/src/core/utils/id-maker.mts +20 -30
- package/src/core/utils/index.mts +2 -1
- package/src/core/utils/max-depth.mts +12 -9
- package/src/core/utils/observable-brand.mts +12 -0
- package/src/utils/create-boolean-state.mts +2 -2
- package/src/utils/create-boolean-state.test.mts +18 -4
- package/src/utils/create-reducer.mts +9 -9
- package/src/utils/create-reducer.test.mts +31 -14
- package/src/utils/create-state.mts +2 -2
- package/src/utils/create-state.test.mts +12 -14
- package/dist/core/base/create-child-observable.d.mts +0 -72
- package/dist/core/base/create-child-observable.d.mts.map +0 -1
- package/dist/core/base/create-child-observable.mjs +0 -285
- package/dist/core/base/create-child-observable.mjs.map +0 -1
- package/dist/core/base/create-observable-base.d.mts +0 -149
- package/dist/core/base/create-observable-base.d.mts.map +0 -1
- package/dist/core/base/create-observable-base.mjs +0 -273
- package/dist/core/base/create-observable-base.mjs.map +0 -1
- package/dist/core/base/create-root-observable.d.mts +0 -46
- package/dist/core/base/create-root-observable.d.mts.map +0 -1
- package/dist/core/base/create-root-observable.mjs +0 -80
- package/dist/core/base/create-root-observable.mjs.map +0 -1
- package/dist/core/base/index.d.mts +0 -3
- package/dist/core/base/index.d.mts.map +0 -1
- package/dist/core/base/index.mjs +0 -3
- package/dist/core/base/index.mjs.map +0 -1
- package/dist/core/predefined/operators/take.d.mts.map +0 -1
- package/dist/core/predefined/operators/take.mjs +0 -44
- package/dist/core/predefined/operators/take.mjs.map +0 -1
- package/dist/core/utils/utils.d.mts +0 -6
- package/dist/core/utils/utils.d.mts.map +0 -1
- package/dist/core/utils/utils.mjs +0 -37
- package/dist/core/utils/utils.mjs.map +0 -1
- package/src/core/base/create-child-observable.mts +0 -485
- package/src/core/base/create-observable-base.mts +0 -568
- package/src/core/base/create-root-observable.mts +0 -147
- package/src/core/base/index.mts +0 -2
- package/src/core/predefined/operators/take.mts +0 -48
- package/src/core/utils/utils.mts +0 -56
- package/src/core/utils/utils.test.mts +0 -88
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
import { Arr } from 'ts-data-forge';
|
|
6
|
+
import { unreachable } from 'ts-std-forge';
|
|
7
|
+
import { AsyncChildObservableClass, SyncChildObservableClass, } from './child-observable-class.mjs';
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
export const createSyncChildObservable = (config, init) => new CustomSyncChildObservableClass(config, init);
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
export const createInitializedSyncChildObservable = (config, init) =>
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
new CustomSyncChildObservableClass(config, init);
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
export const createAsyncChildObservable = (config, init) => new CustomAsyncChildObservableClass(config, init);
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
export const createTryUpdateNotImplemented = () => tryUpdateNotImplemented;
|
|
89
|
+
const tryUpdateNotImplemented = () => {
|
|
90
|
+
unreachable();
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
class CustomSyncChildObservableClass extends SyncChildObservableClass {
|
|
94
|
+
#mut_teardowns;
|
|
95
|
+
#hooks;
|
|
96
|
+
constructor(config, init) {
|
|
97
|
+
super(config);
|
|
98
|
+
this.#mut_teardowns = undefined;
|
|
99
|
+
this.#hooks = toHooks(init({
|
|
100
|
+
setNext: (nextValue, updateToken) => {
|
|
101
|
+
this.setNext(nextValue, updateToken);
|
|
102
|
+
},
|
|
103
|
+
getSnapshot: () => this.getSnapshot(),
|
|
104
|
+
complete: () => {
|
|
105
|
+
this.complete();
|
|
106
|
+
},
|
|
107
|
+
completeAfterPropagation: () => {
|
|
108
|
+
this.completeAfterPropagation();
|
|
109
|
+
},
|
|
110
|
+
onComplete: (teardown) => {
|
|
111
|
+
if (this.isCompleted) {
|
|
112
|
+
teardown();
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
this.#mut_teardowns = Arr.toPushed(this.#mut_teardowns ?? [], teardown);
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
}));
|
|
119
|
+
this.attach();
|
|
120
|
+
}
|
|
121
|
+
tryUpdate(updateToken) {
|
|
122
|
+
this.#hooks.tryUpdate(updateToken);
|
|
123
|
+
}
|
|
124
|
+
canEmitNoMore() {
|
|
125
|
+
return this.#hooks.canEmitNoMore?.() === true;
|
|
126
|
+
}
|
|
127
|
+
teardown() {
|
|
128
|
+
for (const teardown of this.#mut_teardowns ?? []) {
|
|
129
|
+
teardown();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
class CustomAsyncChildObservableClass extends AsyncChildObservableClass {
|
|
134
|
+
#mut_teardowns;
|
|
135
|
+
#hooks;
|
|
136
|
+
constructor(config, init) {
|
|
137
|
+
super(config);
|
|
138
|
+
this.#mut_teardowns = undefined;
|
|
139
|
+
this.#hooks = toHooks(init({
|
|
140
|
+
setNext: (nextValue, updateToken) => {
|
|
141
|
+
this.setNext(nextValue, updateToken);
|
|
142
|
+
},
|
|
143
|
+
startUpdate: (nextValue) => {
|
|
144
|
+
this.startUpdate(nextValue);
|
|
145
|
+
},
|
|
146
|
+
getSnapshot: () => this.getSnapshot(),
|
|
147
|
+
complete: () => {
|
|
148
|
+
this.complete();
|
|
149
|
+
},
|
|
150
|
+
completeAfterPropagation: () => {
|
|
151
|
+
this.completeAfterPropagation();
|
|
152
|
+
},
|
|
153
|
+
onComplete: (teardown) => {
|
|
154
|
+
if (this.isCompleted) {
|
|
155
|
+
teardown();
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
this.#mut_teardowns = Arr.toPushed(this.#mut_teardowns ?? [], teardown);
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
}));
|
|
162
|
+
this.attach();
|
|
163
|
+
}
|
|
164
|
+
tryUpdate(updateToken) {
|
|
165
|
+
this.#hooks.tryUpdate(updateToken);
|
|
166
|
+
}
|
|
167
|
+
canEmitNoMore() {
|
|
168
|
+
return this.#hooks.canEmitNoMore?.() === true;
|
|
169
|
+
}
|
|
170
|
+
flush() {
|
|
171
|
+
this.#hooks.flush?.();
|
|
172
|
+
}
|
|
173
|
+
teardown() {
|
|
174
|
+
for (const teardown of this.#mut_teardowns ?? []) {
|
|
175
|
+
teardown();
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const toHooks = (returned) => typeof returned === 'function'
|
|
181
|
+
? { tryUpdate: returned }
|
|
182
|
+
: returned;
|
|
183
|
+
//# sourceMappingURL=create-child-observable.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-child-observable.mjs","sourceRoot":"","sources":["../../../src/core/class/create-child-observable.mts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type Optional } from 'ts-data-forge';
|
|
2
|
+
import type { ReadonlyRecord } from 'ts-type-forge';
|
|
3
|
+
import type { RootObservable } from '../types/index.mjs';
|
|
4
|
+
/**
|
|
5
|
+
* The tools a custom root's `init` receives: the `protected` methods a
|
|
6
|
+
* subclass of `RootObservableClass` inherits.
|
|
7
|
+
*/
|
|
8
|
+
export type RootObservableTools<A> = Readonly<{
|
|
9
|
+
/** Emits `nextValue` and propagates the update to all descendants. */
|
|
10
|
+
startUpdate: (nextValue: A) => void;
|
|
11
|
+
getSnapshot: () => Optional<A>;
|
|
12
|
+
isCompleted: () => boolean;
|
|
13
|
+
/** Completes this observable (leaf teardown included). */
|
|
14
|
+
complete: () => void;
|
|
15
|
+
/**
|
|
16
|
+
* Registers a teardown (clear timers, abort requests, remove listeners, …)
|
|
17
|
+
* to run at the beginning of `complete()`, in the order registered. Called
|
|
18
|
+
* from `init`, it lets the teardown close over what `init` creates.
|
|
19
|
+
* Registered once the observable has completed — `init` may complete it
|
|
20
|
+
* synchronously first — the teardown runs at once.
|
|
21
|
+
*/
|
|
22
|
+
onComplete: (teardown: () => void) => void;
|
|
23
|
+
}>;
|
|
24
|
+
export type RootObservableConfig<A> = Readonly<{
|
|
25
|
+
initialValue: Optional<A>;
|
|
26
|
+
}>;
|
|
27
|
+
/**
|
|
28
|
+
* Creates a root observable, for a custom creator written without a class
|
|
29
|
+
* of its own.
|
|
30
|
+
*
|
|
31
|
+
* `init` runs during construction, receives the tools, and returns extra
|
|
32
|
+
* public members to merge into the observable (e.g. `next` for a source,
|
|
33
|
+
* `start` for a timer). It may register asynchronous callbacks that use the
|
|
34
|
+
* tools, and may call `complete` synchronously.
|
|
35
|
+
*/
|
|
36
|
+
export declare const createRootObservable: <A, Extension extends ReadonlyRecord<string, unknown> = ReadonlyRecord<never, never>>({ initialValue }: RootObservableConfig<A>, init: (tools: RootObservableTools<A>) => Extension) => Extension & RootObservable<A>;
|
|
37
|
+
//# sourceMappingURL=create-root-observable.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-root-observable.d.mts","sourceRoot":"","sources":["../../../src/core/class/create-root-observable.mts"],"names":[],"mappings":"AAIA,OAAO,EAAO,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD;;;GAGG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI,QAAQ,CAAC;IAC5C,sEAAsE;IACtE,WAAW,EAAE,CAAC,SAAS,EAAE,CAAC,KAAK,IAAI,CAAC;IAEpC,WAAW,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE/B,WAAW,EAAE,MAAM,OAAO,CAAC;IAE3B,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,IAAI,CAAC;IAErB;;;;;;OAMG;IACH,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CAC5C,CAAC,CAAC;AAEH,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAAI,QAAQ,CAAC;IAC7C,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;CAC3B,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,GAC/B,CAAC,EAGD,SAAS,SAAS,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,CAChE,KAAK,EACL,KAAK,CACN,oBAEiB,oBAAoB,CAAC,CAAC,CAAC,QACnC,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,SAAS,KACjD,SAAS,GAAG,cAAc,CAAC,CAAC,CAIV,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
import { Arr } from 'ts-data-forge';
|
|
6
|
+
import { RootObservableClass } from './root-observable-class.mjs';
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
export const createRootObservable = ({ initialValue }, init) =>
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
new CustomRootObservableClass(initialValue, init);
|
|
20
|
+
|
|
21
|
+
class CustomRootObservableClass extends RootObservableClass {
|
|
22
|
+
#mut_teardowns;
|
|
23
|
+
constructor(initialValue, init) {
|
|
24
|
+
super({ initialValue });
|
|
25
|
+
this.#mut_teardowns = undefined;
|
|
26
|
+
const extension = init({
|
|
27
|
+
startUpdate: (nextValue) => {
|
|
28
|
+
this.startUpdate(nextValue);
|
|
29
|
+
},
|
|
30
|
+
getSnapshot: () => this.getSnapshot(),
|
|
31
|
+
isCompleted: () => this.isCompleted,
|
|
32
|
+
complete: () => {
|
|
33
|
+
this.complete();
|
|
34
|
+
},
|
|
35
|
+
onComplete: (teardown) => {
|
|
36
|
+
if (this.isCompleted) {
|
|
37
|
+
teardown();
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
this.#mut_teardowns = Arr.toPushed(this.#mut_teardowns ?? [], teardown);
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
Object.assign(this, extension);
|
|
45
|
+
}
|
|
46
|
+
teardown() {
|
|
47
|
+
for (const teardown of this.#mut_teardowns ?? []) {
|
|
48
|
+
teardown();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=create-root-observable.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-root-observable.mjs","sourceRoot":"","sources":["../../../src/core/class/create-root-observable.mts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,gDAAgD;AAChD,0DAA0D;AAC1D,kEAAkE;AAClE,OAAO,EAAE,GAAG,EAAiB,MAAM,eAAe,CAAC;AAGnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AA+BlE;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CASlC,EAAE,YAAY,EAA2B,EACzC,IAAkD,EACnB,EAAE;AACjC,8DAA8D;AAC9D,4DAA4D;AAC5D,IAAI,yBAAyB,CAAC,YAAY,EAAE,IAAI,CAC7B,CAAC;AAEtB,oBAAoB;AAEpB,MAAM,yBAA6B,SAAQ,mBAAsB;IAC/D,cAAc,CAAsC;IAEpD,YACE,YAAyB,EACzB,IAAwE;QAExE,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;QAExB,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAEhC,MAAM,SAAS,GAAG,IAAI,CAAC;YACrB,WAAW,EAAE,CAAC,SAAS,EAAE,EAAE;gBACzB,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YAC9B,CAAC;YACD,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE;YACrC,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW;YACnC,QAAQ,EAAE,GAAG,EAAE;gBACb,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,CAAC;YACD,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE;gBACvB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;oBACrB,QAAQ,EAAE,CAAC;gBACb,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,QAAQ,CAChC,IAAI,CAAC,cAAc,IAAI,EAAE,EACzB,QAAQ,CACT,CAAC;gBACJ,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACjC,CAAC;IAEkB,QAAQ;QACzB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,cAAc,IAAI,EAAE,EAAE,CAAC;YACjD,QAAQ,EAAE,CAAC;QACb,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './child-observable-class.mjs';
|
|
2
|
+
export * from './create-child-observable.mjs';
|
|
3
|
+
export * from './create-root-observable.mjs';
|
|
4
|
+
export * from './manager-observable-class.mjs';
|
|
5
|
+
export * from './observable-base-class.mjs';
|
|
6
|
+
export * from './observable-node.mjs';
|
|
7
|
+
export * from './propagation-state.mjs';
|
|
8
|
+
export * from './root-observable-class.mjs';
|
|
9
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/core/class/index.mts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './child-observable-class.mjs';
|
|
2
|
+
export * from './create-child-observable.mjs';
|
|
3
|
+
export * from './create-root-observable.mjs';
|
|
4
|
+
export * from './manager-observable-class.mjs';
|
|
5
|
+
export * from './observable-base-class.mjs';
|
|
6
|
+
export * from './observable-node.mjs';
|
|
7
|
+
export * from './propagation-state.mjs';
|
|
8
|
+
export * from './root-observable-class.mjs';
|
|
9
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../src/core/class/index.mts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Optional } from 'ts-data-forge';
|
|
2
|
+
import type { ManagerObservableKind } from '../types/index.mjs';
|
|
3
|
+
import { ObservableBaseClass } from './observable-base-class.mjs';
|
|
4
|
+
import type { ChildNode, ManagerNode } from './observable-node.mjs';
|
|
5
|
+
/**
|
|
6
|
+
* The base of the observables that start updates of their own: a root, and
|
|
7
|
+
* an async child (`debounce`, `switchMap`), which emits later than its
|
|
8
|
+
* parents do. Every descendant registers to the managers it is reached from,
|
|
9
|
+
* and an update reaches them in ascending depth, so that each sees its
|
|
10
|
+
* parents' values of that update (no glitch).
|
|
11
|
+
*/
|
|
12
|
+
export declare class ManagerObservableClass<A, Kind extends ManagerObservableKind, Depth extends number> extends ObservableBaseClass<A, Kind, Depth> {
|
|
13
|
+
#private;
|
|
14
|
+
/** The managers this node's descendants register to: itself. */
|
|
15
|
+
readonly managers: readonly ManagerNode[];
|
|
16
|
+
constructor(config: Readonly<{
|
|
17
|
+
kind: Kind;
|
|
18
|
+
depth: Depth;
|
|
19
|
+
initialValue: Optional<A>;
|
|
20
|
+
}>);
|
|
21
|
+
addDescendant(child: ChildNode): void;
|
|
22
|
+
deleteDescendant(child: ChildNode): void;
|
|
23
|
+
/** Emits `nextValue` and propagates it to the descendants. */
|
|
24
|
+
protected startUpdate(nextValue: A): void;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=manager-observable-class.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager-observable-class.d.mts","sourceRoot":"","sources":["../../../src/core/class/manager-observable-class.mts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,KAAK,EAAE,qBAAqB,EAAe,MAAM,oBAAoB,CAAC;AAE7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpE;;;;;;GAMG;AACH,qBAAa,sBAAsB,CACjC,CAAC,EACD,IAAI,SAAS,qBAAqB,EAClC,KAAK,SAAS,MAAM,CACpB,SAAQ,mBAAmB,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC;;IA4B3C,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAE1C,YACE,MAAM,EAAE,QAAQ,CAAC;QACf,IAAI,EAAE,IAAI,CAAC;QACX,KAAK,EAAE,KAAK,CAAC;QACb,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;KAC3B,CAAC,EAWH;IAmBD,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAyBpC;IAED,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAGvC;IAED,8DAA8D;IAC9D,SAAS,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,GAAG,IAAI,CA0CxC;CACF"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { issueUpdateToken } from '../utils/index.mjs';
|
|
2
|
+
import { ObservableBaseClass } from './observable-base-class.mjs';
|
|
3
|
+
import { beginPropagation, endPropagation } from './propagation-state.mjs';
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
export class ManagerObservableClass extends ObservableBaseClass {
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
#mut_propagationOrder;
|
|
27
|
+
|
|
28
|
+
#mut_isPropagating;
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
#mut_joinedDuringUpdate;
|
|
36
|
+
|
|
37
|
+
managers;
|
|
38
|
+
constructor(config) {
|
|
39
|
+
super(config);
|
|
40
|
+
this.managers = [this];
|
|
41
|
+
this.#mut_propagationOrder = [];
|
|
42
|
+
this.#mut_isPropagating = false;
|
|
43
|
+
this.#mut_joinedDuringUpdate = undefined;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
#propagate(updateToken) {
|
|
50
|
+
for (const bucket of this.#mut_propagationOrder) {
|
|
51
|
+
if (bucket !== undefined) {
|
|
52
|
+
for (const c of bucket) {
|
|
53
|
+
|
|
54
|
+
if (this.#mut_joinedDuringUpdate?.has(c) !== true) {
|
|
55
|
+
c.tryUpdate(updateToken);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
addDescendant(child) {
|
|
62
|
+
const descendants = this.#mut_propagationOrder;
|
|
63
|
+
const index = child.depth - this.depth - 1;
|
|
64
|
+
const mut_bucket = descendants[index];
|
|
65
|
+
if (mut_bucket === undefined) {
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
this.#mut_propagationOrder = Array.from({ length: Math.max(descendants.length, index + 1) }, (_, i) => (i === index ? new Set([child]) : descendants[i]));
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
mut_bucket.add(child);
|
|
72
|
+
}
|
|
73
|
+
if (!this.#mut_isPropagating) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
this.#mut_joinedDuringUpdate ??= new Set();
|
|
77
|
+
this.#mut_joinedDuringUpdate.add(child);
|
|
78
|
+
}
|
|
79
|
+
deleteDescendant(child) {
|
|
80
|
+
|
|
81
|
+
this.#mut_propagationOrder[child.depth - this.depth - 1]?.delete(child);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
startUpdate(nextValue) {
|
|
85
|
+
const updateToken = issueUpdateToken();
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
const wasPropagating = this.#mut_isPropagating;
|
|
89
|
+
const joinedBefore = this.#mut_joinedDuringUpdate;
|
|
90
|
+
this.#mut_isPropagating = true;
|
|
91
|
+
this.#mut_joinedDuringUpdate = undefined;
|
|
92
|
+
beginPropagation(updateToken);
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
try {
|
|
98
|
+
this.setNext(nextValue, updateToken);
|
|
99
|
+
this.#propagate(updateToken);
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
|
|
103
|
+
const joinedNow = this.#mut_joinedDuringUpdate;
|
|
104
|
+
this.#mut_isPropagating = wasPropagating;
|
|
105
|
+
this.#mut_joinedDuringUpdate = joinedBefore;
|
|
106
|
+
if (wasPropagating && joinedNow !== undefined) {
|
|
107
|
+
this.#mut_joinedDuringUpdate ??= new Set();
|
|
108
|
+
for (const c of joinedNow) {
|
|
109
|
+
this.#mut_joinedDuringUpdate.add(c);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
endPropagation();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=manager-observable-class.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager-observable-class.mjs","sourceRoot":"","sources":["../../../src/core/class/manager-observable-class.mts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Optional } from 'ts-data-forge';
|
|
2
|
+
import type { DropInitialValueOperator, InitializedObservable, KeepInitialValueOperator, Observable, ObservableBase, ObservableKind, Subscription, UpdateToken, WithInitialValueOperator } from '../types/index.mjs';
|
|
3
|
+
import { observableBrand } from '../utils/index.mjs';
|
|
4
|
+
import type { ChildNode } from './observable-node.mjs';
|
|
5
|
+
/**
|
|
6
|
+
* The base of every observable, and the reason an observable is a class.
|
|
7
|
+
*
|
|
8
|
+
* A node is created for every derived value of a UI, so creating one has to
|
|
9
|
+
* be cheap, and most of its cost was its methods: each observable used to be
|
|
10
|
+
* a set of closures made for it, a dozen or more per node (#2421). Sharing
|
|
11
|
+
* the methods among all nodes removes that cost, and a shared method has to
|
|
12
|
+
* read the node it is called on from `this`. Once `this` is unavoidable, a
|
|
13
|
+
* class is the plainest way to say it: the methods live once on the
|
|
14
|
+
* prototype, `this` is typed, a creator or operator is a subclass that
|
|
15
|
+
* overrides `tryUpdate` (and `flush` / `teardown` where it holds something),
|
|
16
|
+
* and assigning every field in the constructor gives the nodes of one class
|
|
17
|
+
* one shape for V8. The collections (`children`, subscribers) are made when
|
|
18
|
+
* the first one arrives.
|
|
19
|
+
*
|
|
20
|
+
* The methods read the observable they are called on, so taking one off it
|
|
21
|
+
* (`const { subscribe } = obs$`) is not supported.
|
|
22
|
+
*
|
|
23
|
+
* A node reaches another node only through its methods and its public
|
|
24
|
+
* fields, never through a `#private` one: the other node may be an instance
|
|
25
|
+
* of another copy of synstate in the same program, whose classes are not
|
|
26
|
+
* these.
|
|
27
|
+
*/
|
|
28
|
+
export declare class ObservableBaseClass<A, Kind extends ObservableKind, Depth extends number> implements ObservableBase<A> {
|
|
29
|
+
#private;
|
|
30
|
+
readonly kind: Kind;
|
|
31
|
+
readonly depth: Depth;
|
|
32
|
+
readonly [observableBrand]: true;
|
|
33
|
+
constructor({ kind, depth, initialValue, }: Readonly<{
|
|
34
|
+
kind: Kind;
|
|
35
|
+
depth: Depth;
|
|
36
|
+
initialValue: Optional<A>;
|
|
37
|
+
}>);
|
|
38
|
+
getSnapshot(): Optional<A>;
|
|
39
|
+
get isCompleted(): boolean;
|
|
40
|
+
get updateToken(): UpdateToken;
|
|
41
|
+
get hasSubscriber(): boolean;
|
|
42
|
+
get hasChild(): boolean;
|
|
43
|
+
hasActiveChild(): boolean;
|
|
44
|
+
addChild(child: ChildNode): void;
|
|
45
|
+
deleteChild(child: ChildNode): void;
|
|
46
|
+
/** Stores `nextValue` as the current value and notifies subscribers. */
|
|
47
|
+
protected setNext(nextValue: A, updateToken: UpdateToken): void;
|
|
48
|
+
/**
|
|
49
|
+
* Called with the token of every update that reaches this observable; a
|
|
50
|
+
* parent that did not emit in that update has a different `updateToken`.
|
|
51
|
+
* Every observable that can receive a parent update overrides it, and an
|
|
52
|
+
* observable with no parents never gets one, so reaching this is the
|
|
53
|
+
* invariant breaking (Sumi D-48).
|
|
54
|
+
*/
|
|
55
|
+
tryUpdate(_updateToken: UpdateToken): void;
|
|
56
|
+
/**
|
|
57
|
+
* Called by a parent that has completed. A root has no parents, and a child
|
|
58
|
+
* completing never completes it (#2133), so only its own `complete()` ends
|
|
59
|
+
* it.
|
|
60
|
+
*/
|
|
61
|
+
tryComplete(): void;
|
|
62
|
+
/**
|
|
63
|
+
* Completes the observable: an async child first passes on what it still
|
|
64
|
+
* holds (`flush`), then it is disposed. Completing never reaches the
|
|
65
|
+
* parents: an upstream observable may be shared, and only whoever owns it
|
|
66
|
+
* decides when it ends (#2133).
|
|
67
|
+
*/
|
|
68
|
+
complete(): void;
|
|
69
|
+
/**
|
|
70
|
+
* Completes the observable without passing on anything it still holds,
|
|
71
|
+
* runs its teardown, and takes it out of the graph.
|
|
72
|
+
*/
|
|
73
|
+
dispose(): void;
|
|
74
|
+
/**
|
|
75
|
+
* Passes on what the observable still holds, at the beginning of
|
|
76
|
+
* `complete()` and never in `dispose()` (`debounce`'s pending value).
|
|
77
|
+
*/
|
|
78
|
+
protected flush(): void;
|
|
79
|
+
/**
|
|
80
|
+
* Releases what the observable holds (timers, subscriptions, inner
|
|
81
|
+
* observables), once, when it completes or is disposed, before its
|
|
82
|
+
* subscribers hear of it.
|
|
83
|
+
*/
|
|
84
|
+
protected teardown(): void;
|
|
85
|
+
/** Takes a completed child out of its parents' and managers' lists. */
|
|
86
|
+
protected detach(): void;
|
|
87
|
+
/**
|
|
88
|
+
* Joins the scope whose `run` is executing (`createScope`), if any. A node
|
|
89
|
+
* that completed while it was built (`just`, a child of completed parents)
|
|
90
|
+
* has nothing left to release.
|
|
91
|
+
*/
|
|
92
|
+
protected adoptIntoCurrentScope(): void;
|
|
93
|
+
pipe<B>(operator: WithInitialValueOperator<A, B>): InitializedObservable<B>;
|
|
94
|
+
pipe<B>(operator: DropInitialValueOperator<A, B> | KeepInitialValueOperator<A, B>): Observable<B>;
|
|
95
|
+
subscribe(onNext: (v: A) => void, onComplete?: () => void): Subscription;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=observable-base-class.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observable-base-class.d.mts","sourceRoot":"","sources":["../../../src/core/class/observable-base-class.mts"],"names":[],"mappings":"AAOA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,OAAO,KAAK,EACV,wBAAwB,EACxB,qBAAqB,EACrB,wBAAwB,EACxB,UAAU,EACV,cAAc,EACd,cAAc,EAGd,YAAY,EACZ,WAAW,EACX,wBAAwB,EACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAGL,eAAe,EAGhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,mBAAmB,CAC9B,CAAC,EACD,IAAI,SAAS,cAAc,EAC3B,KAAK,SAAS,MAAM,CACpB,YAAW,cAAc,CAAC,CAAC,CAAC;;IAO5B,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,SAAiB,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC;IAEzC,YAAY,EACV,IAAI,EACJ,KAAK,EACL,YAAY,GACb,EAAE,QAAQ,CAAC;QACV,IAAI,EAAE,IAAI,CAAC;QACX,KAAK,EAAE,KAAK,CAAC;QACb,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;KAC3B,CAAC,EAkBD;IAED,WAAW,IAAI,QAAQ,CAAC,CAAC,CAAC,CAEzB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,WAAW,IAAI,WAAW,CAE7B;IAED,IAAI,aAAa,IAAI,OAAO,CAI3B;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,cAAc,IAAI,OAAO,CAUxB;IAED,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAQ/B;IAED,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAElC;IAED,wEAAwE;IACxE,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI,CAU9D;IAED;;;;;;OAMG;IAEH,SAAS,CAAC,YAAY,EAAE,WAAW,GAAG,IAAI,CAEzC;IAED;;;;OAIG;IAEH,WAAW,IAAI,IAAI,CAAG;IAEtB;;;;;OAKG;IACH,QAAQ,IAAI,IAAI,CAQf;IAED;;;OAGG;IACH,OAAO,IAAI,IAAI,CAkCd;IAED;;;OAGG;IAEH,SAAS,CAAC,KAAK,IAAI,IAAI,CAAG;IAE1B;;;;OAIG;IAEH,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAG;IAE7B,uEAAuE;IAEvE,SAAS,CAAC,MAAM,IAAI,IAAI,CAAG;IAE3B;;;;OAIG;IACH,SAAS,CAAC,qBAAqB,IAAI,IAAI,CAUtC;IAKD,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAE5E,IAAI,CAAC,CAAC,EACJ,QAAQ,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,GACxE,UAAU,CAAC,CAAC,CAAC,CAAC;IAUjB,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,IAAI,GAAG,YAAY,CAuBvE;CACF"}
|