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.
Files changed (194) hide show
  1. package/README.md +16 -17
  2. package/dist/core/class/child-observable-class.d.mts.map +1 -1
  3. package/dist/core/class/child-observable-class.mjs +148 -140
  4. package/dist/core/class/child-observable-class.mjs.map +1 -1
  5. package/dist/core/class/observable-base-class.d.mts.map +1 -1
  6. package/dist/core/class/observable-base-class.mjs +111 -107
  7. package/dist/core/class/observable-base-class.mjs.map +1 -1
  8. package/dist/core/class/root-observable-class.d.mts.map +1 -1
  9. package/dist/core/class/root-observable-class.mjs +32 -24
  10. package/dist/core/class/root-observable-class.mjs.map +1 -1
  11. package/dist/core/combine/combine.d.mts +3 -3
  12. package/dist/core/combine/combine.d.mts.map +1 -1
  13. package/dist/core/combine/combine.mjs +31 -113
  14. package/dist/core/combine/combine.mjs.map +1 -1
  15. package/dist/core/combine/merge.d.mts +2 -2
  16. package/dist/core/combine/merge.d.mts.map +1 -1
  17. package/dist/core/combine/merge.mjs +21 -69
  18. package/dist/core/combine/merge.mjs.map +1 -1
  19. package/dist/core/combine/zip.d.mts +2 -2
  20. package/dist/core/combine/zip.d.mts.map +1 -1
  21. package/dist/core/combine/zip.mjs +34 -79
  22. package/dist/core/combine/zip.mjs.map +1 -1
  23. package/dist/core/create/counter.d.mts +1 -1
  24. package/dist/core/create/counter.d.mts.map +1 -1
  25. package/dist/core/create/counter.mjs +45 -84
  26. package/dist/core/create/counter.mjs.map +1 -1
  27. package/dist/core/create/from-abortable-promise.d.mts.map +1 -1
  28. package/dist/core/create/from-abortable-promise.mjs +29 -61
  29. package/dist/core/create/from-abortable-promise.mjs.map +1 -1
  30. package/dist/core/create/from-promise.d.mts.map +1 -1
  31. package/dist/core/create/from-promise.mjs +17 -66
  32. package/dist/core/create/from-promise.mjs.map +1 -1
  33. package/dist/core/create/from-subscribable.d.mts.map +1 -1
  34. package/dist/core/create/from-subscribable.mjs +18 -69
  35. package/dist/core/create/from-subscribable.mjs.map +1 -1
  36. package/dist/core/create/just.d.mts.map +1 -1
  37. package/dist/core/create/just.mjs +5 -35
  38. package/dist/core/create/just.mjs.map +1 -1
  39. package/dist/core/create/source.mjs +10 -13
  40. package/dist/core/create/source.mjs.map +1 -1
  41. package/dist/core/create/timer.d.mts.map +1 -1
  42. package/dist/core/create/timer.mjs +32 -68
  43. package/dist/core/create/timer.mjs.map +1 -1
  44. package/dist/core/operators/audit.d.mts.map +1 -1
  45. package/dist/core/operators/audit.mjs +39 -133
  46. package/dist/core/operators/audit.mjs.map +1 -1
  47. package/dist/core/operators/debounce.d.mts.map +1 -1
  48. package/dist/core/operators/debounce.mjs +36 -119
  49. package/dist/core/operators/debounce.mjs.map +1 -1
  50. package/dist/core/operators/filter.mjs +22 -25
  51. package/dist/core/operators/filter.mjs.map +1 -1
  52. package/dist/core/operators/map.d.mts.map +1 -1
  53. package/dist/core/operators/map.mjs +28 -61
  54. package/dist/core/operators/map.mjs.map +1 -1
  55. package/dist/core/operators/merge-map.d.mts +1 -1
  56. package/dist/core/operators/merge-map.d.mts.map +1 -1
  57. package/dist/core/operators/merge-map.mjs +34 -130
  58. package/dist/core/operators/merge-map.mjs.map +1 -1
  59. package/dist/core/operators/pairwise.d.mts +3 -2
  60. package/dist/core/operators/pairwise.d.mts.map +1 -1
  61. package/dist/core/operators/pairwise.mjs +19 -75
  62. package/dist/core/operators/pairwise.mjs.map +1 -1
  63. package/dist/core/operators/scan.d.mts.map +1 -1
  64. package/dist/core/operators/scan.mjs +16 -67
  65. package/dist/core/operators/scan.mjs.map +1 -1
  66. package/dist/core/operators/skip-if-no-change.d.mts +1 -1
  67. package/dist/core/operators/skip-if-no-change.d.mts.map +1 -1
  68. package/dist/core/operators/skip-if-no-change.mjs +28 -92
  69. package/dist/core/operators/skip-if-no-change.mjs.map +1 -1
  70. package/dist/core/operators/skip-until.d.mts.map +1 -1
  71. package/dist/core/operators/skip-until.mjs +23 -72
  72. package/dist/core/operators/skip-until.mjs.map +1 -1
  73. package/dist/core/operators/skip-while.d.mts.map +1 -1
  74. package/dist/core/operators/skip-while.mjs +26 -88
  75. package/dist/core/operators/skip-while.mjs.map +1 -1
  76. package/dist/core/operators/switch-map.d.mts.map +1 -1
  77. package/dist/core/operators/switch-map.mjs +31 -124
  78. package/dist/core/operators/switch-map.mjs.map +1 -1
  79. package/dist/core/operators/take-until.d.mts.map +1 -1
  80. package/dist/core/operators/take-until.mjs +28 -69
  81. package/dist/core/operators/take-until.mjs.map +1 -1
  82. package/dist/core/operators/take-while.d.mts.map +1 -1
  83. package/dist/core/operators/take-while.mjs +23 -83
  84. package/dist/core/operators/take-while.mjs.map +1 -1
  85. package/dist/core/operators/throttle.d.mts.map +1 -1
  86. package/dist/core/operators/throttle.mjs +38 -115
  87. package/dist/core/operators/throttle.mjs.map +1 -1
  88. package/dist/core/operators/with-buffered-from.d.mts +1 -1
  89. package/dist/core/operators/with-buffered-from.d.mts.map +1 -1
  90. package/dist/core/operators/with-buffered-from.mjs +37 -90
  91. package/dist/core/operators/with-buffered-from.mjs.map +1 -1
  92. package/dist/core/operators/with-current-value-from.d.mts +1 -1
  93. package/dist/core/operators/with-current-value-from.d.mts.map +1 -1
  94. package/dist/core/operators/with-current-value-from.mjs +23 -84
  95. package/dist/core/operators/with-current-value-from.mjs.map +1 -1
  96. package/dist/core/operators/with-initial-value.d.mts.map +1 -1
  97. package/dist/core/operators/with-initial-value.mjs +13 -58
  98. package/dist/core/operators/with-initial-value.mjs.map +1 -1
  99. package/dist/core/predefined/operators/attach-index.d.mts +1 -1
  100. package/dist/core/predefined/operators/attach-index.d.mts.map +1 -1
  101. package/dist/core/predefined/operators/attach-index.mjs +0 -53
  102. package/dist/core/predefined/operators/attach-index.mjs.map +1 -1
  103. package/dist/core/predefined/operators/map-optional.d.mts.map +1 -1
  104. package/dist/core/predefined/operators/map-optional.mjs +1 -48
  105. package/dist/core/predefined/operators/map-optional.mjs.map +1 -1
  106. package/dist/core/predefined/operators/map-result-err.d.mts.map +1 -1
  107. package/dist/core/predefined/operators/map-result-err.mjs +1 -48
  108. package/dist/core/predefined/operators/map-result-err.mjs.map +1 -1
  109. package/dist/core/predefined/operators/map-result-ok.d.mts.map +1 -1
  110. package/dist/core/predefined/operators/map-result-ok.mjs +1 -48
  111. package/dist/core/predefined/operators/map-result-ok.mjs.map +1 -1
  112. package/dist/core/predefined/operators/map-to.d.mts.map +1 -1
  113. package/dist/core/predefined/operators/map-to.mjs +0 -40
  114. package/dist/core/predefined/operators/map-to.mjs.map +1 -1
  115. package/dist/core/predefined/operators/pluck.d.mts +1 -1
  116. package/dist/core/predefined/operators/pluck.d.mts.map +1 -1
  117. package/dist/core/predefined/operators/pluck.mjs +0 -43
  118. package/dist/core/predefined/operators/pluck.mjs.map +1 -1
  119. package/dist/core/predefined/operators/skip.d.mts.map +1 -1
  120. package/dist/core/predefined/operators/skip.mjs +0 -47
  121. package/dist/core/predefined/operators/skip.mjs.map +1 -1
  122. package/dist/core/predefined/operators/take.d.mts.map +1 -1
  123. package/dist/core/predefined/operators/take.mjs +0 -41
  124. package/dist/core/predefined/operators/take.mjs.map +1 -1
  125. package/dist/core/predefined/operators/unwrap-optional.mjs +4 -43
  126. package/dist/core/predefined/operators/unwrap-optional.mjs.map +1 -1
  127. package/dist/core/predefined/operators/unwrap-result-err.mjs +0 -40
  128. package/dist/core/predefined/operators/unwrap-result-err.mjs.map +1 -1
  129. package/dist/core/predefined/operators/unwrap-result-ok.mjs +4 -43
  130. package/dist/core/predefined/operators/unwrap-result-ok.mjs.map +1 -1
  131. package/dist/core/types/observable-family.d.mts +10 -10
  132. package/dist/core/types/observable-family.d.mts.map +1 -1
  133. package/dist/core/types/observable.d.mts.map +1 -1
  134. package/dist/core/types/observable.mjs +3 -5
  135. package/dist/core/types/observable.mjs.map +1 -1
  136. package/dist/core/types/types.d.mts +2 -1
  137. package/dist/core/types/types.d.mts.map +1 -1
  138. package/dist/core/utils/id-maker.mjs +5 -6
  139. package/dist/core/utils/id-maker.mjs.map +1 -1
  140. package/dist/core/utils/max-depth.d.mts.map +1 -1
  141. package/dist/core/utils/max-depth.mjs +1 -3
  142. package/dist/core/utils/max-depth.mjs.map +1 -1
  143. package/dist/core/utils/observable-utils.d.mts.map +1 -1
  144. package/dist/core/utils/observable-utils.mjs +3 -2
  145. package/dist/core/utils/observable-utils.mjs.map +1 -1
  146. package/dist/core/utils/utils.d.mts.map +1 -1
  147. package/dist/core/utils/utils.mjs +23 -30
  148. package/dist/core/utils/utils.mjs.map +1 -1
  149. package/dist/utils/collect-to-array.d.mts.map +1 -1
  150. package/dist/utils/collect-to-array.mjs +9 -6
  151. package/dist/utils/collect-to-array.mjs.map +1 -1
  152. package/dist/utils/create-boolean-state.d.mts +1 -1
  153. package/dist/utils/create-boolean-state.d.mts.map +1 -1
  154. package/dist/utils/create-boolean-state.mjs +18 -46
  155. package/dist/utils/create-boolean-state.mjs.map +1 -1
  156. package/dist/utils/create-event-emitter.mjs +10 -64
  157. package/dist/utils/create-event-emitter.mjs.map +1 -1
  158. package/dist/utils/create-reducer.d.mts +1 -1
  159. package/dist/utils/create-reducer.d.mts.map +1 -1
  160. package/dist/utils/create-reducer.mjs +8 -52
  161. package/dist/utils/create-reducer.mjs.map +1 -1
  162. package/dist/utils/create-state.d.mts +1 -1
  163. package/dist/utils/create-state.d.mts.map +1 -1
  164. package/dist/utils/create-state.mjs +23 -53
  165. package/dist/utils/create-state.mjs.map +1 -1
  166. package/package.json +42 -29
  167. package/src/core/class/child-observable-class.mts +1 -1
  168. package/src/core/class/observable-base-class.mts +16 -16
  169. package/src/core/combine/combine.mts +38 -16
  170. package/src/core/combine/merge.mts +3 -3
  171. package/src/core/combine/zip.mts +24 -13
  172. package/src/core/create/counter.mts +11 -9
  173. package/src/core/create/counter.test.mts +11 -0
  174. package/src/core/create/timer.mts +6 -6
  175. package/src/core/create/timer.test.mts +11 -0
  176. package/src/core/operators/audit-throttle-teardown.test.mts +21 -0
  177. package/src/core/operators/audit.mts +6 -6
  178. package/src/core/operators/debounce.mts +6 -6
  179. package/src/core/operators/pairwise.mts +10 -5
  180. package/src/core/operators/skip-while.mts +1 -5
  181. package/src/core/operators/skip-while.test.mts +20 -0
  182. package/src/core/operators/throttle.mts +6 -6
  183. package/src/core/operators/with-buffered-from.mts +4 -4
  184. package/src/core/predefined/operators/map-optional.mts +1 -2
  185. package/src/core/predefined/operators/map-result-err.mts +1 -1
  186. package/src/core/predefined/operators/map-result-ok.mts +1 -1
  187. package/src/core/types/observable-family.mts +12 -11
  188. package/src/core/types/observable.mts +5 -7
  189. package/src/core/types/types.mts +2 -1
  190. package/src/core/utils/max-depth.mts +5 -1
  191. package/src/core/utils/utils.mts +1 -1
  192. package/src/utils/create-boolean-state.mts +1 -1
  193. package/src/utils/create-reducer.mts +1 -1
  194. 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="./assets/synstate-logo.png" alt="SynState Logo" width="400" />
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
  [![npm version](https://img.shields.io/npm/v/synstate.svg)](https://www.npmjs.com/package/synstate)
10
10
  [![npm downloads](https://img.shields.io/npm/dm/synstate.svg)](https://www.npmjs.com/package/synstate)
11
- [![License](https://img.shields.io/npm/l/synstate.svg)](./LICENSE)
12
- [![codecov](https://codecov.io/gh/noshiro-pf/synstate/graph/badge.svg)](https://codecov.io/gh/noshiro-pf/synstate)
11
+ [![License](https://img.shields.io/npm/l/synstate.svg)](https://github.com/noshiro-pf/mono/blob/main/libs/synstate/LICENSE)
12
+ [![codecov](https://codecov.io/gh/noshiro-pf/mono/graph/badge.svg)](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?"](./documents/how-synstate-solved-the-glitch.md).
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.5 kB min+gzip<!-- /bundle-size:synstate --> with only one external runtime dependency ([ts-data-forge](https://www.npmjs.com/package/ts-data-forge))
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?"](./documents/how-synstate-solved-the-glitch.md).
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
- ...todos,
339
- {
340
- id: Date.now(),
341
- text: action.text,
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[]) => [...items, item]);
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](./LICENSE).
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":"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"}
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
- if (mut_inPath.has(node.id))
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
- if (mut_visited.has(node.id))
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
- mut_inPath.delete(node.id);
29
- return false;
19
+ }
20
+ mut_inPath.delete(node.id);
21
+ return false;
30
22
  };
31
23
  const detectCircularDependency = (child, parents) => {
32
- const mut_visited = new Set();
33
- const mut_inPath = new Set([child.id]);
34
- for (const parent of parents) {
35
- if (hasCircularDependencyFrom(parent, mut_visited, mut_inPath)) {
36
- throw new Error('Circular dependency detected in observable graph: a child observable cannot be its own ancestor.');
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
- detectCircularDependency(child, parents);
42
- for (const p of parents) {
43
- p.addChild(child);
44
- }
45
- // register child to all reachable ManagerObservables
46
- const mut_rest = Array.from(parents);
47
- while (Arr.isNonEmpty(mut_rest)) {
48
- const p = mut_rest.pop();
49
- if (p === undefined)
50
- break;
51
- if (isManagerObservable(p)) {
52
- p.addDescendant(child);
53
- }
54
- else {
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 = ({ hasSubscriber, hasActiveChild, parents, complete, }) => {
61
- // If there is no working parent node
62
- if (parents.every((r) => r.isCompleted)) {
63
- complete();
64
- return;
65
- }
66
- // If there are no active child node
67
- if (!hasSubscriber && !hasActiveChild) {
68
- complete();
69
- }
70
- // propagate to parents
71
- for (const par of parents) {
72
- par.tryComplete();
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
- parents;
77
- #mut_propagationOrder;
78
- descendantsIdSet;
79
- constructor({ parents, depth = 1 + maxDepth(parents), initialValue, }) {
80
- super({
81
- kind: 'async child',
82
- depth,
83
- initialValue,
84
- });
85
- this.parents = parents;
86
- this.#mut_propagationOrder = [];
87
- this.descendantsIdSet = new Set();
88
- registerChild(this, parents);
89
- }
90
- // overload
91
- addDescendant(child) {
92
- if (this.descendantsIdSet.has(child.id))
93
- return;
94
- this.descendantsIdSet.add(child.id);
95
- const insertPos = binarySearch(this.#mut_propagationOrder.map((a) => a.depth), child.depth);
96
- this.#mut_propagationOrder = Arr.toInserted(this.#mut_propagationOrder, insertPos, child);
97
- }
98
- startUpdate(nextValue) {
99
- const updateToken = issueUpdateToken();
100
- this.setNext(nextValue, updateToken);
101
- for (const p of this.#mut_propagationOrder) {
102
- p.tryUpdate(updateToken);
103
- }
104
- }
105
- complete() {
106
- super.complete();
107
- // propagate to parents
108
- for (const par of this.parents) {
109
- par.tryComplete();
110
- }
111
- }
112
- tryComplete() {
113
- tryComplete({
114
- complete: () => {
115
- this.complete();
116
- },
117
- hasActiveChild: this.hasActiveChild(),
118
- hasSubscriber: this.hasSubscriber,
119
- parents: this.parents,
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
- parents;
125
- constructor({ parents, depth = 1 + maxDepth(parents), initialValue, }) {
126
- super({
127
- kind: 'sync child',
128
- depth,
129
- initialValue,
130
- });
131
- this.parents = parents;
132
- registerChild(this, parents);
133
- }
134
- complete() {
135
- super.complete();
136
- for (const par of this.parents) {
137
- par.tryComplete();
138
- }
139
- }
140
- tryComplete() {
141
- tryComplete({
142
- complete: () => {
143
- this.complete();
144
- },
145
- hasActiveChild: this.hasActiveChild(),
146
- hasSubscriber: this.hasSubscriber,
147
- parents: this.parents,
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
- constructor({ parents, depth = 1 + maxDepth(parents), initialValue, }) {
153
- super({ parents, depth, initialValue });
154
- }
155
- getSnapshot() {
156
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
157
- return super.getCurrentValue();
158
- }
159
- pipe(operator) {
160
- return operator(this);
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;;IAC5B,QAAQ,CAAC,EAAE,yCAAC;IACZ,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;gBAOV,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;IAkBF,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI;IAQ5C,WAAW,IAAI,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAI3D,SAAS,CAAC,eAAe,IAAI,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAIzE,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;IAIzB,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI;IAW/D,SAAS,CAAC,YAAY,EAAE,WAAW,GAAG,IAAI;IAI1C,WAAW,IAAI,IAAI;IAMnB,QAAQ,IAAI,IAAI;IAoBhB,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC;IAC3E,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;IAQhD,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,IAAI,GAAG,YAAY;CAuCzE"}
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"}