synstate 3.2.0 → 3.3.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 +1 -1
- package/dist/core/base/create-child-observable.d.mts.map +1 -1
- package/dist/core/base/create-child-observable.mjs +84 -6
- package/dist/core/base/create-child-observable.mjs.map +1 -1
- package/dist/core/base/create-observable-base.d.mts +24 -5
- package/dist/core/base/create-observable-base.d.mts.map +1 -1
- package/dist/core/base/create-observable-base.mjs +72 -13
- package/dist/core/base/create-observable-base.mjs.map +1 -1
- package/dist/core/base/create-root-observable.d.mts.map +1 -1
- package/dist/core/base/create-root-observable.mjs +9 -2
- package/dist/core/base/create-root-observable.mjs.map +1 -1
- package/dist/core/types/observable.d.mts +19 -0
- package/dist/core/types/observable.d.mts.map +1 -1
- package/dist/core/types/observable.mjs.map +1 -1
- package/package.json +10 -10
- package/src/core/base/create-child-observable.mts +112 -6
- package/src/core/base/create-observable-base.mts +116 -30
- package/src/core/base/create-root-observable.mts +11 -2
- package/src/core/types/observable.mts +21 -0
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
- 🎯 **Simple State Management**: Easy-to-use `createState` and `createReducer` similar to React useState/useReducer for global state
|
|
25
25
|
- ⚡ **High Performance**: Optimized for fast state updates and minimal re-renders
|
|
26
26
|
- 🎨 **Type-Safe**: Full TypeScript support with precise type inference
|
|
27
|
-
- 🚀 **Lightweight**: <!-- bundle-size:synstate -->~
|
|
27
|
+
- 🚀 **Lightweight**: <!-- bundle-size:synstate -->~5 kB min+gzip<!-- /bundle-size:synstate --> with two external runtime dependencies ([ts-data-forge](https://www.npmjs.com/package/ts-data-forge) and [ts-std-forge](https://www.npmjs.com/package/ts-std-forge), and the first depends on the second)
|
|
28
28
|
- 🌐 **Framework Agnostic**: Works with React, Vue, Svelte, or vanilla JavaScript
|
|
29
29
|
- 🔄 **Reactive Updates**: Automatic propagation of state changes to all subscribers
|
|
30
30
|
- 📡 **Event System**: Built-in `createValueEmitter`, `createEventEmitter` for event-driven architecture
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-child-observable.d.mts","sourceRoot":"","sources":["../../../src/core/base/create-child-observable.mts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,QAAQ,EAAE,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AAG9D,OAAO,EAGL,KAAK,oBAAoB,EAEzB,KAAK,8BAA8B,EACnC,KAAK,mBAAmB,EAGxB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,IAAI,EACV,MAAM,oBAAoB,CAAC;AAQ5B;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,CAAC,CAAC,IAAI,QAAQ,CAAC;IACjD,sEAAsE;IACtE,OAAO,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,KAAK,IAAI,CAAC;IAE1D,WAAW,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE/B,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,MAAM,yBAAyB,CAAC,CAAC,IAAI,QAAQ,CAAC;IAClD,sEAAsE;IACtE,WAAW,EAAE,CAAC,SAAS,EAAE,CAAC,KAAK,IAAI,CAAC;CACrC,CAAC,GACA,wBAAwB,CAAC,CAAC,CAAC,CAAC;AAE9B,KAAK,yBAAyB,CAAC,CAAC,SAAS,mBAAmB,IAAI,QAAQ,CAAC;IACvE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAEjB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,CAAC,CAAC;AAEH,MAAM,MAAM,qBAAqB,CAC/B,CAAC,EACD,CAAC,SAAS,mBAAmB,IAC3B,yBAAyB,CAAC,CAAC,CAAC,GAC9B,QAAQ,CAAC;IACP,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;CAC3B,CAAC,CAAC;AAEL,MAAM,MAAM,gCAAgC,CAC1C,CAAC,EACD,CAAC,SAAS,mBAAmB,IAC3B,yBAAyB,CAAC,CAAC,CAAC,GAC9B,QAAQ,CAAC;IACP,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;CACvB,CAAC,CAAC;AAEL;;;;;;;;;GASG;AACH,eAAO,MAAM,yBAAyB,GAAI,CAAC,EAAE,CAAC,SAAS,mBAAmB,iDAMrE,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,mBACb,CACf,KAAK,EAAE,wBAAwB,CAAC,CAAC,CAAC,KAC/B,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,KACtC,mBAAmB,CAAC,CAAC,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"create-child-observable.d.mts","sourceRoot":"","sources":["../../../src/core/base/create-child-observable.mts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,QAAQ,EAAE,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AAG9D,OAAO,EAGL,KAAK,oBAAoB,EAEzB,KAAK,8BAA8B,EACnC,KAAK,mBAAmB,EAGxB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,IAAI,EACV,MAAM,oBAAoB,CAAC;AAQ5B;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,CAAC,CAAC,IAAI,QAAQ,CAAC;IACjD,sEAAsE;IACtE,OAAO,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,KAAK,IAAI,CAAC;IAE1D,WAAW,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE/B,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,MAAM,yBAAyB,CAAC,CAAC,IAAI,QAAQ,CAAC;IAClD,sEAAsE;IACtE,WAAW,EAAE,CAAC,SAAS,EAAE,CAAC,KAAK,IAAI,CAAC;CACrC,CAAC,GACA,wBAAwB,CAAC,CAAC,CAAC,CAAC;AAE9B,KAAK,yBAAyB,CAAC,CAAC,SAAS,mBAAmB,IAAI,QAAQ,CAAC;IACvE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAEjB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,CAAC,CAAC;AAEH,MAAM,MAAM,qBAAqB,CAC/B,CAAC,EACD,CAAC,SAAS,mBAAmB,IAC3B,yBAAyB,CAAC,CAAC,CAAC,GAC9B,QAAQ,CAAC;IACP,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;CAC3B,CAAC,CAAC;AAEL,MAAM,MAAM,gCAAgC,CAC1C,CAAC,EACD,CAAC,SAAS,mBAAmB,IAC3B,yBAAyB,CAAC,CAAC,CAAC,GAC9B,QAAQ,CAAC;IACP,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;CACvB,CAAC,CAAC;AAEL;;;;;;;;;GASG;AACH,eAAO,MAAM,yBAAyB,GAAI,CAAC,EAAE,CAAC,SAAS,mBAAmB,iDAMrE,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,mBACb,CACf,KAAK,EAAE,wBAAwB,CAAC,CAAC,CAAC,KAC/B,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,KACtC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CA4E1B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,oCAAoC,GAC/C,CAAC,EACD,CAAC,SAAS,mBAAmB,UAErB,gCAAgC,CAAC,CAAC,EAAE,CAAC,CAAC,mBAC7B,CACf,KAAK,EAAE,wBAAwB,CAAC,CAAC,CAAC,KAC/B,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,KACtC,8BAA8B,CAAC,CAAC,EAAE,CAAC,CASrC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,GAAI,CAAC,EAAE,CAAC,SAAS,mBAAmB,iDAMtE,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,mBACb,CACf,KAAK,EAAE,yBAAyB,CAAC,CAAC,CAAC,KAChC,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,KACtC,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAgF3B,CAAC"}
|
|
@@ -15,18 +15,40 @@ import { assembleObservable, createManagerObservableParts, createObservableBaseH
|
|
|
15
15
|
|
|
16
16
|
export const createSyncChildObservable = ({ parents, depth = 1 + maxDepth(parents), initialValue, onComplete, }, createTryUpdate) => {
|
|
17
17
|
const handle = createObservableBaseHandle(initialValue);
|
|
18
|
-
|
|
18
|
+
|
|
19
|
+
let mut_self = undefined;
|
|
20
|
+
const autoComplete = onComplete !== undefined || parents.some((p) => p.autoComplete);
|
|
21
|
+
const dispose = () => {
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
if (handle.isCompleted()) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
19
28
|
onComplete?.();
|
|
20
29
|
handle.completeBase();
|
|
30
|
+
if (mut_self !== undefined) {
|
|
31
|
+
unregisterChild(mut_self, parents);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const complete = () => {
|
|
35
|
+
if (handle.isCompleted()) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
dispose();
|
|
21
39
|
|
|
22
40
|
for (const par of parents) {
|
|
23
41
|
par.tryComplete();
|
|
24
42
|
}
|
|
25
43
|
};
|
|
26
44
|
const tryComplete = () => {
|
|
45
|
+
if (handle.isCompleted()) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
27
48
|
tryCompleteChild({
|
|
28
49
|
hasSubscriber: handle.hasSubscriber(),
|
|
29
50
|
hasActiveChild: handle.hasActiveChild(),
|
|
51
|
+
autoComplete,
|
|
30
52
|
parents,
|
|
31
53
|
complete,
|
|
32
54
|
});
|
|
@@ -43,9 +65,12 @@ export const createSyncChildObservable = ({ parents, depth = 1 + maxDepth(parent
|
|
|
43
65
|
tryUpdate,
|
|
44
66
|
tryComplete,
|
|
45
67
|
complete,
|
|
68
|
+
dispose,
|
|
69
|
+
autoComplete,
|
|
46
70
|
extra: { parents },
|
|
47
71
|
});
|
|
48
72
|
registerChild(observable, parents);
|
|
73
|
+
mut_self = observable;
|
|
49
74
|
return observable;
|
|
50
75
|
};
|
|
51
76
|
|
|
@@ -70,19 +95,41 @@ export const createInitializedSyncChildObservable = (config, createTryUpdate) =>
|
|
|
70
95
|
|
|
71
96
|
export const createAsyncChildObservable = ({ parents, depth = 1 + maxDepth(parents), initialValue, onComplete, }, createTryUpdate) => {
|
|
72
97
|
const handle = createObservableBaseHandle(initialValue);
|
|
73
|
-
const { addDescendant, startUpdate } = createManagerObservableParts(handle);
|
|
74
|
-
|
|
98
|
+
const { addDescendant, deleteDescendant, startUpdate } = createManagerObservableParts(handle);
|
|
99
|
+
|
|
100
|
+
let mut_self = undefined;
|
|
101
|
+
const autoComplete = onComplete !== undefined || parents.some((p) => p.autoComplete);
|
|
102
|
+
const dispose = () => {
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
if (handle.isCompleted()) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
75
109
|
onComplete?.();
|
|
76
110
|
handle.completeBase();
|
|
111
|
+
if (mut_self !== undefined) {
|
|
112
|
+
unregisterChild(mut_self, parents);
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
const complete = () => {
|
|
116
|
+
if (handle.isCompleted()) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
dispose();
|
|
77
120
|
|
|
78
121
|
for (const par of parents) {
|
|
79
122
|
par.tryComplete();
|
|
80
123
|
}
|
|
81
124
|
};
|
|
82
125
|
const tryComplete = () => {
|
|
126
|
+
if (handle.isCompleted()) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
83
129
|
tryCompleteChild({
|
|
84
130
|
hasSubscriber: handle.hasSubscriber(),
|
|
85
131
|
hasActiveChild: handle.hasActiveChild(),
|
|
132
|
+
autoComplete,
|
|
86
133
|
parents,
|
|
87
134
|
complete,
|
|
88
135
|
});
|
|
@@ -100,9 +147,12 @@ export const createAsyncChildObservable = ({ parents, depth = 1 + maxDepth(paren
|
|
|
100
147
|
tryUpdate,
|
|
101
148
|
tryComplete,
|
|
102
149
|
complete,
|
|
103
|
-
|
|
150
|
+
dispose,
|
|
151
|
+
autoComplete,
|
|
152
|
+
extra: { parents, addDescendant, deleteDescendant },
|
|
104
153
|
});
|
|
105
154
|
registerChild(observable, parents);
|
|
155
|
+
mut_self = observable;
|
|
106
156
|
return observable;
|
|
107
157
|
};
|
|
108
158
|
|
|
@@ -171,14 +221,42 @@ const registerChild = (child, parents) => {
|
|
|
171
221
|
}
|
|
172
222
|
}
|
|
173
223
|
};
|
|
174
|
-
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
const unregisterChild = (child, parents) => {
|
|
235
|
+
for (const p of parents) {
|
|
236
|
+
p.deleteChild(child);
|
|
237
|
+
}
|
|
238
|
+
const mut_rest = Array.from(parents);
|
|
239
|
+
while (Arr.isNonEmpty(mut_rest)) {
|
|
240
|
+
const p = mut_rest.pop();
|
|
241
|
+
if (p === undefined) {
|
|
242
|
+
break;
|
|
243
|
+
}
|
|
244
|
+
if (isManagerObservable(p)) {
|
|
245
|
+
p.deleteDescendant(child);
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
mut_rest.push(...p.parents);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
const tryCompleteChild = ({ hasSubscriber, hasActiveChild, autoComplete, parents, complete, }) => {
|
|
175
253
|
|
|
176
254
|
if (parents.every((r) => r.isCompleted)) {
|
|
177
255
|
complete();
|
|
178
256
|
return;
|
|
179
257
|
}
|
|
180
258
|
|
|
181
|
-
if (!hasSubscriber && !hasActiveChild) {
|
|
259
|
+
if (autoComplete && !hasSubscriber && !hasActiveChild) {
|
|
182
260
|
complete();
|
|
183
261
|
}
|
|
184
262
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-child-observable.mjs","sourceRoot":"","sources":["../../../src/core/base/create-child-observable.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAA4B,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAErC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,GAUpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EACL,kBAAkB,EAClB,4BAA4B,EAC5B,0BAA0B,GAC3B,MAAM,8BAA8B,CAAC;AAwDtC;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,EACE,OAAO,EACP,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,EAC7B,YAAY,EACZ,UAAU,GACkB,EAC9B,eAEuC,EACZ,EAAE;IAC7B,MAAM,MAAM,GAAG,0BAA0B,CAAI,YAAY,CAAC,CAAC;IAE3D,
|
|
1
|
+
{"version":3,"file":"create-child-observable.mjs","sourceRoot":"","sources":["../../../src/core/base/create-child-observable.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAA4B,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAErC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,GAUpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EACL,kBAAkB,EAClB,4BAA4B,EAC5B,0BAA0B,GAC3B,MAAM,8BAA8B,CAAC;AAwDtC;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,EACE,OAAO,EACP,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,EAC7B,YAAY,EACZ,UAAU,GACkB,EAC9B,eAEuC,EACZ,EAAE;IAC7B,MAAM,MAAM,GAAG,0BAA0B,CAAI,YAAY,CAAC,CAAC;IAE3D,uDAAuD;IACvD,IAAI,QAAQ,GAAmC,SAAS,CAAC;IAEzD,MAAM,YAAY,GAChB,UAAU,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAElE,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,wEAAwE;QACxE,sEAAsE;QACtE,uDAAuD;QACvD,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAED,UAAU,EAAE,EAAE,CAAC;QAEf,MAAM,CAAC,YAAY,EAAE,CAAC;QAEtB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC1B,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAED,OAAO,EAAE,CAAC;QAEV,uBAAuB;QACvB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,GAAG,CAAC,WAAW,EAAE,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,GAAS,EAAE;QAC7B,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAED,gBAAgB,CAAC;YACf,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE;YACrC,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE;YACvC,YAAY;YACZ,OAAO;YACP,QAAQ;SACT,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,eAAe,CAAC;QAChC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,QAAQ;KACT,CAAC,CAAC;IAEH,MAAM,UAAU,GAA8B,kBAAkB,CAAC;QAC/D,IAAI,EAAE,YAAY;QAClB,KAAK;QACL,MAAM;QACN,SAAS;QACT,WAAW;QACX,QAAQ;QACR,OAAO;QACP,YAAY;QACZ,KAAK,EAAE,EAAE,OAAO,EAAE;KACnB,CAAC,CAAC;IAEH,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAEnC,QAAQ,GAAG,UAAU,CAAC;IAEtB,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAIlD,MAA8C,EAC9C,eAEuC,EACD,EAAE;IACxC,MAAM,UAAU,GAAG,yBAAyB,CAAO,MAAM,EAAE,eAAe,CAAC,CAAC;IAE5E,OAAO;IACL,2EAA2E;IAC3E,uCAAuC;IACvC,4DAA4D;IAC5D,UAAkD,CACnD,CAAC;AACJ,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,EACE,OAAO,EACP,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,EAC7B,YAAY,EACZ,UAAU,GACkB,EAC9B,eAEuC,EACX,EAAE;IAC9B,MAAM,MAAM,GAAG,0BAA0B,CAAI,YAAY,CAAC,CAAC;IAE3D,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,GACpD,4BAA4B,CAAC,MAAM,CAAC,CAAC;IAEvC,uDAAuD;IACvD,IAAI,QAAQ,GAAmC,SAAS,CAAC;IAEzD,MAAM,YAAY,GAChB,UAAU,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAElE,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,wEAAwE;QACxE,sEAAsE;QACtE,uDAAuD;QACvD,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAED,UAAU,EAAE,EAAE,CAAC;QAEf,MAAM,CAAC,YAAY,EAAE,CAAC;QAEtB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC1B,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAED,OAAO,EAAE,CAAC;QAEV,uBAAuB;QACvB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,GAAG,CAAC,WAAW,EAAE,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,GAAS,EAAE;QAC7B,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAED,gBAAgB,CAAC;YACf,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE;YACrC,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE;YACvC,YAAY;YACZ,OAAO;YACP,QAAQ;SACT,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,eAAe,CAAC;QAChC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,QAAQ;QACR,WAAW;KACZ,CAAC,CAAC;IAEH,MAAM,UAAU,GAA+B,kBAAkB,CAAC;QAChE,IAAI,EAAE,aAAa;QACnB,KAAK;QACL,MAAM;QACN,SAAS;QACT,WAAW;QACX,QAAQ;QACR,OAAO;QACP,YAAY;QACZ,KAAK,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE;KACpD,CAAC,CAAC;IAEH,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAEnC,QAAQ,GAAG,UAAU,CAAC;IAEtB,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAEF,aAAa;AAEb;;;;;GAKG;AACH,MAAM,yBAAyB,GAAG,CAChC,IAAyB,EACzB,WAAqC,EACrC,UAAoC,EAC3B,EAAE;IACX,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEzB,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAExB,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,yBAAyB,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,CAAC;gBAC/D,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAE3B,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAC/B,KAA+B,EAC/B,OAAuC,EACjC,EAAE;IACR,MAAM,WAAW,GAAG,IAAI,GAAG,EAAgB,CAAC;IAE5C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAe,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAErD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,yBAAyB,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,CAAC;YAC/D,+DAA+D;YAC/D,gEAAgE;YAChE,uEAAuE;YACvE,oEAAoE;YACpE,KAAK,CACH,kGAAkG,CACnG,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,aAAa,GAAG,CACpB,KAAyB,EACzB,OAAsC,EAChC,EAAE;IACR,wBAAwB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAEzC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IAED,qDAAqD;IACrD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAErC,OAAO,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;QAEzB,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,MAAM;QACR,CAAC;QAED,IAAI,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,8BAA8B;YAC9B,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,eAAe,GAAG,CACtB,KAAyB,EACzB,OAAsC,EAChC,EAAE;IACR,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAErC,OAAO,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;QAEzB,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,MAAM;QACR,CAAC;QAED,IAAI,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3B,CAAC,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAK,EAC5B,aAAa,EACb,cAAc,EACd,YAAY,EACZ,OAAO,EACP,QAAQ,GAOR,EAAQ,EAAE;IACV,qCAAqC;IACrC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC;QACxC,QAAQ,EAAE,CAAC;QAEX,OAAO;IACT,CAAC;IAED,uEAAuE;IACvE,IAAI,YAAY,IAAI,CAAC,aAAa,IAAI,CAAC,cAAc,EAAE,CAAC;QACtD,QAAQ,EAAE,CAAC;IACb,CAAC;IAED,uBAAuB;IACvB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,GAAG,CAAC,WAAW,EAAE,CAAC;IACpB,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -47,6 +47,11 @@ export type ObservableBaseHandle<A> = Readonly<{
|
|
|
47
47
|
*/
|
|
48
48
|
attach: (writers: ObservableStateWriters) => void;
|
|
49
49
|
addChild: <B>(child: ChildObservable<B>) => void;
|
|
50
|
+
/**
|
|
51
|
+
* Forgets `child`, which a completed child calls on each of its parents so
|
|
52
|
+
* that nothing keeps a reference to it (#2134).
|
|
53
|
+
*/
|
|
54
|
+
deleteChild: <B>(child: ChildObservable<B>) => void;
|
|
50
55
|
getSnapshot: () => Optional<A>;
|
|
51
56
|
isCompleted: () => boolean;
|
|
52
57
|
updateToken: () => UpdateToken;
|
|
@@ -83,15 +88,27 @@ export declare const createObservableBaseHandle: <A>(initialValue: Optional<A>)
|
|
|
83
88
|
*/
|
|
84
89
|
export type ManagerObservableParts<A> = Readonly<{
|
|
85
90
|
addDescendant: <B>(child: ChildObservable<B>) => void;
|
|
91
|
+
/**
|
|
92
|
+
* Takes `child` out of the propagation order, which a completed child calls
|
|
93
|
+
* on every manager it registered to (#2134).
|
|
94
|
+
*/
|
|
95
|
+
deleteDescendant: <B>(child: ChildObservable<B>) => void;
|
|
86
96
|
/** Emits `nextValue` and propagates the update to all descendants. */
|
|
87
97
|
startUpdate: (nextValue: A) => void;
|
|
88
98
|
}>;
|
|
89
99
|
/**
|
|
90
100
|
* Builds the manager half of a root or async-child observable. Both start their
|
|
91
|
-
* own update propagation, so both keep a
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
101
|
+
* own update propagation, so both keep a depth-ordered propagation list; this
|
|
102
|
+
* is the single implementation of it (the class version duplicated it across
|
|
103
|
+
* `RootObservableClass` and `AsyncChildObservableClass`).
|
|
104
|
+
*
|
|
105
|
+
* The descendants are kept in one insertion-ordered set per depth, so adding
|
|
106
|
+
* and removing one is O(1) apart from the first node of a new depth. The flat
|
|
107
|
+
* array `startUpdate` walks is rebuilt only when an update finds it stale: it
|
|
108
|
+
* used to be copied on every `addDescendant`, which made creating n nodes under
|
|
109
|
+
* one root O(n²). Rebuilding at the start of an update also keeps the walk a
|
|
110
|
+
* snapshot, as the copy-on-write array was — a node created or completed while
|
|
111
|
+
* an update is propagating does not change which nodes that update visits.
|
|
95
112
|
*/
|
|
96
113
|
export declare const createManagerObservableParts: <A>(handle: ObservableBaseHandle<A>) => ManagerObservableParts<A>;
|
|
97
114
|
/** Default `tryUpdate` for observables that never receive parent updates. */
|
|
@@ -103,6 +120,8 @@ type AssembleObservableArgs<A, Kind extends ObservableKind, Extra extends Readon
|
|
|
103
120
|
tryUpdate: (updateToken: UpdateToken) => void;
|
|
104
121
|
tryComplete: () => void;
|
|
105
122
|
complete: () => void;
|
|
123
|
+
dispose: () => void;
|
|
124
|
+
autoComplete: boolean;
|
|
106
125
|
/**
|
|
107
126
|
* Kind-specific public members (`parents`, `addDescendant`) and leaf
|
|
108
127
|
* extensions (`next`, `start`). They are merged here, in the one place the
|
|
@@ -120,7 +139,7 @@ type AssembleObservableArgs<A, Kind extends ObservableKind, Extra extends Readon
|
|
|
120
139
|
* behavior (`tryUpdate`, `tryComplete`, `complete`) is passed in already
|
|
121
140
|
* composed.
|
|
122
141
|
*/
|
|
123
|
-
export declare const assembleObservable: <A, Kind extends ObservableKind, Extra extends ReadonlyRecord<string, unknown>>({ kind, depth, handle, tryUpdate, tryComplete, complete, extra, }: AssembleObservableArgs<A, Kind, Extra>) => Extra & ObservableBase<A> & Readonly<{
|
|
142
|
+
export declare const assembleObservable: <A, Kind extends ObservableKind, Extra extends ReadonlyRecord<string, unknown>>({ kind, depth, handle, tryUpdate, tryComplete, complete, dispose, autoComplete, extra, }: AssembleObservableArgs<A, Kind, Extra>) => Extra & ObservableBase<A> & Readonly<{
|
|
124
143
|
kind: Kind;
|
|
125
144
|
depth: AssembleObservableArgs<A, Kind, Extra>['depth'];
|
|
126
145
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-observable-base.d.mts","sourceRoot":"","sources":["../../../src/core/base/create-observable-base.mts"],"names":[],"mappings":"AAAA,OAAO,EAAO,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,KAAK,EAA0B,cAAc,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,KAAK,EACV,eAAe,EAGf,cAAc,EACd,YAAY,EACZ,cAAc,EAId,YAAY,EACZ,WAAW,EAEZ,MAAM,oBAAoB,CAAC;AAS5B;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAAI,QAAQ,CAAC;IAC7C,EAAE,EAAE,YAAY,CAAC;IAEjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,MAAM,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,CAAC;IAElD,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAEjD,WAAW,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE/B,WAAW,EAAE,MAAM,OAAO,CAAC;IAE3B,WAAW,EAAE,MAAM,WAAW,CAAC;IAE/B,aAAa,EAAE,MAAM,OAAO,CAAC;IAE7B,cAAc,EAAE,MAAM,OAAO,CAAC;IAE9B,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,IAAI,KAAK,YAAY,CAAC;IAE7E,wEAAwE;IACxE,OAAO,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,KAAK,IAAI,CAAC;IAE1D;;;;;OAKG;IACH,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,KAAK,sBAAsB,GAAG,QAAQ,CAAC;IACrC,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,cAAc,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7C,gBAAgB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC,CAAC,CAAC;AAEH,eAAO,MAAM,0BAA0B,GAAI,CAAC,gBAC5B,QAAQ,CAAC,CAAC,CAAC,KACxB,oBAAoB,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"create-observable-base.d.mts","sourceRoot":"","sources":["../../../src/core/base/create-observable-base.mts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,9 @@ import { unreachable } from 'ts-std-forge';
|
|
|
3
3
|
import { binarySearch, issueObservableId, issueSubscriberId, issueUpdateToken, toSubscriber, } from '../utils/index.mjs';
|
|
4
4
|
export const createObservableBaseHandle = (initialValue) => {
|
|
5
5
|
const id = issueObservableId();
|
|
6
|
-
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
const mut_children = new Set();
|
|
7
9
|
const mut_subscribers = new Map();
|
|
8
10
|
let mut_currentValue = initialValue;
|
|
9
11
|
let mut_isCompleted = false;
|
|
@@ -20,7 +22,7 @@ export const createObservableBaseHandle = (initialValue) => {
|
|
|
20
22
|
writers.setIsCompleted(mut_isCompleted);
|
|
21
23
|
writers.setUpdateToken(mut_updateToken);
|
|
22
24
|
writers.setHasSubscriber(mut_subscribers.size > 0);
|
|
23
|
-
writers.setHasChild(
|
|
25
|
+
writers.setHasChild(mut_children.size > 0);
|
|
24
26
|
};
|
|
25
27
|
const addSubscriber = (s) => {
|
|
26
28
|
|
|
@@ -34,14 +36,25 @@ export const createObservableBaseHandle = (initialValue) => {
|
|
|
34
36
|
mut_writers?.setHasSubscriber(mut_subscribers.size > 0);
|
|
35
37
|
};
|
|
36
38
|
const addChild = (child) => {
|
|
37
|
-
mut_children
|
|
39
|
+
mut_children.add(child);
|
|
38
40
|
mut_writers?.setHasChild(true);
|
|
39
41
|
};
|
|
42
|
+
const deleteChild = (child) => {
|
|
43
|
+
mut_children.delete(child);
|
|
44
|
+
mut_writers?.setHasChild(mut_children.size > 0);
|
|
45
|
+
};
|
|
40
46
|
const getSnapshot = () => mut_currentValue;
|
|
41
47
|
const isCompleted = () => mut_isCompleted;
|
|
42
48
|
const updateToken = () => mut_updateToken;
|
|
43
49
|
const hasSubscriber = () => mut_subscribers.size > 0;
|
|
44
|
-
const hasActiveChild = () =>
|
|
50
|
+
const hasActiveChild = () => {
|
|
51
|
+
for (const c of mut_children) {
|
|
52
|
+
if (!c.isCompleted) {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return false;
|
|
57
|
+
};
|
|
45
58
|
const setNext = (nextValue, nextUpdateToken) => {
|
|
46
59
|
mut_updateToken = nextUpdateToken;
|
|
47
60
|
mut_writers?.setUpdateToken(nextUpdateToken);
|
|
@@ -65,6 +78,7 @@ export const createObservableBaseHandle = (initialValue) => {
|
|
|
65
78
|
mut_subscribers.clear();
|
|
66
79
|
mut_writers?.setHasSubscriber(false);
|
|
67
80
|
|
|
81
|
+
|
|
68
82
|
for (const o of mut_children) {
|
|
69
83
|
o.tryComplete();
|
|
70
84
|
}
|
|
@@ -92,6 +106,7 @@ export const createObservableBaseHandle = (initialValue) => {
|
|
|
92
106
|
id,
|
|
93
107
|
attach,
|
|
94
108
|
addChild,
|
|
109
|
+
deleteChild,
|
|
95
110
|
getSnapshot,
|
|
96
111
|
isCompleted,
|
|
97
112
|
updateToken,
|
|
@@ -109,25 +124,66 @@ export const createObservableBaseHandle = (initialValue) => {
|
|
|
109
124
|
|
|
110
125
|
|
|
111
126
|
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
|
|
112
134
|
export const createManagerObservableParts = (handle) => {
|
|
135
|
+
const mut_buckets = new Map();
|
|
136
|
+
|
|
137
|
+
let mut_depths = [];
|
|
138
|
+
|
|
113
139
|
let mut_propagationOrder = [];
|
|
114
|
-
const mut_descendantsIdSet = new Set();
|
|
115
140
|
const addDescendant = (child) => {
|
|
116
|
-
|
|
117
|
-
|
|
141
|
+
const mut_bucket = mut_buckets.get(child.depth);
|
|
142
|
+
if (mut_bucket === undefined) {
|
|
143
|
+
mut_buckets.set(child.depth, new Set([child]));
|
|
144
|
+
mut_depths = Arr.toInserted(mut_depths, binarySearch(mut_depths, child.depth), child.depth);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
if (mut_bucket.has(child)) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
mut_bucket.add(child);
|
|
151
|
+
}
|
|
152
|
+
mut_propagationOrder = undefined;
|
|
153
|
+
};
|
|
154
|
+
const deleteDescendant = (child) => {
|
|
155
|
+
|
|
156
|
+
const mut_bucket = mut_buckets.get(child.depth);
|
|
157
|
+
if (mut_bucket?.delete(child) === true) {
|
|
158
|
+
mut_propagationOrder = undefined;
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
const getPropagationOrder = () => {
|
|
162
|
+
if (mut_propagationOrder !== undefined) {
|
|
163
|
+
return mut_propagationOrder;
|
|
164
|
+
}
|
|
165
|
+
const mut_order = [];
|
|
166
|
+
for (const depth of mut_depths) {
|
|
167
|
+
const bucket = mut_buckets.get(depth);
|
|
168
|
+
if (bucket !== undefined) {
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
for (const c of bucket) {
|
|
172
|
+
mut_order.push(c);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
118
175
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
mut_propagationOrder = Arr.toInserted(mut_propagationOrder, insertPos, child);
|
|
176
|
+
mut_propagationOrder = mut_order;
|
|
177
|
+
return mut_order;
|
|
122
178
|
};
|
|
123
179
|
const startUpdate = (nextValue) => {
|
|
124
180
|
const updateToken = issueUpdateToken();
|
|
125
181
|
handle.setNext(nextValue, updateToken);
|
|
126
|
-
for (const p of
|
|
182
|
+
for (const p of getPropagationOrder()) {
|
|
127
183
|
p.tryUpdate(updateToken);
|
|
128
184
|
}
|
|
129
185
|
};
|
|
130
|
-
return { addDescendant, startUpdate };
|
|
186
|
+
return { addDescendant, deleteDescendant, startUpdate };
|
|
131
187
|
};
|
|
132
188
|
|
|
133
189
|
export const createTryUpdateNotImplemented = () => tryUpdateNotImplemented;
|
|
@@ -148,7 +204,7 @@ const tryUpdateNotImplemented = (_updateToken) => {
|
|
|
148
204
|
|
|
149
205
|
|
|
150
206
|
|
|
151
|
-
export const assembleObservable = ({ kind, depth, handle, tryUpdate, tryComplete, complete, extra, }) => {
|
|
207
|
+
export const assembleObservable = ({ kind, depth, handle, tryUpdate, tryComplete, complete, dispose, autoComplete, extra, }) => {
|
|
152
208
|
function pipe(operator) {
|
|
153
209
|
return operator(
|
|
154
210
|
|
|
@@ -165,15 +221,18 @@ export const assembleObservable = ({ kind, depth, handle, tryUpdate, tryComplete
|
|
|
165
221
|
kind,
|
|
166
222
|
depth,
|
|
167
223
|
addChild: handle.addChild,
|
|
224
|
+
deleteChild: handle.deleteChild,
|
|
168
225
|
getSnapshot: handle.getSnapshot,
|
|
169
226
|
isCompleted: false,
|
|
170
227
|
updateToken: handle.updateToken(),
|
|
171
228
|
hasSubscriber: false,
|
|
172
229
|
hasChild: false,
|
|
173
230
|
hasActiveChild: handle.hasActiveChild,
|
|
231
|
+
autoComplete,
|
|
174
232
|
tryUpdate,
|
|
175
233
|
tryComplete,
|
|
176
234
|
complete,
|
|
235
|
+
dispose,
|
|
177
236
|
subscribe: handle.subscribe,
|
|
178
237
|
pipe,
|
|
179
238
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-observable-base.mjs","sourceRoot":"","sources":["../../../src/core/base/create-observable-base.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAgB3C,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,GACb,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"create-observable-base.mjs","sourceRoot":"","sources":["../../../src/core/base/create-observable-base.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAgB3C,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,GACb,MAAM,oBAAoB,CAAC;AA+F5B,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,YAAyB,EACA,EAAE;IAC3B,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAE/B,4EAA4E;IAC5E,yEAAyE;IACzE,MAAM,YAAY,GAAyC,IAAI,GAAG,EAAE,CAAC;IAErE,MAAM,eAAe,GAA4C,IAAI,GAAG,EAAE,CAAC;IAE3E,IAAI,gBAAgB,GAAgB,YAAY,CAAC;IAEjD,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,IAAI,eAAe,GAAgB,gBAAgB,EAAE,CAAC;IAEtD;;;;;OAKG;IACH,IAAI,WAA+C,CAAC;IAEpD,MAAM,MAAM,GAAG,CAAC,OAA+B,EAAQ,EAAE;QACvD,WAAW,GAAG,OAAO,CAAC;QAEtB,OAAO,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QAExC,OAAO,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QAExC,OAAO,CAAC,gBAAgB,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QAEnD,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,CAAgB,EAAgB,EAAE;QACvD,oCAAoC;QACpC,MAAM,YAAY,GAAG,iBAAiB,EAAE,CAAC;QAEzC,eAAe,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QAErC,WAAW,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAEpC,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,CAAC,YAA0B,EAAQ,EAAE;QAC5D,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAErC,WAAW,EAAE,gBAAgB,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAK,KAAyB,EAAQ,EAAE;QACvD,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAExB,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAK,KAAyB,EAAQ,EAAE;QAC1D,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE3B,WAAW,EAAE,WAAW,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,GAAgB,EAAE,CAAC,gBAAgB,CAAC;IAExD,MAAM,WAAW,GAAG,GAAY,EAAE,CAAC,eAAe,CAAC;IAEnD,MAAM,WAAW,GAAG,GAAgB,EAAE,CAAC,eAAe,CAAC;IAEvD,MAAM,aAAa,GAAG,GAAY,EAAE,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,CAAC;IAE9D,MAAM,cAAc,GAAG,GAAY,EAAE;QACnC,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAC7B,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,SAAY,EAAE,eAA4B,EAAQ,EAAE;QACnE,eAAe,GAAG,eAAe,CAAC;QAElC,WAAW,EAAE,cAAc,CAAC,eAAe,CAAC,CAAC;QAE7C,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE5C,KAAK,MAAM,CAAC,IAAI,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,GAAS,EAAE;QAC9B,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,sBAAsB;QAChC,CAAC;QAED,eAAe;QACf,eAAe,GAAG,IAAI,CAAC;QAEvB,WAAW,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;QAElC,wCAAwC;QACxC,KAAK,MAAM,CAAC,IAAI,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,CAAC,CAAC,UAAU,EAAE,CAAC;QACjB,CAAC;QAED,yBAAyB;QACzB,eAAe,CAAC,KAAK,EAAE,CAAC;QAExB,WAAW,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAErC,oEAAoE;QACpE,sEAAsE;QACtE,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAC7B,CAAC,CAAC,WAAW,EAAE,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAChB,MAAsB,EACtB,UAAuB,EACT,EAAE;QAChB,aAAa;QACb,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAE3B,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAED,IAAI,eAAe,EAAE,CAAC;YACpB,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,UAAU,EAAE,CAAC;YACf,CAAC;YAED,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;QACnC,CAAC;QAED,MAAM,YAAY,GAAiB,aAAa,CAC9C,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,CACjC,CAAC;QAEF,OAAO;YACL,WAAW,EAAE,GAAG,EAAE;gBAChB,gBAAgB,CAAC,YAAY,CAAC,CAAC;YACjC,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO;QACL,EAAE;QACF,MAAM;QACN,QAAQ;QACR,WAAW;QACX,WAAW;QACX,WAAW;QACX,WAAW;QACX,aAAa;QACb,cAAc;QACd,SAAS;QACT,OAAO;QACP,YAAY;KACb,CAAC;AACJ,CAAC,CAAC;AAmBF;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,MAA+B,EACJ,EAAE;IAC7B,MAAM,WAAW,GAGb,IAAI,GAAG,EAAE,CAAC;IAEd,4CAA4C;IAC5C,IAAI,UAAU,GAAsB,EAAE,CAAC;IAEvC,+BAA+B;IAC/B,IAAI,oBAAoB,GACtB,EAAE,CAAC;IAEL,MAAM,aAAa,GAAG,CAAK,KAAyB,EAAQ,EAAE;QAC5D,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEhD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,GAAG,CAA2B,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAEzE,UAAU,GAAG,GAAG,CAAC,UAAU,CACzB,UAAU,EACV,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,EACrC,KAAK,CAAC,KAAK,CACZ,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO;YACT,CAAC;YAED,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;QAED,oBAAoB,GAAG,SAAS,CAAC;IACnC,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,CAAK,KAAyB,EAAQ,EAAE;QAC/D,oEAAoE;QACpE,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEhD,IAAI,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;YACvC,oBAAoB,GAAG,SAAS,CAAC;QACnC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,GAAwC,EAAE;QACpE,IAAI,oBAAoB,KAAK,SAAS,EAAE,CAAC;YACvC,OAAO,oBAAoB,CAAC;QAC9B,CAAC;QAED,MAAM,SAAS,GAA+B,EAAE,CAAC;QAEjD,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAEtC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,uEAAuE;gBACvE,oEAAoE;gBACpE,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;oBACvB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;QAED,oBAAoB,GAAG,SAAS,CAAC;QAEjC,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,CAAC,SAAY,EAAQ,EAAE;QACzC,MAAM,WAAW,GAAG,gBAAgB,EAAE,CAAC;QAEvC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAEvC,KAAK,MAAM,CAAC,IAAI,mBAAmB,EAAE,EAAE,CAAC;YACtC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC;AAC1D,CAAC,CAAC;AAEF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,6BAA6B,GAAG,GAElC,EAAE,CAAC,uBAAuB,CAAC;AAEtC,MAAM,uBAAuB,GAAG,CAAC,YAAyB,EAAQ,EAAE;IAClE,wEAAwE;IACxE,yEAAyE;IACzE,2EAA2E;IAC3E,4EAA4E;IAC5E,uEAAuE;IACvE,+CAA+C;IAC/C,WAAW,EAAE,CAAC;AAChB,CAAC,CAAC;AAyBF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAIhC,EACA,IAAI,EACJ,KAAK,EACL,MAAM,EACN,SAAS,EACT,WAAW,EACX,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,KAAK,GACkC,EAKpC,EAAE;IAUL,SAAS,IAAI,CAAI,QAAwB;QACvC,OAAO,QAAQ;QACb,4DAA4D;QAC5D,cAAqD,CACtD,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,2EAA2E;IAC3E,2EAA2E;IAC3E,4EAA4E;IAC5E,uDAAuD;IACvD,MAAM,cAAc,GAAG;QACrB,GAAG,KAAK;QAER,EAAE,EAAE,MAAM,CAAC,EAAE;QAEb,IAAI;QAEJ,KAAK;QAEL,QAAQ,EAAE,MAAM,CAAC,QAAQ;QAEzB,WAAW,EAAE,MAAM,CAAC,WAAW;QAE/B,WAAW,EAAE,MAAM,CAAC,WAAW;QAE/B,WAAW,EAAE,KAAK;QAElB,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE;QAEjC,aAAa,EAAE,KAAK;QAEpB,QAAQ,EAAE,KAAK;QAEf,cAAc,EAAE,MAAM,CAAC,cAAc;QAErC,YAAY;QAEZ,SAAS;QAET,WAAW;QAEX,QAAQ;QAER,OAAO;QAEP,SAAS,EAAE,MAAM,CAAC,SAAS;QAE3B,IAAI;KACL,CAAC;IAEF,MAAM,CAAC,MAAM,CAAC;QACZ,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE;YACxB,cAAc,CAAC,WAAW,GAAG,KAAK,CAAC;QACrC,CAAC;QAED,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE;YACxB,cAAc,CAAC,WAAW,GAAG,KAAK,CAAC;QACrC,CAAC;QAED,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,cAAc,CAAC,aAAa,GAAG,KAAK,CAAC;QACvC,CAAC;QAED,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE;YACrB,cAAc,CAAC,QAAQ,GAAG,KAAK,CAAC;QAClC,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-root-observable.d.mts","sourceRoot":"","sources":["../../../src/core/base/create-root-observable.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAQ3E;;;;GAIG;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,OAAO,CAAC;IAE3B,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC,CAAC;AAEH,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAAI,QAAQ,CAAC;IAC7C,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE1B;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,CAAC,CAAC;AAEH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,oBAAoB,GAC/B,CAAC,EAGD,SAAS,SAAS,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,CAChE,KAAK,EACL,KAAK,CACN,gCAE6B,oBAAoB,CAAC,CAAC,CAAC,QAC/C,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,SAAS,KACjD,SAAS,GAAG,cAAc,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"create-root-observable.d.mts","sourceRoot":"","sources":["../../../src/core/base/create-root-observable.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAQ3E;;;;GAIG;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,OAAO,CAAC;IAE3B,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC,CAAC;AAEH,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAAI,QAAQ,CAAC;IAC7C,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE1B;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,CAAC,CAAC;AAEH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,oBAAoB,GAC/B,CAAC,EAGD,SAAS,SAAS,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,CAChE,KAAK,EACL,KAAK,CACN,gCAE6B,oBAAoB,CAAC,CAAC,CAAC,QAC/C,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,SAAS,KACjD,SAAS,GAAG,cAAc,CAAC,CAAC,CA4C9B,CAAC"}
|
|
@@ -14,13 +14,16 @@ import { assembleObservable, createManagerObservableParts, createObservableBaseH
|
|
|
14
14
|
|
|
15
15
|
export const createRootObservable = ({ initialValue, onComplete }, init) => {
|
|
16
16
|
const handle = createObservableBaseHandle(initialValue);
|
|
17
|
-
const { addDescendant, startUpdate } = createManagerObservableParts(handle);
|
|
17
|
+
const { addDescendant, deleteDescendant, startUpdate } = createManagerObservableParts(handle);
|
|
18
18
|
const complete = () => {
|
|
19
19
|
onComplete?.();
|
|
20
20
|
handle.completeBase();
|
|
21
21
|
};
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
const autoComplete = onComplete !== undefined;
|
|
22
25
|
const tryComplete = () => {
|
|
23
|
-
if (!handle.hasSubscriber() && !handle.hasActiveChild()) {
|
|
26
|
+
if (autoComplete && !handle.hasSubscriber() && !handle.hasActiveChild()) {
|
|
24
27
|
complete();
|
|
25
28
|
}
|
|
26
29
|
};
|
|
@@ -36,9 +39,13 @@ export const createRootObservable = ({ initialValue, onComplete }, init) => {
|
|
|
36
39
|
tryUpdate: createTryUpdateNotImplemented,
|
|
37
40
|
tryComplete,
|
|
38
41
|
complete,
|
|
42
|
+
|
|
43
|
+
dispose: complete,
|
|
44
|
+
autoComplete,
|
|
39
45
|
extra: {
|
|
40
46
|
...extension,
|
|
41
47
|
addDescendant,
|
|
48
|
+
deleteDescendant,
|
|
42
49
|
},
|
|
43
50
|
});
|
|
44
51
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-root-observable.mjs","sourceRoot":"","sources":["../../../src/core/base/create-root-observable.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAuB,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EACL,kBAAkB,EAClB,4BAA4B,EAC5B,0BAA0B,EAC1B,6BAA6B,GAC9B,MAAM,8BAA8B,CAAC;AA4BtC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CASlC,EAAE,YAAY,EAAE,UAAU,EAA2B,EACrD,IAAkD,EACnB,EAAE;IACjC,MAAM,MAAM,GAAG,0BAA0B,CAAI,YAAY,CAAC,CAAC;IAE3D,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"create-root-observable.mjs","sourceRoot":"","sources":["../../../src/core/base/create-root-observable.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAuB,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EACL,kBAAkB,EAClB,4BAA4B,EAC5B,0BAA0B,EAC1B,6BAA6B,GAC9B,MAAM,8BAA8B,CAAC;AA4BtC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CASlC,EAAE,YAAY,EAAE,UAAU,EAA2B,EACrD,IAAkD,EACnB,EAAE;IACjC,MAAM,MAAM,GAAG,0BAA0B,CAAI,YAAY,CAAC,CAAC;IAE3D,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,GACpD,4BAA4B,CAAC,MAAM,CAAC,CAAC;IAEvC,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC1B,UAAU,EAAE,EAAE,CAAC;QAEf,MAAM,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC,CAAC;IAEF,uEAAuE;IACvE,2EAA2E;IAC3E,MAAM,YAAY,GAAG,UAAU,KAAK,SAAS,CAAC;IAE9C,MAAM,WAAW,GAAG,GAAS,EAAE;QAC7B,IAAI,YAAY,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,CAAC;YACxE,QAAQ,EAAE,CAAC;QACb,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,SAAS,GAAc,IAAI,CAAC;QAChC,WAAW;QACX,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,QAAQ;KACT,CAAC,CAAC;IAEH,OAAO,kBAAkB,CAAC;QACxB,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,CAAC;QACR,MAAM;QACN,SAAS,EAAE,6BAA6B;QACxC,WAAW;QACX,QAAQ;QACR,2CAA2C;QAC3C,OAAO,EAAE,QAAQ;QACjB,YAAY;QACZ,KAAK,EAAE;YACL,GAAG,SAAS;YACZ,aAAa;YACb,gBAAgB;SACjB;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;IACrC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC5B,MAAM,CAAC,MAAM,CACX,gBAAgB,CACd,oBAAoB,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CACrE,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -21,15 +21,33 @@ type CreateObservableType<A, Kind extends ObservableKind> = Readonly<{
|
|
|
21
21
|
kind: Kind;
|
|
22
22
|
depth: Kind extends 'root' ? 0 : number;
|
|
23
23
|
addChild: <B>(child: ChildObservable<B>) => void;
|
|
24
|
+
deleteChild: <B>(child: ChildObservable<B>) => void;
|
|
24
25
|
getSnapshot: () => Optional<A>;
|
|
25
26
|
isCompleted: boolean;
|
|
26
27
|
updateToken: UpdateToken;
|
|
27
28
|
hasSubscriber: boolean;
|
|
28
29
|
hasChild: boolean;
|
|
29
30
|
hasActiveChild: () => boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Whether this observable completes itself once nothing uses it any more —
|
|
33
|
+
* once it has neither subscribers nor live children when one of its children
|
|
34
|
+
* completes. True when completing it would release something: it has a
|
|
35
|
+
* teardown of its own (a timer, an inner subscription) or a parent with
|
|
36
|
+
* `autoComplete`. A `source` or `createState` and everything derived from
|
|
37
|
+
* it alone are never completed this way, so completing a derived observable
|
|
38
|
+
* cannot end a state that something else may still read (#2133).
|
|
39
|
+
*/
|
|
40
|
+
autoComplete: boolean;
|
|
30
41
|
tryUpdate: (updateToken: UpdateToken) => void;
|
|
31
42
|
tryComplete: () => void;
|
|
32
43
|
complete: () => void;
|
|
44
|
+
/**
|
|
45
|
+
* Completes this observable and takes it out of the graph, without telling
|
|
46
|
+
* its parents: unlike `complete()`, it never completes an upstream
|
|
47
|
+
* observable, whatever its `autoComplete`. Its descendants are completed as
|
|
48
|
+
* by `complete()` once none of their parents is live.
|
|
49
|
+
*/
|
|
50
|
+
dispose: () => void;
|
|
33
51
|
subscribe: (onNext: (v: A) => void, onComplete?: () => void) => Subscription;
|
|
34
52
|
pipe: PipeMethod<A>;
|
|
35
53
|
}>;
|
|
@@ -48,6 +66,7 @@ declare namespace ObservableTypeConverter {
|
|
|
48
66
|
}>;
|
|
49
67
|
export type ToManager<A, O extends CreateObservableType<A, 'async child' | 'root'>> = O & Readonly<{
|
|
50
68
|
addDescendant: <B>(child: ChildObservable<B>) => void;
|
|
69
|
+
deleteDescendant: <B>(child: ChildObservable<B>) => void;
|
|
51
70
|
}>;
|
|
52
71
|
export {};
|
|
53
72
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observable.d.mts","sourceRoot":"","sources":["../../../src/core/types/observable.mts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,QAAQ,EAAE,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,KAAK,EAAoB,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAErE;;;;;;;;;;;;GAYG;AAEH,KAAK,oBAAoB,CAAC,CAAC,EAAE,IAAI,SAAS,cAAc,IAAI,QAAQ,CAAC;IACnE,EAAE,EAAE,YAAY,CAAC;IACjB,IAAI,EAAE,IAAI,CAAC;IAGX,KAAK,EAAE,IAAI,SAAS,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC;IACxC,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"observable.d.mts","sourceRoot":"","sources":["../../../src/core/types/observable.mts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observable.mjs","sourceRoot":"","sources":["../../../src/core/types/observable.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA4B,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"observable.mjs","sourceRoot":"","sources":["../../../src/core/types/observable.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA4B,MAAM,eAAe,CAAC;AAsLrE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,GAAkB,EACW,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC;AAE5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,GAAkB,EACQ,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC;AAEnD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,GAAkB,EACS,EAAE,CAC7B,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,CAAC;AAgB1D,sEAAsE;AACtE,uDAAuD;AAEvD,UAAU,CAAuD,IAAI,CAAC,CAAC;AAEvE,UAAU,CAAiD,IAAI,CAAC,CAAC;AAEjE,UAAU,CAAsC,GAAG,CAAC,CAAC;AAErD,UAAU,CAAiD,GAAG,CAAC,CAAC;AAEhE,UAAU,CAAgD,GAAG,CAAC,CAAC;AAE/D,UAAU,CAAiD,GAAG,CAAC,CAAC;AAEhE,UAAU,CAA2C,GAAG,CAAC,CAAC;AAE1D,UAAU,CAAuD,GAAG,CAAC,CAAC;AAEtE,UAAU,CAA8C,IAAI,CAAC,CAAC;AAE9D,UAAU,CAA8C,KAAK,CAAC,CAAC;AAE/D,UAAU,CAGR,IAAI,CAAC,CAAC;AAER,UAAU,CAA8C,KAAK,CAAC,CAAC;AAE/D,UAAU,CAGR,IAAI,CAAC,CAAC;AAER,UAAU,CAGR,KAAK,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "synstate",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.0",
|
|
4
4
|
"description": "Type-safe State Management Library for TypeScript/JavaScript",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -39,20 +39,20 @@
|
|
|
39
39
|
"@types/react": "19.3.0",
|
|
40
40
|
"@vitest/browser-playwright": "5.0.3",
|
|
41
41
|
"argparse": "3.0.2",
|
|
42
|
-
"eslint-config-typed": "5.17.
|
|
43
|
-
"eslint-plugin-ts-data-forge": "0.8.
|
|
44
|
-
"eslint-plugin-ts-fortress": "1.3.
|
|
45
|
-
"eslint-plugin-ts-type-forge": "0.8.
|
|
42
|
+
"eslint-config-typed": "5.17.4",
|
|
43
|
+
"eslint-plugin-ts-data-forge": "0.8.6",
|
|
44
|
+
"eslint-plugin-ts-fortress": "1.3.3",
|
|
45
|
+
"eslint-plugin-ts-type-forge": "0.8.8",
|
|
46
46
|
"jotai": "3.0.1",
|
|
47
47
|
"mobx": "7.0.6",
|
|
48
|
-
"playwright": "1.
|
|
48
|
+
"playwright": "1.64.0",
|
|
49
49
|
"prettier": "3.9.9",
|
|
50
50
|
"prettier-plugin-organize-imports": "4.3.0",
|
|
51
51
|
"prettier-plugin-packagejson": "3.0.2",
|
|
52
52
|
"react": "19.3.0",
|
|
53
53
|
"rxjs": "7.8.2",
|
|
54
|
-
"synstate-react-hooks": "3.
|
|
55
|
-
"synstate-react-hooks-compat": "3.
|
|
54
|
+
"synstate-react-hooks": "3.3.0",
|
|
55
|
+
"synstate-react-hooks-compat": "3.3.0",
|
|
56
56
|
"ts-repo-utils": "10.7.1",
|
|
57
57
|
"valtio": "2.3.2",
|
|
58
58
|
"zustand": "5.0.15"
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
"scripts": {
|
|
69
69
|
"build": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/build.mts",
|
|
70
70
|
"check:ext": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/check-ext.mts",
|
|
71
|
-
"check:lint": "eslint .",
|
|
71
|
+
"check:lint": "oxlint . && eslint .",
|
|
72
72
|
"check:sumi": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ../../languages/sumi/cli/src/cmd/sumi.mts check ./tsconfig.sumi.json",
|
|
73
73
|
"check:test": "pnpm run z:vitest:node run",
|
|
74
74
|
"check:test:browser": "pnpm run z:vitest --project='Browser' run",
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
"fix:fmt": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ../../libs/ts-repo-utils/src/cmd/format-uncommitted.mts --cwd .",
|
|
80
80
|
"fix:fmt:diff": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ../../libs/ts-repo-utils/src/cmd/format-diff-from.mts origin/main --cwd .",
|
|
81
81
|
"fix:fmt:full": "pnpm run z:prettier .",
|
|
82
|
-
"fix:lint": "eslint . --fix",
|
|
82
|
+
"fix:lint": "oxlint . --fix && eslint . --fix",
|
|
83
83
|
"fmt": "pnpm run fix:fmt",
|
|
84
84
|
"gen": "run-s gen:index gen:readme gen:jsdoc gen:sample-diffs",
|
|
85
85
|
"gen:index": "run-s gen:index:src fix:fmt",
|
|
@@ -98,11 +98,36 @@ export const createSyncChildObservable = <A, P extends NonEmptyUnknownList>(
|
|
|
98
98
|
): SyncChildObservable<A, P> => {
|
|
99
99
|
const handle = createObservableBaseHandle<A>(initialValue);
|
|
100
100
|
|
|
101
|
-
|
|
101
|
+
/** Set once assembled; see {@link unregisterChild}. */
|
|
102
|
+
let mut_self: ChildObservable<A> | undefined = undefined;
|
|
103
|
+
|
|
104
|
+
const autoComplete =
|
|
105
|
+
onComplete !== undefined || parents.some((p) => p.autoComplete);
|
|
106
|
+
|
|
107
|
+
const dispose = (): void => {
|
|
108
|
+
// A completed node is reached again through every parent and child that
|
|
109
|
+
// completes after it; running again would repeat the teardown and the
|
|
110
|
+
// ancestor walk in `unregisterChild` for each of them.
|
|
111
|
+
if (handle.isCompleted()) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
|
|
102
115
|
onComplete?.();
|
|
103
116
|
|
|
104
117
|
handle.completeBase();
|
|
105
118
|
|
|
119
|
+
if (mut_self !== undefined) {
|
|
120
|
+
unregisterChild(mut_self, parents);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
const complete = (): void => {
|
|
125
|
+
if (handle.isCompleted()) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
dispose();
|
|
130
|
+
|
|
106
131
|
// propagate to parents
|
|
107
132
|
for (const par of parents) {
|
|
108
133
|
par.tryComplete();
|
|
@@ -110,9 +135,14 @@ export const createSyncChildObservable = <A, P extends NonEmptyUnknownList>(
|
|
|
110
135
|
};
|
|
111
136
|
|
|
112
137
|
const tryComplete = (): void => {
|
|
138
|
+
if (handle.isCompleted()) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
|
|
113
142
|
tryCompleteChild({
|
|
114
143
|
hasSubscriber: handle.hasSubscriber(),
|
|
115
144
|
hasActiveChild: handle.hasActiveChild(),
|
|
145
|
+
autoComplete,
|
|
116
146
|
parents,
|
|
117
147
|
complete,
|
|
118
148
|
});
|
|
@@ -131,11 +161,15 @@ export const createSyncChildObservable = <A, P extends NonEmptyUnknownList>(
|
|
|
131
161
|
tryUpdate,
|
|
132
162
|
tryComplete,
|
|
133
163
|
complete,
|
|
164
|
+
dispose,
|
|
165
|
+
autoComplete,
|
|
134
166
|
extra: { parents },
|
|
135
167
|
});
|
|
136
168
|
|
|
137
169
|
registerChild(observable, parents);
|
|
138
170
|
|
|
171
|
+
mut_self = observable;
|
|
172
|
+
|
|
139
173
|
return observable;
|
|
140
174
|
};
|
|
141
175
|
|
|
@@ -183,13 +217,39 @@ export const createAsyncChildObservable = <A, P extends NonEmptyUnknownList>(
|
|
|
183
217
|
): AsyncChildObservable<A, P> => {
|
|
184
218
|
const handle = createObservableBaseHandle<A>(initialValue);
|
|
185
219
|
|
|
186
|
-
const { addDescendant, startUpdate } =
|
|
220
|
+
const { addDescendant, deleteDescendant, startUpdate } =
|
|
221
|
+
createManagerObservableParts(handle);
|
|
222
|
+
|
|
223
|
+
/** Set once assembled; see {@link unregisterChild}. */
|
|
224
|
+
let mut_self: ChildObservable<A> | undefined = undefined;
|
|
225
|
+
|
|
226
|
+
const autoComplete =
|
|
227
|
+
onComplete !== undefined || parents.some((p) => p.autoComplete);
|
|
228
|
+
|
|
229
|
+
const dispose = (): void => {
|
|
230
|
+
// A completed node is reached again through every parent and child that
|
|
231
|
+
// completes after it; running again would repeat the teardown and the
|
|
232
|
+
// ancestor walk in `unregisterChild` for each of them.
|
|
233
|
+
if (handle.isCompleted()) {
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
187
236
|
|
|
188
|
-
const complete = (): void => {
|
|
189
237
|
onComplete?.();
|
|
190
238
|
|
|
191
239
|
handle.completeBase();
|
|
192
240
|
|
|
241
|
+
if (mut_self !== undefined) {
|
|
242
|
+
unregisterChild(mut_self, parents);
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
const complete = (): void => {
|
|
247
|
+
if (handle.isCompleted()) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
dispose();
|
|
252
|
+
|
|
193
253
|
// propagate to parents
|
|
194
254
|
for (const par of parents) {
|
|
195
255
|
par.tryComplete();
|
|
@@ -197,9 +257,14 @@ export const createAsyncChildObservable = <A, P extends NonEmptyUnknownList>(
|
|
|
197
257
|
};
|
|
198
258
|
|
|
199
259
|
const tryComplete = (): void => {
|
|
260
|
+
if (handle.isCompleted()) {
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
|
|
200
264
|
tryCompleteChild({
|
|
201
265
|
hasSubscriber: handle.hasSubscriber(),
|
|
202
266
|
hasActiveChild: handle.hasActiveChild(),
|
|
267
|
+
autoComplete,
|
|
203
268
|
parents,
|
|
204
269
|
complete,
|
|
205
270
|
});
|
|
@@ -219,11 +284,15 @@ export const createAsyncChildObservable = <A, P extends NonEmptyUnknownList>(
|
|
|
219
284
|
tryUpdate,
|
|
220
285
|
tryComplete,
|
|
221
286
|
complete,
|
|
222
|
-
|
|
287
|
+
dispose,
|
|
288
|
+
autoComplete,
|
|
289
|
+
extra: { parents, addDescendant, deleteDescendant },
|
|
223
290
|
});
|
|
224
291
|
|
|
225
292
|
registerChild(observable, parents);
|
|
226
293
|
|
|
294
|
+
mut_self = observable;
|
|
295
|
+
|
|
227
296
|
return observable;
|
|
228
297
|
};
|
|
229
298
|
|
|
@@ -321,14 +390,51 @@ const registerChild = <A,>(
|
|
|
321
390
|
}
|
|
322
391
|
};
|
|
323
392
|
|
|
393
|
+
/**
|
|
394
|
+
* Undoes {@link registerChild} for a completed child: its parents forget it, and
|
|
395
|
+
* every manager it registered to stops propagating updates to it. Without this
|
|
396
|
+
* a completed node stayed reachable for as long as its root lived, and ran its
|
|
397
|
+
* `tryUpdate` on every update (#2134).
|
|
398
|
+
*
|
|
399
|
+
* A completion that happens while the child is still being constructed (from
|
|
400
|
+
* a leaf factory's `createTryUpdate`) precedes its registration, so there is
|
|
401
|
+
* nothing to undo; `mut_self` is still `undefined` then.
|
|
402
|
+
*/
|
|
403
|
+
const unregisterChild = <A,>(
|
|
404
|
+
child: ChildObservable<A>,
|
|
405
|
+
parents: ChildObservable<A>['parents'],
|
|
406
|
+
): void => {
|
|
407
|
+
for (const p of parents) {
|
|
408
|
+
p.deleteChild(child);
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
const mut_rest = Array.from(parents);
|
|
412
|
+
|
|
413
|
+
while (Arr.isNonEmpty(mut_rest)) {
|
|
414
|
+
const p = mut_rest.pop();
|
|
415
|
+
|
|
416
|
+
if (p === undefined) {
|
|
417
|
+
break;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
if (isManagerObservable(p)) {
|
|
421
|
+
p.deleteDescendant(child);
|
|
422
|
+
} else {
|
|
423
|
+
mut_rest.push(...p.parents);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
};
|
|
427
|
+
|
|
324
428
|
const tryCompleteChild = <A,>({
|
|
325
429
|
hasSubscriber,
|
|
326
430
|
hasActiveChild,
|
|
431
|
+
autoComplete,
|
|
327
432
|
parents,
|
|
328
433
|
complete,
|
|
329
434
|
}: Readonly<{
|
|
330
435
|
hasSubscriber: boolean;
|
|
331
436
|
hasActiveChild: boolean;
|
|
437
|
+
autoComplete: boolean;
|
|
332
438
|
parents: ChildObservable<A>['parents'];
|
|
333
439
|
complete: () => void;
|
|
334
440
|
}>): void => {
|
|
@@ -339,8 +445,8 @@ const tryCompleteChild = <A,>({
|
|
|
339
445
|
return;
|
|
340
446
|
}
|
|
341
447
|
|
|
342
|
-
// If there are no active child node
|
|
343
|
-
if (!hasSubscriber && !hasActiveChild) {
|
|
448
|
+
// If there are no active child node, and completing releases something
|
|
449
|
+
if (autoComplete && !hasSubscriber && !hasActiveChild) {
|
|
344
450
|
complete();
|
|
345
451
|
}
|
|
346
452
|
|
|
@@ -72,6 +72,12 @@ export type ObservableBaseHandle<A> = Readonly<{
|
|
|
72
72
|
|
|
73
73
|
addChild: <B>(child: ChildObservable<B>) => void;
|
|
74
74
|
|
|
75
|
+
/**
|
|
76
|
+
* Forgets `child`, which a completed child calls on each of its parents so
|
|
77
|
+
* that nothing keeps a reference to it (#2134).
|
|
78
|
+
*/
|
|
79
|
+
deleteChild: <B>(child: ChildObservable<B>) => void;
|
|
80
|
+
|
|
75
81
|
getSnapshot: () => Optional<A>;
|
|
76
82
|
|
|
77
83
|
isCompleted: () => boolean;
|
|
@@ -115,7 +121,9 @@ export const createObservableBaseHandle = <A,>(
|
|
|
115
121
|
): ObservableBaseHandle<A> => {
|
|
116
122
|
const id = issueObservableId();
|
|
117
123
|
|
|
118
|
-
|
|
124
|
+
// A set, not an array: a completed child removes itself, and that has to be
|
|
125
|
+
// O(1) for a UI that creates and completes derived nodes on every mount.
|
|
126
|
+
const mut_children: MutableSet<ChildObservable<unknown>> = new Set();
|
|
119
127
|
|
|
120
128
|
const mut_subscribers: MutableMap<SubscriberId, Subscriber<A>> = new Map();
|
|
121
129
|
|
|
@@ -142,7 +150,7 @@ export const createObservableBaseHandle = <A,>(
|
|
|
142
150
|
|
|
143
151
|
writers.setHasSubscriber(mut_subscribers.size > 0);
|
|
144
152
|
|
|
145
|
-
writers.setHasChild(
|
|
153
|
+
writers.setHasChild(mut_children.size > 0);
|
|
146
154
|
};
|
|
147
155
|
|
|
148
156
|
const addSubscriber = (s: Subscriber<A>): SubscriberId => {
|
|
@@ -163,15 +171,17 @@ export const createObservableBaseHandle = <A,>(
|
|
|
163
171
|
};
|
|
164
172
|
|
|
165
173
|
const addChild = <B,>(child: ChildObservable<B>): void => {
|
|
166
|
-
mut_children
|
|
167
|
-
mut_children,
|
|
168
|
-
|
|
169
|
-
child as ChildObservable<unknown>,
|
|
170
|
-
);
|
|
174
|
+
mut_children.add(child);
|
|
171
175
|
|
|
172
176
|
mut_writers?.setHasChild(true);
|
|
173
177
|
};
|
|
174
178
|
|
|
179
|
+
const deleteChild = <B,>(child: ChildObservable<B>): void => {
|
|
180
|
+
mut_children.delete(child);
|
|
181
|
+
|
|
182
|
+
mut_writers?.setHasChild(mut_children.size > 0);
|
|
183
|
+
};
|
|
184
|
+
|
|
175
185
|
const getSnapshot = (): Optional<A> => mut_currentValue;
|
|
176
186
|
|
|
177
187
|
const isCompleted = (): boolean => mut_isCompleted;
|
|
@@ -180,8 +190,15 @@ export const createObservableBaseHandle = <A,>(
|
|
|
180
190
|
|
|
181
191
|
const hasSubscriber = (): boolean => mut_subscribers.size > 0;
|
|
182
192
|
|
|
183
|
-
const hasActiveChild = (): boolean =>
|
|
184
|
-
|
|
193
|
+
const hasActiveChild = (): boolean => {
|
|
194
|
+
for (const c of mut_children) {
|
|
195
|
+
if (!c.isCompleted) {
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
return false;
|
|
201
|
+
};
|
|
185
202
|
|
|
186
203
|
const setNext = (nextValue: A, nextUpdateToken: UpdateToken): void => {
|
|
187
204
|
mut_updateToken = nextUpdateToken;
|
|
@@ -215,7 +232,8 @@ export const createObservableBaseHandle = <A,>(
|
|
|
215
232
|
|
|
216
233
|
mut_writers?.setHasSubscriber(false);
|
|
217
234
|
|
|
218
|
-
//
|
|
235
|
+
// Propagate to children. A child that completes removes itself from
|
|
236
|
+
// `mut_children` during this loop, which iterating a `Set` tolerates.
|
|
219
237
|
for (const o of mut_children) {
|
|
220
238
|
o.tryComplete();
|
|
221
239
|
}
|
|
@@ -255,6 +273,7 @@ export const createObservableBaseHandle = <A,>(
|
|
|
255
273
|
id,
|
|
256
274
|
attach,
|
|
257
275
|
addChild,
|
|
276
|
+
deleteChild,
|
|
258
277
|
getSnapshot,
|
|
259
278
|
isCompleted,
|
|
260
279
|
updateToken,
|
|
@@ -273,41 +292,98 @@ export const createObservableBaseHandle = <A,>(
|
|
|
273
292
|
export type ManagerObservableParts<A> = Readonly<{
|
|
274
293
|
addDescendant: <B>(child: ChildObservable<B>) => void;
|
|
275
294
|
|
|
295
|
+
/**
|
|
296
|
+
* Takes `child` out of the propagation order, which a completed child calls
|
|
297
|
+
* on every manager it registered to (#2134).
|
|
298
|
+
*/
|
|
299
|
+
deleteDescendant: <B>(child: ChildObservable<B>) => void;
|
|
300
|
+
|
|
276
301
|
/** Emits `nextValue` and propagates the update to all descendants. */
|
|
277
302
|
startUpdate: (nextValue: A) => void;
|
|
278
303
|
}>;
|
|
279
304
|
|
|
280
305
|
/**
|
|
281
306
|
* Builds the manager half of a root or async-child observable. Both start their
|
|
282
|
-
* own update propagation, so both keep a
|
|
283
|
-
*
|
|
284
|
-
*
|
|
285
|
-
*
|
|
307
|
+
* own update propagation, so both keep a depth-ordered propagation list; this
|
|
308
|
+
* is the single implementation of it (the class version duplicated it across
|
|
309
|
+
* `RootObservableClass` and `AsyncChildObservableClass`).
|
|
310
|
+
*
|
|
311
|
+
* The descendants are kept in one insertion-ordered set per depth, so adding
|
|
312
|
+
* and removing one is O(1) apart from the first node of a new depth. The flat
|
|
313
|
+
* array `startUpdate` walks is rebuilt only when an update finds it stale: it
|
|
314
|
+
* used to be copied on every `addDescendant`, which made creating n nodes under
|
|
315
|
+
* one root O(n²). Rebuilding at the start of an update also keeps the walk a
|
|
316
|
+
* snapshot, as the copy-on-write array was — a node created or completed while
|
|
317
|
+
* an update is propagating does not change which nodes that update visits.
|
|
286
318
|
*/
|
|
287
319
|
export const createManagerObservableParts = <A,>(
|
|
288
320
|
handle: ObservableBaseHandle<A>,
|
|
289
321
|
): ManagerObservableParts<A> => {
|
|
290
|
-
|
|
322
|
+
const mut_buckets: MutableMap<
|
|
323
|
+
number,
|
|
324
|
+
MutableSet<ChildObservable<unknown>>
|
|
325
|
+
> = new Map();
|
|
291
326
|
|
|
292
|
-
|
|
327
|
+
/** The keys of `mut_buckets`, ascending. */
|
|
328
|
+
let mut_depths: readonly number[] = [];
|
|
329
|
+
|
|
330
|
+
/** `undefined` while stale. */
|
|
331
|
+
let mut_propagationOrder: readonly ChildObservable<unknown>[] | undefined =
|
|
332
|
+
[];
|
|
293
333
|
|
|
294
334
|
const addDescendant = <B,>(child: ChildObservable<B>): void => {
|
|
295
|
-
|
|
296
|
-
|
|
335
|
+
const mut_bucket = mut_buckets.get(child.depth);
|
|
336
|
+
|
|
337
|
+
if (mut_bucket === undefined) {
|
|
338
|
+
mut_buckets.set(child.depth, new Set<ChildObservable<unknown>>([child]));
|
|
339
|
+
|
|
340
|
+
mut_depths = Arr.toInserted(
|
|
341
|
+
mut_depths,
|
|
342
|
+
binarySearch(mut_depths, child.depth),
|
|
343
|
+
child.depth,
|
|
344
|
+
);
|
|
345
|
+
} else {
|
|
346
|
+
if (mut_bucket.has(child)) {
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
mut_bucket.add(child);
|
|
297
351
|
}
|
|
298
352
|
|
|
299
|
-
|
|
353
|
+
mut_propagationOrder = undefined;
|
|
354
|
+
};
|
|
300
355
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
);
|
|
356
|
+
const deleteDescendant = <B,>(child: ChildObservable<B>): void => {
|
|
357
|
+
// An emptied bucket stays, so that its depth is not inserted again.
|
|
358
|
+
const mut_bucket = mut_buckets.get(child.depth);
|
|
305
359
|
|
|
306
|
-
|
|
307
|
-
mut_propagationOrder
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
360
|
+
if (mut_bucket?.delete(child) === true) {
|
|
361
|
+
mut_propagationOrder = undefined;
|
|
362
|
+
}
|
|
363
|
+
};
|
|
364
|
+
|
|
365
|
+
const getPropagationOrder = (): readonly ChildObservable<unknown>[] => {
|
|
366
|
+
if (mut_propagationOrder !== undefined) {
|
|
367
|
+
return mut_propagationOrder;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
const mut_order: ChildObservable<unknown>[] = [];
|
|
371
|
+
|
|
372
|
+
for (const depth of mut_depths) {
|
|
373
|
+
const bucket = mut_buckets.get(depth);
|
|
374
|
+
|
|
375
|
+
if (bucket !== undefined) {
|
|
376
|
+
// Not `push(...bucket)`: a spread passes every element as an argument,
|
|
377
|
+
// which overflows the stack for a bucket of a few hundred thousand.
|
|
378
|
+
for (const c of bucket) {
|
|
379
|
+
mut_order.push(c);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
mut_propagationOrder = mut_order;
|
|
385
|
+
|
|
386
|
+
return mut_order;
|
|
311
387
|
};
|
|
312
388
|
|
|
313
389
|
const startUpdate = (nextValue: A): void => {
|
|
@@ -315,12 +391,12 @@ export const createManagerObservableParts = <A,>(
|
|
|
315
391
|
|
|
316
392
|
handle.setNext(nextValue, updateToken);
|
|
317
393
|
|
|
318
|
-
for (const p of
|
|
394
|
+
for (const p of getPropagationOrder()) {
|
|
319
395
|
p.tryUpdate(updateToken);
|
|
320
396
|
}
|
|
321
397
|
};
|
|
322
398
|
|
|
323
|
-
return { addDescendant, startUpdate };
|
|
399
|
+
return { addDescendant, deleteDescendant, startUpdate };
|
|
324
400
|
};
|
|
325
401
|
|
|
326
402
|
/** Default `tryUpdate` for observables that never receive parent updates. */
|
|
@@ -349,6 +425,8 @@ type AssembleObservableArgs<
|
|
|
349
425
|
tryUpdate: (updateToken: UpdateToken) => void;
|
|
350
426
|
tryComplete: () => void;
|
|
351
427
|
complete: () => void;
|
|
428
|
+
dispose: () => void;
|
|
429
|
+
autoComplete: boolean;
|
|
352
430
|
/**
|
|
353
431
|
* Kind-specific public members (`parents`, `addDescendant`) and leaf
|
|
354
432
|
* extensions (`next`, `start`). They are merged here, in the one place the
|
|
@@ -378,6 +456,8 @@ export const assembleObservable = <
|
|
|
378
456
|
tryUpdate,
|
|
379
457
|
tryComplete,
|
|
380
458
|
complete,
|
|
459
|
+
dispose,
|
|
460
|
+
autoComplete,
|
|
381
461
|
extra,
|
|
382
462
|
}: AssembleObservableArgs<A, Kind, Extra>): Extra &
|
|
383
463
|
ObservableBase<A> &
|
|
@@ -417,6 +497,8 @@ export const assembleObservable = <
|
|
|
417
497
|
|
|
418
498
|
addChild: handle.addChild,
|
|
419
499
|
|
|
500
|
+
deleteChild: handle.deleteChild,
|
|
501
|
+
|
|
420
502
|
getSnapshot: handle.getSnapshot,
|
|
421
503
|
|
|
422
504
|
isCompleted: false,
|
|
@@ -429,12 +511,16 @@ export const assembleObservable = <
|
|
|
429
511
|
|
|
430
512
|
hasActiveChild: handle.hasActiveChild,
|
|
431
513
|
|
|
514
|
+
autoComplete,
|
|
515
|
+
|
|
432
516
|
tryUpdate,
|
|
433
517
|
|
|
434
518
|
tryComplete,
|
|
435
519
|
|
|
436
520
|
complete,
|
|
437
521
|
|
|
522
|
+
dispose,
|
|
523
|
+
|
|
438
524
|
subscribe: handle.subscribe,
|
|
439
525
|
|
|
440
526
|
pipe,
|
|
@@ -59,7 +59,8 @@ export const createRootObservable = <
|
|
|
59
59
|
): Extension & RootObservable<A> => {
|
|
60
60
|
const handle = createObservableBaseHandle<A>(initialValue);
|
|
61
61
|
|
|
62
|
-
const { addDescendant, startUpdate } =
|
|
62
|
+
const { addDescendant, deleteDescendant, startUpdate } =
|
|
63
|
+
createManagerObservableParts(handle);
|
|
63
64
|
|
|
64
65
|
const complete = (): void => {
|
|
65
66
|
onComplete?.();
|
|
@@ -67,8 +68,12 @@ export const createRootObservable = <
|
|
|
67
68
|
handle.completeBase();
|
|
68
69
|
};
|
|
69
70
|
|
|
71
|
+
// A root without a teardown (`source`, `createState`, `just`) releases
|
|
72
|
+
// nothing by completing, so a child completing never completes it (#2133).
|
|
73
|
+
const autoComplete = onComplete !== undefined;
|
|
74
|
+
|
|
70
75
|
const tryComplete = (): void => {
|
|
71
|
-
if (!handle.hasSubscriber() && !handle.hasActiveChild()) {
|
|
76
|
+
if (autoComplete && !handle.hasSubscriber() && !handle.hasActiveChild()) {
|
|
72
77
|
complete();
|
|
73
78
|
}
|
|
74
79
|
};
|
|
@@ -86,9 +91,13 @@ export const createRootObservable = <
|
|
|
86
91
|
tryUpdate: createTryUpdateNotImplemented,
|
|
87
92
|
tryComplete,
|
|
88
93
|
complete,
|
|
94
|
+
// A root has no parents to keep out of it.
|
|
95
|
+
dispose: complete,
|
|
96
|
+
autoComplete,
|
|
89
97
|
extra: {
|
|
90
98
|
...extension,
|
|
91
99
|
addDescendant,
|
|
100
|
+
deleteDescendant,
|
|
92
101
|
},
|
|
93
102
|
});
|
|
94
103
|
};
|
|
@@ -25,6 +25,7 @@ type CreateObservableType<A, Kind extends ObservableKind> = Readonly<{
|
|
|
25
25
|
// reactive dependency tree structure
|
|
26
26
|
depth: Kind extends 'root' ? 0 : number;
|
|
27
27
|
addChild: <B>(child: ChildObservable<B>) => void;
|
|
28
|
+
deleteChild: <B>(child: ChildObservable<B>) => void;
|
|
28
29
|
|
|
29
30
|
// state
|
|
30
31
|
getSnapshot: () => Optional<A>;
|
|
@@ -34,9 +35,28 @@ type CreateObservableType<A, Kind extends ObservableKind> = Readonly<{
|
|
|
34
35
|
hasChild: boolean;
|
|
35
36
|
hasActiveChild: () => boolean;
|
|
36
37
|
|
|
38
|
+
/**
|
|
39
|
+
* Whether this observable completes itself once nothing uses it any more —
|
|
40
|
+
* once it has neither subscribers nor live children when one of its children
|
|
41
|
+
* completes. True when completing it would release something: it has a
|
|
42
|
+
* teardown of its own (a timer, an inner subscription) or a parent with
|
|
43
|
+
* `autoComplete`. A `source` or `createState` and everything derived from
|
|
44
|
+
* it alone are never completed this way, so completing a derived observable
|
|
45
|
+
* cannot end a state that something else may still read (#2133).
|
|
46
|
+
*/
|
|
47
|
+
autoComplete: boolean;
|
|
48
|
+
|
|
37
49
|
tryUpdate: (updateToken: UpdateToken) => void;
|
|
38
50
|
tryComplete: () => void;
|
|
39
51
|
complete: () => void;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Completes this observable and takes it out of the graph, without telling
|
|
55
|
+
* its parents: unlike `complete()`, it never completes an upstream
|
|
56
|
+
* observable, whatever its `autoComplete`. Its descendants are completed as
|
|
57
|
+
* by `complete()` once none of their parents is live.
|
|
58
|
+
*/
|
|
59
|
+
dispose: () => void;
|
|
40
60
|
subscribe: (onNext: (v: A) => void, onComplete?: () => void) => Subscription;
|
|
41
61
|
|
|
42
62
|
pipe: PipeMethod<A>;
|
|
@@ -84,6 +104,7 @@ namespace ObservableTypeConverter {
|
|
|
84
104
|
> = O &
|
|
85
105
|
Readonly<{
|
|
86
106
|
addDescendant: <B>(child: ChildObservable<B>) => void;
|
|
107
|
+
deleteDescendant: <B>(child: ChildObservable<B>) => void;
|
|
87
108
|
}>;
|
|
88
109
|
}
|
|
89
110
|
|