synstate 1.0.2 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -17
- package/dist/core/class/child-observable-class.d.mts.map +1 -1
- package/dist/core/class/child-observable-class.mjs +148 -140
- package/dist/core/class/child-observable-class.mjs.map +1 -1
- package/dist/core/class/observable-base-class.d.mts.map +1 -1
- package/dist/core/class/observable-base-class.mjs +111 -107
- package/dist/core/class/observable-base-class.mjs.map +1 -1
- package/dist/core/class/root-observable-class.d.mts.map +1 -1
- package/dist/core/class/root-observable-class.mjs +32 -24
- package/dist/core/class/root-observable-class.mjs.map +1 -1
- package/dist/core/combine/combine.d.mts +3 -3
- package/dist/core/combine/combine.d.mts.map +1 -1
- package/dist/core/combine/combine.mjs +31 -113
- package/dist/core/combine/combine.mjs.map +1 -1
- package/dist/core/combine/merge.d.mts +2 -2
- package/dist/core/combine/merge.d.mts.map +1 -1
- package/dist/core/combine/merge.mjs +21 -69
- package/dist/core/combine/merge.mjs.map +1 -1
- package/dist/core/combine/zip.d.mts +2 -2
- package/dist/core/combine/zip.d.mts.map +1 -1
- package/dist/core/combine/zip.mjs +34 -79
- package/dist/core/combine/zip.mjs.map +1 -1
- package/dist/core/create/counter.d.mts +1 -1
- package/dist/core/create/counter.d.mts.map +1 -1
- package/dist/core/create/counter.mjs +45 -84
- package/dist/core/create/counter.mjs.map +1 -1
- package/dist/core/create/from-abortable-promise.d.mts.map +1 -1
- package/dist/core/create/from-abortable-promise.mjs +29 -61
- 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 +17 -66
- 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 +18 -69
- package/dist/core/create/from-subscribable.mjs.map +1 -1
- package/dist/core/create/just.d.mts.map +1 -1
- package/dist/core/create/just.mjs +5 -35
- package/dist/core/create/just.mjs.map +1 -1
- package/dist/core/create/source.mjs +10 -13
- 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 +32 -68
- package/dist/core/create/timer.mjs.map +1 -1
- package/dist/core/operators/audit.d.mts.map +1 -1
- package/dist/core/operators/audit.mjs +39 -133
- package/dist/core/operators/audit.mjs.map +1 -1
- package/dist/core/operators/debounce.d.mts.map +1 -1
- package/dist/core/operators/debounce.mjs +36 -119
- package/dist/core/operators/debounce.mjs.map +1 -1
- package/dist/core/operators/filter.mjs +22 -25
- package/dist/core/operators/filter.mjs.map +1 -1
- package/dist/core/operators/map.d.mts.map +1 -1
- package/dist/core/operators/map.mjs +28 -61
- package/dist/core/operators/map.mjs.map +1 -1
- package/dist/core/operators/merge-map.d.mts +1 -1
- package/dist/core/operators/merge-map.d.mts.map +1 -1
- package/dist/core/operators/merge-map.mjs +34 -130
- package/dist/core/operators/merge-map.mjs.map +1 -1
- package/dist/core/operators/pairwise.d.mts +3 -2
- package/dist/core/operators/pairwise.d.mts.map +1 -1
- package/dist/core/operators/pairwise.mjs +19 -75
- 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 +16 -67
- package/dist/core/operators/scan.mjs.map +1 -1
- package/dist/core/operators/skip-if-no-change.d.mts +1 -1
- package/dist/core/operators/skip-if-no-change.d.mts.map +1 -1
- package/dist/core/operators/skip-if-no-change.mjs +28 -92
- 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 +23 -72
- 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 +26 -88
- package/dist/core/operators/skip-while.mjs.map +1 -1
- package/dist/core/operators/switch-map.d.mts.map +1 -1
- package/dist/core/operators/switch-map.mjs +31 -124
- 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 +28 -69
- 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 +23 -83
- package/dist/core/operators/take-while.mjs.map +1 -1
- package/dist/core/operators/throttle.d.mts.map +1 -1
- package/dist/core/operators/throttle.mjs +38 -115
- package/dist/core/operators/throttle.mjs.map +1 -1
- package/dist/core/operators/with-buffered-from.d.mts +1 -1
- package/dist/core/operators/with-buffered-from.d.mts.map +1 -1
- package/dist/core/operators/with-buffered-from.mjs +37 -90
- package/dist/core/operators/with-buffered-from.mjs.map +1 -1
- package/dist/core/operators/with-current-value-from.d.mts +1 -1
- package/dist/core/operators/with-current-value-from.d.mts.map +1 -1
- package/dist/core/operators/with-current-value-from.mjs +23 -84
- 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 +13 -58
- package/dist/core/operators/with-initial-value.mjs.map +1 -1
- package/dist/core/predefined/operators/attach-index.d.mts +1 -1
- package/dist/core/predefined/operators/attach-index.d.mts.map +1 -1
- package/dist/core/predefined/operators/attach-index.mjs +0 -53
- package/dist/core/predefined/operators/attach-index.mjs.map +1 -1
- package/dist/core/predefined/operators/map-optional.d.mts.map +1 -1
- package/dist/core/predefined/operators/map-optional.mjs +1 -48
- package/dist/core/predefined/operators/map-optional.mjs.map +1 -1
- package/dist/core/predefined/operators/map-result-err.d.mts.map +1 -1
- package/dist/core/predefined/operators/map-result-err.mjs +1 -48
- package/dist/core/predefined/operators/map-result-err.mjs.map +1 -1
- package/dist/core/predefined/operators/map-result-ok.d.mts.map +1 -1
- package/dist/core/predefined/operators/map-result-ok.mjs +1 -48
- package/dist/core/predefined/operators/map-result-ok.mjs.map +1 -1
- package/dist/core/predefined/operators/map-to.d.mts.map +1 -1
- package/dist/core/predefined/operators/map-to.mjs +0 -40
- package/dist/core/predefined/operators/map-to.mjs.map +1 -1
- package/dist/core/predefined/operators/pluck.d.mts +1 -1
- package/dist/core/predefined/operators/pluck.d.mts.map +1 -1
- package/dist/core/predefined/operators/pluck.mjs +0 -43
- package/dist/core/predefined/operators/pluck.mjs.map +1 -1
- package/dist/core/predefined/operators/skip.d.mts.map +1 -1
- package/dist/core/predefined/operators/skip.mjs +0 -47
- package/dist/core/predefined/operators/skip.mjs.map +1 -1
- package/dist/core/predefined/operators/take.d.mts.map +1 -1
- package/dist/core/predefined/operators/take.mjs +0 -41
- package/dist/core/predefined/operators/take.mjs.map +1 -1
- package/dist/core/predefined/operators/unwrap-optional.mjs +4 -43
- package/dist/core/predefined/operators/unwrap-optional.mjs.map +1 -1
- package/dist/core/predefined/operators/unwrap-result-err.mjs +0 -40
- package/dist/core/predefined/operators/unwrap-result-err.mjs.map +1 -1
- package/dist/core/predefined/operators/unwrap-result-ok.mjs +4 -43
- package/dist/core/predefined/operators/unwrap-result-ok.mjs.map +1 -1
- package/dist/core/types/observable-family.d.mts +10 -10
- package/dist/core/types/observable-family.d.mts.map +1 -1
- package/dist/core/types/observable.d.mts.map +1 -1
- package/dist/core/types/observable.mjs +3 -5
- package/dist/core/types/observable.mjs.map +1 -1
- package/dist/core/types/types.d.mts +2 -1
- package/dist/core/types/types.d.mts.map +1 -1
- package/dist/core/utils/id-maker.mjs +5 -6
- package/dist/core/utils/id-maker.mjs.map +1 -1
- package/dist/core/utils/max-depth.d.mts.map +1 -1
- package/dist/core/utils/max-depth.mjs +1 -3
- package/dist/core/utils/max-depth.mjs.map +1 -1
- package/dist/core/utils/observable-utils.d.mts.map +1 -1
- package/dist/core/utils/observable-utils.mjs +3 -2
- package/dist/core/utils/observable-utils.mjs.map +1 -1
- package/dist/core/utils/utils.d.mts.map +1 -1
- package/dist/core/utils/utils.mjs +23 -30
- package/dist/core/utils/utils.mjs.map +1 -1
- package/dist/utils/collect-to-array.d.mts.map +1 -1
- package/dist/utils/collect-to-array.mjs +9 -6
- package/dist/utils/collect-to-array.mjs.map +1 -1
- package/dist/utils/create-boolean-state.d.mts +1 -1
- package/dist/utils/create-boolean-state.d.mts.map +1 -1
- package/dist/utils/create-boolean-state.mjs +18 -46
- package/dist/utils/create-boolean-state.mjs.map +1 -1
- package/dist/utils/create-event-emitter.mjs +10 -64
- package/dist/utils/create-event-emitter.mjs.map +1 -1
- package/dist/utils/create-reducer.d.mts +1 -1
- package/dist/utils/create-reducer.d.mts.map +1 -1
- package/dist/utils/create-reducer.mjs +8 -52
- package/dist/utils/create-reducer.mjs.map +1 -1
- package/dist/utils/create-state.d.mts +1 -1
- package/dist/utils/create-state.d.mts.map +1 -1
- package/dist/utils/create-state.mjs +23 -53
- package/dist/utils/create-state.mjs.map +1 -1
- package/package.json +42 -29
- package/src/core/class/child-observable-class.mts +1 -1
- package/src/core/class/observable-base-class.mts +16 -16
- package/src/core/combine/combine.mts +38 -16
- package/src/core/combine/merge.mts +3 -3
- package/src/core/combine/zip.mts +24 -13
- package/src/core/create/counter.mts +11 -9
- package/src/core/create/counter.test.mts +11 -0
- package/src/core/create/timer.mts +6 -6
- package/src/core/create/timer.test.mts +11 -0
- package/src/core/operators/audit-throttle-teardown.test.mts +21 -0
- package/src/core/operators/audit.mts +6 -6
- package/src/core/operators/debounce.mts +6 -6
- package/src/core/operators/pairwise.mts +10 -5
- package/src/core/operators/skip-while.mts +1 -5
- package/src/core/operators/skip-while.test.mts +20 -0
- package/src/core/operators/throttle.mts +6 -6
- package/src/core/operators/with-buffered-from.mts +4 -4
- package/src/core/predefined/operators/map-optional.mts +1 -2
- package/src/core/predefined/operators/map-result-err.mts +1 -1
- package/src/core/predefined/operators/map-result-ok.mts +1 -1
- package/src/core/types/observable-family.mts +12 -11
- package/src/core/types/observable.mts +5 -7
- package/src/core/types/types.mts +2 -1
- package/src/core/utils/max-depth.mts +5 -1
- package/src/core/utils/utils.mts +1 -1
- package/src/utils/create-boolean-state.mts +1 -1
- package/src/utils/create-reducer.mts +1 -1
- package/src/utils/create-state.mts +1 -1
package/README.md
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
# SynState
|
|
2
2
|
|
|
3
3
|
<p align="center">
|
|
4
|
-
<img src="
|
|
4
|
+
<img src="https://github.com/noshiro-pf/mono/raw/main/libs/synstate/assets/synstate-logo.png" alt="SynState Logo" width="400" />
|
|
5
5
|
</p>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
8
|
|
|
9
9
|
[](https://www.npmjs.com/package/synstate)
|
|
10
10
|
[](https://www.npmjs.com/package/synstate)
|
|
11
|
-
[](
|
|
12
|
-
[](https://github.com/noshiro-pf/mono/blob/main/libs/synstate/LICENSE)
|
|
12
|
+
[](https://codecov.io/gh/noshiro-pf/mono)
|
|
13
13
|
|
|
14
14
|
</p>
|
|
15
15
|
|
|
@@ -17,14 +17,14 @@
|
|
|
17
17
|
|
|
18
18
|
"SynState" is named after "Synchronized + State." It represents a sound synchronized state through a **glitch-free**[^1] Observable implementation.
|
|
19
19
|
|
|
20
|
-
[^1]: See ["How SynState solved the glitch?"](
|
|
20
|
+
[^1]: See ["How SynState solved the glitch?"](https://noshiro-pf.github.io/synstate/internals/how-synstate-solved-the-glitch/).
|
|
21
21
|
|
|
22
22
|
## Features
|
|
23
23
|
|
|
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 -->~4.
|
|
27
|
+
- 🚀 **Lightweight**: <!-- bundle-size:synstate -->~4.4 kB min+gzip<!-- /bundle-size:synstate --> with only one external runtime dependency ([ts-data-forge](https://www.npmjs.com/package/ts-data-forge))
|
|
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
|
|
@@ -207,7 +207,7 @@ A state management library that scales from simple global state to complex async
|
|
|
207
207
|
|
|
208
208
|
RxJS is the most well-known Observable library, and it excels at modeling asynchronous event processing. However, RxJS has a fundamental issue known as **glitch**[^1] — a phenomenon where derived values can temporarily enter inconsistent intermediate states during synchronous propagation. For a state management library, where consistency of derived state is critical, this is unacceptable. SynState was built from scratch with a glitch-free Observable implementation to solve this problem.
|
|
209
209
|
|
|
210
|
-
For a detailed explanation, see ["How SynState solved the glitch?"](
|
|
210
|
+
For a detailed explanation, see ["How SynState solved the glitch?"](https://noshiro-pf.github.io/synstate/internals/how-synstate-solved-the-glitch/).
|
|
211
211
|
|
|
212
212
|
### Key Differences from RxJS
|
|
213
213
|
|
|
@@ -316,6 +316,7 @@ const ResetButton = (): React.JSX.Element => (
|
|
|
316
316
|
```tsx
|
|
317
317
|
import * as React from 'react';
|
|
318
318
|
import { createReducer } from 'synstate-react-hooks';
|
|
319
|
+
import { Arr } from 'ts-data-forge';
|
|
319
320
|
|
|
320
321
|
type Todo = Readonly<{
|
|
321
322
|
id: number;
|
|
@@ -334,14 +335,11 @@ const initialTodos: readonly Todo[] = [] as const;
|
|
|
334
335
|
const reducer = (todos: readonly Todo[], action: Action): readonly Todo[] => {
|
|
335
336
|
switch (action.type) {
|
|
336
337
|
case 'add':
|
|
337
|
-
return
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
done: false,
|
|
343
|
-
},
|
|
344
|
-
];
|
|
338
|
+
return Arr.toPushed(todos, {
|
|
339
|
+
id: Date.now(),
|
|
340
|
+
text: action.text,
|
|
341
|
+
done: false,
|
|
342
|
+
});
|
|
345
343
|
|
|
346
344
|
case 'toggle':
|
|
347
345
|
return todos.map((t) =>
|
|
@@ -432,6 +430,7 @@ const ThemeToggle = (): React.JSX.Element => {
|
|
|
432
430
|
```tsx
|
|
433
431
|
import * as React from 'react';
|
|
434
432
|
import { createState } from 'synstate-react-hooks';
|
|
433
|
+
import { Arr } from 'ts-data-forge';
|
|
435
434
|
|
|
436
435
|
// State
|
|
437
436
|
const [useItemsState, _, { updateState, resetState: resetItemsState }] =
|
|
@@ -439,7 +438,7 @@ const [useItemsState, _, { updateState, resetState: resetItemsState }] =
|
|
|
439
438
|
|
|
440
439
|
// Setup event handlers
|
|
441
440
|
const addItem = (item: string): void => {
|
|
442
|
-
updateState((items: readonly string[]) =>
|
|
441
|
+
updateState((items: readonly string[]) => Arr.toPushed(items, item));
|
|
443
442
|
};
|
|
444
443
|
|
|
445
444
|
// Component 1: Add items
|
|
@@ -664,8 +663,8 @@ SynState maintains full type information.
|
|
|
664
663
|
|
|
665
664
|
## License
|
|
666
665
|
|
|
667
|
-
This project is licensed under the [Apache License 2.0](
|
|
666
|
+
This project is licensed under the [Apache License 2.0](https://github.com/noshiro-pf/mono/blob/main/libs/synstate/LICENSE).
|
|
668
667
|
|
|
669
668
|
## Repository
|
|
670
669
|
|
|
671
|
-
<https://github.com/noshiro-pf/synstate>
|
|
670
|
+
<https://github.com/noshiro-pf/mono/tree/main/libs/synstate>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"child-observable-class.d.mts","sourceRoot":"","sources":["../../../src/core/class/child-observable-class.mts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,8BAA8B,EACnC,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,IAAI,EACV,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AA2GlE,qBAAa,yBAAyB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,SAAS,mBAAmB,CAC3E,SAAQ,mBAAmB,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CACpD,YAAW,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC;;
|
|
1
|
+
{"version":3,"file":"child-observable-class.d.mts","sourceRoot":"","sources":["../../../src/core/class/child-observable-class.mts"],"names":[],"mappings":"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"}
|
|
@@ -5,160 +5,168 @@ import { maxDepth } from '../utils/max-depth.mjs';
|
|
|
5
5
|
import { binarySearch } from '../utils/utils.mjs';
|
|
6
6
|
import { ObservableBaseClass } from './observable-base-class.mjs';
|
|
7
7
|
|
|
8
|
-
/**
|
|
9
|
-
* Detects circular dependencies by walking the full ancestor chain of the
|
|
10
|
-
* given parents and checking whether `child` already appears among them.
|
|
11
|
-
*
|
|
12
|
-
* @throws {Error} if a circular dependency is detected
|
|
13
|
-
*/
|
|
14
8
|
const hasCircularDependencyFrom = (node, mut_visited, mut_inPath) => {
|
|
15
|
-
|
|
9
|
+
if (mut_inPath.has(node.id)) return true;
|
|
10
|
+
if (mut_visited.has(node.id)) return false;
|
|
11
|
+
mut_visited.add(node.id);
|
|
12
|
+
mut_inPath.add(node.id);
|
|
13
|
+
if (isChildObservable(node)) {
|
|
14
|
+
for (const parent of node.parents) {
|
|
15
|
+
if (hasCircularDependencyFrom(parent, mut_visited, mut_inPath)) {
|
|
16
16
|
return true;
|
|
17
|
-
|
|
18
|
-
return false;
|
|
19
|
-
mut_visited.add(node.id);
|
|
20
|
-
mut_inPath.add(node.id);
|
|
21
|
-
if (isChildObservable(node)) {
|
|
22
|
-
for (const parent of node.parents) {
|
|
23
|
-
if (hasCircularDependencyFrom(parent, mut_visited, mut_inPath)) {
|
|
24
|
-
return true;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
17
|
+
}
|
|
27
18
|
}
|
|
28
|
-
|
|
29
|
-
|
|
19
|
+
}
|
|
20
|
+
mut_inPath.delete(node.id);
|
|
21
|
+
return false;
|
|
30
22
|
};
|
|
31
23
|
const detectCircularDependency = (child, parents) => {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
24
|
+
const mut_visited = /* @__PURE__ */ new Set();
|
|
25
|
+
const mut_inPath = /* @__PURE__ */ new Set([child.id]);
|
|
26
|
+
for (const parent of parents) {
|
|
27
|
+
if (hasCircularDependencyFrom(parent, mut_visited, mut_inPath)) {
|
|
28
|
+
throw new Error(
|
|
29
|
+
"Circular dependency detected in observable graph: a child observable cannot be its own ancestor."
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
39
33
|
};
|
|
40
34
|
const registerChild = (child, parents) => {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
// trace back dependency graph
|
|
56
|
-
mut_rest.push(...p.parents);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
35
|
+
detectCircularDependency(child, parents);
|
|
36
|
+
for (const p of parents) {
|
|
37
|
+
p.addChild(child);
|
|
38
|
+
}
|
|
39
|
+
const mut_rest = Array.from(parents);
|
|
40
|
+
while (Arr.isNonEmpty(mut_rest)) {
|
|
41
|
+
const p = mut_rest.pop();
|
|
42
|
+
if (p === void 0) break;
|
|
43
|
+
if (isManagerObservable(p)) {
|
|
44
|
+
p.addDescendant(child);
|
|
45
|
+
} else {
|
|
46
|
+
mut_rest.push(...p.parents);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
59
49
|
};
|
|
60
|
-
const tryComplete = ({
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
50
|
+
const tryComplete = ({
|
|
51
|
+
hasSubscriber,
|
|
52
|
+
hasActiveChild,
|
|
53
|
+
parents,
|
|
54
|
+
complete
|
|
55
|
+
}) => {
|
|
56
|
+
if (parents.every((r) => r.isCompleted)) {
|
|
57
|
+
complete();
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (!hasSubscriber && !hasActiveChild) {
|
|
61
|
+
complete();
|
|
62
|
+
}
|
|
63
|
+
for (const par of parents) {
|
|
64
|
+
par.tryComplete();
|
|
65
|
+
}
|
|
74
66
|
};
|
|
75
67
|
class AsyncChildObservableClass extends ObservableBaseClass {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
68
|
+
#mut_propagationOrder;
|
|
69
|
+
parents;
|
|
70
|
+
descendantsIdSet;
|
|
71
|
+
constructor({
|
|
72
|
+
parents,
|
|
73
|
+
depth = 1 + maxDepth(parents),
|
|
74
|
+
initialValue
|
|
75
|
+
}) {
|
|
76
|
+
super({
|
|
77
|
+
kind: "async child",
|
|
78
|
+
depth,
|
|
79
|
+
initialValue
|
|
80
|
+
});
|
|
81
|
+
this.parents = parents;
|
|
82
|
+
this.#mut_propagationOrder = [];
|
|
83
|
+
this.descendantsIdSet = /* @__PURE__ */ new Set();
|
|
84
|
+
registerChild(this, parents);
|
|
85
|
+
}
|
|
86
|
+
// overload
|
|
87
|
+
addDescendant(child) {
|
|
88
|
+
if (this.descendantsIdSet.has(child.id)) return;
|
|
89
|
+
this.descendantsIdSet.add(child.id);
|
|
90
|
+
const insertPos = binarySearch(
|
|
91
|
+
this.#mut_propagationOrder.map((a) => a.depth),
|
|
92
|
+
child.depth
|
|
93
|
+
);
|
|
94
|
+
this.#mut_propagationOrder = Arr.toInserted(
|
|
95
|
+
this.#mut_propagationOrder,
|
|
96
|
+
insertPos,
|
|
97
|
+
child
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
startUpdate(nextValue) {
|
|
101
|
+
const updateToken = issueUpdateToken();
|
|
102
|
+
this.setNext(nextValue, updateToken);
|
|
103
|
+
for (const p of this.#mut_propagationOrder) {
|
|
104
|
+
p.tryUpdate(updateToken);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
complete() {
|
|
108
|
+
super.complete();
|
|
109
|
+
for (const par of this.parents) {
|
|
110
|
+
par.tryComplete();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
tryComplete() {
|
|
114
|
+
tryComplete({
|
|
115
|
+
complete: () => {
|
|
116
|
+
this.complete();
|
|
117
|
+
},
|
|
118
|
+
hasActiveChild: this.hasActiveChild(),
|
|
119
|
+
hasSubscriber: this.hasSubscriber,
|
|
120
|
+
parents: this.parents
|
|
121
|
+
});
|
|
122
|
+
}
|
|
122
123
|
}
|
|
123
124
|
class SyncChildObservableClass extends ObservableBaseClass {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
125
|
+
parents;
|
|
126
|
+
constructor({
|
|
127
|
+
parents,
|
|
128
|
+
depth = 1 + maxDepth(parents),
|
|
129
|
+
initialValue
|
|
130
|
+
}) {
|
|
131
|
+
super({
|
|
132
|
+
kind: "sync child",
|
|
133
|
+
depth,
|
|
134
|
+
initialValue
|
|
135
|
+
});
|
|
136
|
+
this.parents = parents;
|
|
137
|
+
registerChild(this, parents);
|
|
138
|
+
}
|
|
139
|
+
complete() {
|
|
140
|
+
super.complete();
|
|
141
|
+
for (const par of this.parents) {
|
|
142
|
+
par.tryComplete();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
tryComplete() {
|
|
146
|
+
tryComplete({
|
|
147
|
+
complete: () => {
|
|
148
|
+
this.complete();
|
|
149
|
+
},
|
|
150
|
+
hasActiveChild: this.hasActiveChild(),
|
|
151
|
+
hasSubscriber: this.hasSubscriber,
|
|
152
|
+
parents: this.parents
|
|
153
|
+
});
|
|
154
|
+
}
|
|
150
155
|
}
|
|
151
156
|
class InitializedSyncChildObservableClass extends SyncChildObservableClass {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
157
|
+
constructor({
|
|
158
|
+
parents,
|
|
159
|
+
depth = 1 + maxDepth(parents),
|
|
160
|
+
initialValue
|
|
161
|
+
}) {
|
|
162
|
+
super({ parents, depth, initialValue });
|
|
163
|
+
}
|
|
164
|
+
getSnapshot() {
|
|
165
|
+
return super.getCurrentValue();
|
|
166
|
+
}
|
|
167
|
+
pipe(operator) {
|
|
168
|
+
return operator(this);
|
|
169
|
+
}
|
|
162
170
|
}
|
|
163
171
|
|
|
164
172
|
export { AsyncChildObservableClass, InitializedSyncChildObservableClass, SyncChildObservableClass };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"child-observable-class.mjs","sources":["../../../src/core/class/child-observable-class.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"child-observable-class.mjs","sources":["../../../src/core/class/child-observable-class.mts"],"sourcesContent":["import { Arr, type Some } from 'ts-data-forge';\nimport { type MutableSet } from 'ts-type-forge';\nimport {\n isChildObservable,\n isManagerObservable,\n type AsyncChildObservable,\n type ChildObservable,\n type InitializedObservable,\n type InitializedSyncChildObservable,\n type KeepInitialValueOperator,\n type NonEmptyUnknownList,\n type Observable,\n type ObservableId,\n type Operator,\n type SyncChildObservable,\n type WithInitialValueOperator,\n type Wrap,\n} from '../types/index.mjs';\nimport { binarySearch, issueUpdateToken, maxDepth } from '../utils/index.mjs';\nimport { ObservableBaseClass } from './observable-base-class.mjs';\n\n/**\n * Detects circular dependencies by walking the full ancestor chain of the\n * given parents and checking whether `child` already appears among them.\n *\n * @throws {Error} if a circular dependency is detected\n */\nconst hasCircularDependencyFrom = (\n node: Observable<unknown>,\n mut_visited: MutableSet<ObservableId>,\n mut_inPath: MutableSet<ObservableId>,\n): boolean => {\n if (mut_inPath.has(node.id)) return true;\n\n if (mut_visited.has(node.id)) return false;\n\n mut_visited.add(node.id);\n\n mut_inPath.add(node.id);\n\n if (isChildObservable(node)) {\n for (const parent of node.parents) {\n if (hasCircularDependencyFrom(parent, mut_visited, mut_inPath)) {\n return true;\n }\n }\n }\n\n mut_inPath.delete(node.id);\n\n return false;\n};\n\nconst detectCircularDependency = (\n child: ChildObservable<unknown>,\n parents: readonly Observable<unknown>[],\n): void => {\n const mut_visited = new Set<ObservableId>();\n\n const mut_inPath = new Set<ObservableId>([child.id]);\n\n for (const parent of parents) {\n if (hasCircularDependencyFrom(parent, mut_visited, mut_inPath)) {\n throw new Error(\n 'Circular dependency detected in observable graph: a child observable cannot be its own ancestor.',\n );\n }\n }\n};\n\nconst registerChild = <A,>(\n child: ChildObservable<A>,\n parents: ChildObservable<A>['parents'],\n): void => {\n detectCircularDependency(child, parents);\n\n for (const p of parents) {\n p.addChild(child);\n }\n\n // register child to all reachable ManagerObservables\n const mut_rest = Array.from(parents);\n\n while (Arr.isNonEmpty(mut_rest)) {\n const p = mut_rest.pop();\n\n if (p === undefined) break;\n\n if (isManagerObservable(p)) {\n p.addDescendant(child);\n } else {\n // trace back dependency graph\n mut_rest.push(...p.parents);\n }\n }\n};\n\nconst tryComplete = <A,>({\n hasSubscriber,\n hasActiveChild,\n parents,\n complete,\n}: Readonly<{\n hasSubscriber: boolean;\n hasActiveChild: boolean;\n parents: ChildObservable<A>['parents'];\n complete: () => void;\n}>): void => {\n // If there is no working parent node\n if (parents.every((r) => r.isCompleted)) {\n complete();\n\n return;\n }\n\n // If there are no active child node\n if (!hasSubscriber && !hasActiveChild) {\n complete();\n }\n\n // propagate to parents\n for (const par of parents) {\n par.tryComplete();\n }\n};\n\nexport class AsyncChildObservableClass<A, const P extends NonEmptyUnknownList>\n extends ObservableBaseClass<A, 'async child', number>\n implements AsyncChildObservable<A, P>\n{\n #mut_propagationOrder: readonly ChildObservable<unknown>[];\n readonly parents;\n protected readonly descendantsIdSet: MutableSet<ObservableId>;\n\n constructor({\n parents,\n depth = 1 + maxDepth(parents),\n initialValue,\n }: Readonly<{\n parents: Wrap<P>;\n depth?: number;\n initialValue: ReturnType<AsyncChildObservable<A>['getSnapshot']>;\n }>) {\n super({\n kind: 'async child',\n depth,\n initialValue,\n });\n\n this.parents = parents;\n\n this.#mut_propagationOrder = [];\n\n this.descendantsIdSet = new Set<ObservableId>();\n\n registerChild(this, parents);\n }\n\n // overload\n addDescendant<B>(child: ChildObservable<B>): void {\n if (this.descendantsIdSet.has(child.id)) return;\n\n this.descendantsIdSet.add(child.id);\n\n const insertPos = binarySearch(\n this.#mut_propagationOrder.map((a) => a.depth),\n child.depth,\n );\n\n this.#mut_propagationOrder = Arr.toInserted(\n this.#mut_propagationOrder,\n insertPos,\n child,\n );\n }\n\n startUpdate(nextValue: A): void {\n const updateToken = issueUpdateToken();\n\n this.setNext(nextValue, updateToken);\n\n for (const p of this.#mut_propagationOrder) {\n p.tryUpdate(updateToken);\n }\n }\n\n override complete(): void {\n super.complete();\n\n // propagate to parents\n for (const par of this.parents) {\n par.tryComplete();\n }\n }\n\n override tryComplete(): void {\n tryComplete({\n complete: () => {\n this.complete();\n },\n hasActiveChild: this.hasActiveChild(),\n hasSubscriber: this.hasSubscriber,\n parents: this.parents,\n });\n }\n}\n\nexport class SyncChildObservableClass<A, const P extends NonEmptyUnknownList>\n extends ObservableBaseClass<A, 'sync child', number>\n implements SyncChildObservable<A, P>\n{\n readonly parents;\n\n constructor({\n parents,\n depth = 1 + maxDepth(parents),\n initialValue,\n }: Readonly<{\n parents: Wrap<P>;\n depth?: number;\n initialValue: ReturnType<SyncChildObservable<A>['getSnapshot']>;\n }>) {\n super({\n kind: 'sync child',\n depth,\n initialValue,\n });\n\n this.parents = parents;\n\n registerChild(this, parents);\n }\n\n override complete(): void {\n super.complete();\n\n for (const par of this.parents) {\n par.tryComplete();\n }\n }\n\n override tryComplete(): void {\n tryComplete({\n complete: () => {\n this.complete();\n },\n hasActiveChild: this.hasActiveChild(),\n hasSubscriber: this.hasSubscriber,\n parents: this.parents,\n });\n }\n}\n\nexport class InitializedSyncChildObservableClass<\n A,\n const P extends NonEmptyUnknownList,\n>\n extends SyncChildObservableClass<A, P>\n implements InitializedSyncChildObservable<A, P>\n{\n constructor({\n parents,\n depth = 1 + maxDepth(parents),\n initialValue,\n }: Readonly<{\n parents: Wrap<P>;\n depth?: number;\n initialValue: ReturnType<InitializedSyncChildObservable<A>['getSnapshot']>;\n }>) {\n super({ parents, depth, initialValue });\n }\n\n override getSnapshot(): Some<A> {\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n return super.getCurrentValue() as Some<A>;\n }\n\n override pipe<B>(\n operator: KeepInitialValueOperator<A, B> | WithInitialValueOperator<A, B>,\n ): InitializedObservable<B>;\n\n override pipe<B>(operator: Operator<A, B>): Observable<B>;\n override pipe<B>(operator: Operator<A, B>): Observable<B> {\n return operator(this);\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observable-base-class.d.mts","sourceRoot":"","sources":["../../../src/core/class/observable-base-class.mts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,QAAQ,EAGb,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,wBAAwB,EAC9B,MAAM,oBAAoB,CAAC;AAQ5B,qBAAa,mBAAmB,CAC9B,CAAC,EACD,IAAI,SAAS,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EACtC,KAAK,SAAS,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CACxC,YAAW,cAAc,CAAC,CAAC,CAAC;;
|
|
1
|
+
{"version":3,"file":"observable-base-class.d.mts","sourceRoot":"","sources":["../../../src/core/class/observable-base-class.mts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,QAAQ,EAGb,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,wBAAwB,EAC9B,MAAM,oBAAoB,CAAC;AAQ5B,qBAAa,mBAAmB,CAC9B,CAAC,EACD,IAAI,SAAS,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EACtC,KAAK,SAAS,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CACxC,YAAW,cAAc,CAAC,CAAC,CAAC;;IAM5B,QAAQ,CAAC,EAAE,yCAAC;IACZ,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAEtB,YAAY,EACV,IAAI,EACJ,KAAK,EACL,YAAY,GACb,EAAE,QAAQ,CAAC;QACV,IAAI,EAAE,IAAI,CAAC;QACX,KAAK,EAAE,KAAK,CAAC;QACb,YAAY,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;KAC5D,CAAC,EAgBD;IAeD,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAM3C;IAED,WAAW,IAAI,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAE1D;IAED,SAAS,CAAC,eAAe,IAAI,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAExE;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,WAAW,IAAI,WAAW,CAE7B;IAED,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,cAAc,IAAI,OAAO,CAExB;IAED,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI,CAQ9D;IAGD,SAAS,CAAC,YAAY,EAAE,WAAW,GAAG,IAAI,CAEzC;IAED,WAAW,IAAI,IAAI,CAIlB;IAED,QAAQ,IAAI,IAAI,CAkBf;IAED,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAQjD,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,IAAI,GAAG,YAAY,CAyBvE;CACF"}
|