synstate 1.0.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/README.md +9 -10
  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 +13 -14
  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
@@ -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 -->~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
@@ -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
@@ -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"}
@@ -3,113 +3,117 @@ import { issueObservableId, issueUpdateToken, issueSubscriberId } from '../utils
3
3
  import { toSubscriber } from '../utils/observable-utils.mjs';
4
4
 
5
5
  class ObservableBaseClass {
6
- id;
7
- kind;
8
- depth;
9
- #mut_children;
10
- #subscribers;
11
- #mut_currentValue;
12
- #mut_isCompleted;
13
- #mut_updateToken;
14
- constructor({ kind, depth, initialValue, }) {
15
- this.kind = kind;
16
- this.depth = depth;
17
- this.id = issueObservableId();
18
- this.#mut_currentValue = initialValue;
19
- this.#mut_children = [];
20
- this.#subscribers = new Map();
21
- this.#mut_isCompleted = false;
22
- this.#mut_updateToken = issueUpdateToken();
23
- }
24
- addChild(child) {
25
- this.#mut_children = Arr.toPushed(this.#mut_children, child);
26
- }
27
- getSnapshot() {
28
- return this.#mut_currentValue;
29
- }
30
- getCurrentValue() {
31
- return this.#mut_currentValue;
32
- }
33
- get isCompleted() {
34
- return this.#mut_isCompleted;
35
- }
36
- get updateToken() {
37
- return this.#mut_updateToken;
38
- }
39
- get hasSubscriber() {
40
- return this.#subscribers.size > 0;
41
- }
42
- get hasChild() {
43
- return Arr.isNonEmpty(this.#mut_children);
44
- }
45
- hasActiveChild() {
46
- return this.#mut_children.some((c) => !c.isCompleted);
47
- }
48
- setNext(nextValue, updateToken) {
49
- this.#mut_updateToken = updateToken;
50
- this.#mut_currentValue = Optional.some(nextValue);
51
- for (const s of this.#subscribers.values()) {
52
- s.onNext(nextValue);
53
- }
54
- }
55
- // eslint-disable-next-line @typescript-eslint/class-methods-use-this
56
- tryUpdate(_updateToken) {
57
- throw new Error('not implemented');
58
- }
59
- tryComplete() {
60
- if (!this.hasSubscriber && !this.hasActiveChild()) {
61
- this.complete();
62
- }
63
- }
64
- complete() {
65
- if (this.isCompleted)
66
- return; // terminate only once
67
- // change state
68
- this.#mut_isCompleted = true;
69
- // run subscribers for the current value
70
- for (const s of this.#subscribers.values()) {
71
- s.onComplete();
72
- }
73
- // remove all subscribers
74
- this.#subscribers.clear();
75
- // propagate to children
76
- for (const o of this.#mut_children) {
77
- o.tryComplete();
78
- }
79
- }
80
- pipe(operator) {
81
- return operator(
82
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
83
- this);
84
- }
85
- subscribe(onNext, onComplete) {
86
- // first emit
87
- const curr = this.getSnapshot();
88
- if (Optional.isSome(curr)) {
89
- onNext(curr.value);
90
- }
91
- if (this.isCompleted) {
92
- if (onComplete !== undefined) {
93
- onComplete();
94
- }
95
- return { unsubscribe: () => { } };
96
- }
97
- const id = this.#addSubscriber(toSubscriber(onNext, onComplete));
98
- return {
99
- unsubscribe: () => {
100
- this.#removeSubscriber(id);
101
- },
102
- };
103
- }
104
- #addSubscriber(s) {
105
- // return the id of added subscriber
106
- const id = issueSubscriberId();
107
- this.#subscribers.set(id, s);
108
- return id;
109
- }
110
- #removeSubscriber(id) {
111
- this.#subscribers.delete(id);
112
- }
6
+ #mut_children;
7
+ #subscribers;
8
+ #mut_currentValue;
9
+ #mut_isCompleted;
10
+ #mut_updateToken;
11
+ id;
12
+ kind;
13
+ depth;
14
+ constructor({
15
+ kind,
16
+ depth,
17
+ initialValue
18
+ }) {
19
+ this.kind = kind;
20
+ this.depth = depth;
21
+ this.id = issueObservableId();
22
+ this.#mut_currentValue = initialValue;
23
+ this.#mut_children = [];
24
+ this.#subscribers = /* @__PURE__ */ new Map();
25
+ this.#mut_isCompleted = false;
26
+ this.#mut_updateToken = issueUpdateToken();
27
+ }
28
+ #addSubscriber(s) {
29
+ const id = issueSubscriberId();
30
+ this.#subscribers.set(id, s);
31
+ return id;
32
+ }
33
+ #removeSubscriber(id) {
34
+ this.#subscribers.delete(id);
35
+ }
36
+ addChild(child) {
37
+ this.#mut_children = Arr.toPushed(
38
+ this.#mut_children,
39
+ child
40
+ );
41
+ }
42
+ getSnapshot() {
43
+ return this.#mut_currentValue;
44
+ }
45
+ getCurrentValue() {
46
+ return this.#mut_currentValue;
47
+ }
48
+ get isCompleted() {
49
+ return this.#mut_isCompleted;
50
+ }
51
+ get updateToken() {
52
+ return this.#mut_updateToken;
53
+ }
54
+ get hasSubscriber() {
55
+ return this.#subscribers.size > 0;
56
+ }
57
+ get hasChild() {
58
+ return Arr.isNonEmpty(this.#mut_children);
59
+ }
60
+ hasActiveChild() {
61
+ return this.#mut_children.some((c) => !c.isCompleted);
62
+ }
63
+ setNext(nextValue, updateToken) {
64
+ this.#mut_updateToken = updateToken;
65
+ this.#mut_currentValue = Optional.some(nextValue);
66
+ for (const s of this.#subscribers.values()) {
67
+ s.onNext(nextValue);
68
+ }
69
+ }
70
+ // eslint-disable-next-line @typescript-eslint/class-methods-use-this
71
+ tryUpdate(_updateToken) {
72
+ throw new Error("not implemented");
73
+ }
74
+ tryComplete() {
75
+ if (!this.hasSubscriber && !this.hasActiveChild()) {
76
+ this.complete();
77
+ }
78
+ }
79
+ complete() {
80
+ if (this.isCompleted) return;
81
+ this.#mut_isCompleted = true;
82
+ for (const s of this.#subscribers.values()) {
83
+ s.onComplete();
84
+ }
85
+ this.#subscribers.clear();
86
+ for (const o of this.#mut_children) {
87
+ o.tryComplete();
88
+ }
89
+ }
90
+ pipe(operator) {
91
+ return operator(
92
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
93
+ this
94
+ );
95
+ }
96
+ subscribe(onNext, onComplete) {
97
+ const curr = this.getSnapshot();
98
+ if (Optional.isSome(curr)) {
99
+ onNext(curr.value);
100
+ }
101
+ if (this.isCompleted) {
102
+ if (onComplete !== void 0) {
103
+ onComplete();
104
+ }
105
+ return { unsubscribe: () => {
106
+ } };
107
+ }
108
+ const id = this.#addSubscriber(
109
+ toSubscriber(onNext, onComplete)
110
+ );
111
+ return {
112
+ unsubscribe: () => {
113
+ this.#removeSubscriber(id);
114
+ }
115
+ };
116
+ }
113
117
  }
114
118
 
115
119
  export { ObservableBaseClass };