synstate 3.0.0 → 3.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 (137) hide show
  1. package/dist/core/base/create-child-observable.mjs +164 -140
  2. package/dist/core/base/create-child-observable.mjs.map +1 -1
  3. package/dist/core/base/create-observable-base.mjs +148 -152
  4. package/dist/core/base/create-observable-base.mjs.map +1 -1
  5. package/dist/core/base/create-root-observable.mjs +48 -34
  6. package/dist/core/base/create-root-observable.mjs.map +1 -1
  7. package/dist/core/base/index.mjs +3 -3
  8. package/dist/core/base/index.mjs.map +1 -1
  9. package/dist/core/combine/combine.mjs +129 -37
  10. package/dist/core/combine/combine.mjs.map +1 -1
  11. package/dist/core/combine/index.mjs +4 -4
  12. package/dist/core/combine/index.mjs.map +1 -1
  13. package/dist/core/combine/merge.mjs +75 -24
  14. package/dist/core/combine/merge.mjs.map +1 -1
  15. package/dist/core/combine/zip.mjs +120 -39
  16. package/dist/core/combine/zip.mjs.map +1 -1
  17. package/dist/core/create/counter.mjs +81 -45
  18. package/dist/core/create/counter.mjs.map +1 -1
  19. package/dist/core/create/from-abortable-promise.mjs +63 -38
  20. package/dist/core/create/from-abortable-promise.mjs.map +1 -1
  21. package/dist/core/create/from-promise.mjs +67 -25
  22. package/dist/core/create/from-promise.mjs.map +1 -1
  23. package/dist/core/create/from-subscribable.mjs +70 -26
  24. package/dist/core/create/from-subscribable.mjs.map +1 -1
  25. package/dist/core/create/index.mjs +8 -8
  26. package/dist/core/create/index.mjs.map +1 -1
  27. package/dist/core/create/just.mjs +36 -13
  28. package/dist/core/create/just.mjs.map +1 -1
  29. package/dist/core/create/source.mjs +15 -19
  30. package/dist/core/create/source.mjs.map +1 -1
  31. package/dist/core/create/timer.mjs +66 -37
  32. package/dist/core/create/timer.mjs.map +1 -1
  33. package/dist/core/index.mjs +6 -41
  34. package/dist/core/index.mjs.map +1 -1
  35. package/dist/core/operators/audit.mjs +126 -39
  36. package/dist/core/operators/audit.mjs.map +1 -1
  37. package/dist/core/operators/debounce.mjs +114 -37
  38. package/dist/core/operators/debounce.mjs.map +1 -1
  39. package/dist/core/operators/filter.mjs +39 -24
  40. package/dist/core/operators/filter.mjs.map +1 -1
  41. package/dist/core/operators/index.mjs +18 -18
  42. package/dist/core/operators/index.mjs.map +1 -1
  43. package/dist/core/operators/map.mjs +74 -26
  44. package/dist/core/operators/map.mjs.map +1 -1
  45. package/dist/core/operators/merge-map.mjs +128 -35
  46. package/dist/core/operators/merge-map.mjs.map +1 -1
  47. package/dist/core/operators/pairwise.mjs +73 -23
  48. package/dist/core/operators/pairwise.mjs.map +1 -1
  49. package/dist/core/operators/scan.mjs +59 -15
  50. package/dist/core/operators/scan.mjs.map +1 -1
  51. package/dist/core/operators/skip-if-no-change.mjs +89 -31
  52. package/dist/core/operators/skip-if-no-change.mjs.map +1 -1
  53. package/dist/core/operators/skip-until.mjs +71 -29
  54. package/dist/core/operators/skip-until.mjs.map +1 -1
  55. package/dist/core/operators/skip-while.mjs +79 -27
  56. package/dist/core/operators/skip-while.mjs.map +1 -1
  57. package/dist/core/operators/switch-map.mjs +118 -31
  58. package/dist/core/operators/switch-map.mjs.map +1 -1
  59. package/dist/core/operators/take-until.mjs +70 -35
  60. package/dist/core/operators/take-until.mjs.map +1 -1
  61. package/dist/core/operators/take-while.mjs +97 -25
  62. package/dist/core/operators/take-while.mjs.map +1 -1
  63. package/dist/core/operators/throttle.mjs +108 -38
  64. package/dist/core/operators/throttle.mjs.map +1 -1
  65. package/dist/core/operators/with-buffered-from.mjs +94 -47
  66. package/dist/core/operators/with-buffered-from.mjs.map +1 -1
  67. package/dist/core/operators/with-current-value-from.mjs +78 -23
  68. package/dist/core/operators/with-current-value-from.mjs.map +1 -1
  69. package/dist/core/operators/with-initial-value.mjs +64 -14
  70. package/dist/core/operators/with-initial-value.mjs.map +1 -1
  71. package/dist/core/predefined/index.mjs +2 -12
  72. package/dist/core/predefined/index.mjs.map +1 -1
  73. package/dist/core/predefined/operators/attach-index.mjs +55 -7
  74. package/dist/core/predefined/operators/attach-index.mjs.map +1 -1
  75. package/dist/core/predefined/operators/index.mjs +12 -12
  76. package/dist/core/predefined/operators/index.mjs.map +1 -1
  77. package/dist/core/predefined/operators/map-optional.mjs +48 -5
  78. package/dist/core/predefined/operators/map-optional.mjs.map +1 -1
  79. package/dist/core/predefined/operators/map-result-err.mjs +48 -5
  80. package/dist/core/predefined/operators/map-result-err.mjs.map +1 -1
  81. package/dist/core/predefined/operators/map-result-ok.mjs +48 -5
  82. package/dist/core/predefined/operators/map-result-ok.mjs.map +1 -1
  83. package/dist/core/predefined/operators/map-to.mjs +41 -6
  84. package/dist/core/predefined/operators/map-to.mjs.map +1 -1
  85. package/dist/core/predefined/operators/pluck.mjs +45 -7
  86. package/dist/core/predefined/operators/pluck.mjs.map +1 -1
  87. package/dist/core/predefined/operators/skip.mjs +49 -6
  88. package/dist/core/predefined/operators/skip.mjs.map +1 -1
  89. package/dist/core/predefined/operators/take.mjs +42 -6
  90. package/dist/core/predefined/operators/take.mjs.map +1 -1
  91. package/dist/core/predefined/operators/unwrap-optional.mjs +43 -8
  92. package/dist/core/predefined/operators/unwrap-optional.mjs.map +1 -1
  93. package/dist/core/predefined/operators/unwrap-result-err.mjs +41 -5
  94. package/dist/core/predefined/operators/unwrap-result-err.mjs.map +1 -1
  95. package/dist/core/predefined/operators/unwrap-result-ok.mjs +43 -8
  96. package/dist/core/predefined/operators/unwrap-result-ok.mjs.map +1 -1
  97. package/dist/core/types/id.mjs +2 -2
  98. package/dist/core/types/id.mjs.map +1 -1
  99. package/dist/core/types/index.mjs +7 -3
  100. package/dist/core/types/index.mjs.map +1 -1
  101. package/dist/core/types/observable-family.mjs +14 -2
  102. package/dist/core/types/observable-family.mjs.map +1 -1
  103. package/dist/core/types/observable-kind.mjs +2 -2
  104. package/dist/core/types/observable-kind.mjs.map +1 -1
  105. package/dist/core/types/observable.mjs +14 -6
  106. package/dist/core/types/observable.mjs.map +1 -1
  107. package/dist/core/types/timer.mjs +2 -2
  108. package/dist/core/types/timer.mjs.map +1 -1
  109. package/dist/core/types/types.mjs +9 -2
  110. package/dist/core/types/types.mjs.map +1 -1
  111. package/dist/core/utils/id-maker.mjs +10 -11
  112. package/dist/core/utils/id-maker.mjs.map +1 -1
  113. package/dist/core/utils/index.mjs +5 -5
  114. package/dist/core/utils/index.mjs.map +1 -1
  115. package/dist/core/utils/max-depth.mjs +7 -4
  116. package/dist/core/utils/max-depth.mjs.map +1 -1
  117. package/dist/core/utils/observable-utils.mjs +4 -7
  118. package/dist/core/utils/observable-utils.mjs.map +1 -1
  119. package/dist/core/utils/utils.mjs +32 -28
  120. package/dist/core/utils/utils.mjs.map +1 -1
  121. package/dist/entry-point.mjs +2 -46
  122. package/dist/entry-point.mjs.map +1 -1
  123. package/dist/index.mjs +3 -46
  124. package/dist/index.mjs.map +1 -1
  125. package/dist/utils/collect-to-array.mjs +8 -13
  126. package/dist/utils/collect-to-array.mjs.map +1 -1
  127. package/dist/utils/create-boolean-state.mjs +47 -22
  128. package/dist/utils/create-boolean-state.mjs.map +1 -1
  129. package/dist/utils/create-event-emitter.mjs +67 -19
  130. package/dist/utils/create-event-emitter.mjs.map +1 -1
  131. package/dist/utils/create-reducer.mjs +54 -16
  132. package/dist/utils/create-reducer.mjs.map +1 -1
  133. package/dist/utils/create-state.mjs +54 -27
  134. package/dist/utils/create-state.mjs.map +1 -1
  135. package/dist/utils/index.mjs +6 -6
  136. package/dist/utils/index.mjs.map +1 -1
  137. package/package.json +11 -12
@@ -1,157 +1,181 @@
1
1
  import { Arr } from 'ts-data-forge';
2
- import { isManagerObservable, isChildObservable } from '../types/observable.mjs';
3
- import '../utils/id-maker.mjs';
4
- import { maxDepth } from '../utils/max-depth.mjs';
5
- import { createObservableBaseHandle, createManagerObservableParts, assembleObservable } from './create-observable-base.mjs';
6
-
7
- const createSyncChildObservable = ({
8
- parents,
9
- depth = 1 + maxDepth(parents),
10
- initialValue,
11
- onComplete
12
- }, createTryUpdate) => {
13
- const handle = createObservableBaseHandle(initialValue);
14
- const complete = () => {
15
- onComplete?.();
16
- handle.completeBase();
17
- for (const par of parents) {
18
- par.tryComplete();
19
- }
20
- };
21
- const tryComplete = () => {
22
- tryCompleteChild({
23
- hasSubscriber: handle.hasSubscriber(),
24
- hasActiveChild: handle.hasActiveChild(),
25
- parents,
26
- complete
2
+ import { isChildObservable, isManagerObservable, } from '../types/index.mjs';
3
+ import { maxDepth } from '../utils/index.mjs';
4
+ import { assembleObservable, createManagerObservableParts, createObservableBaseHandle, } from './create-observable-base.mjs';
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+ export const createSyncChildObservable = ({ parents, depth = 1 + maxDepth(parents), initialValue, onComplete, }, createTryUpdate) => {
16
+ const handle = createObservableBaseHandle(initialValue);
17
+ const complete = () => {
18
+ onComplete?.();
19
+ handle.completeBase();
20
+
21
+ for (const par of parents) {
22
+ par.tryComplete();
23
+ }
24
+ };
25
+ const tryComplete = () => {
26
+ tryCompleteChild({
27
+ hasSubscriber: handle.hasSubscriber(),
28
+ hasActiveChild: handle.hasActiveChild(),
29
+ parents,
30
+ complete,
31
+ });
32
+ };
33
+ const tryUpdate = createTryUpdate({
34
+ setNext: handle.setNext,
35
+ getSnapshot: handle.getSnapshot,
36
+ complete,
37
+ });
38
+ const observable = assembleObservable({
39
+ kind: 'sync child',
40
+ depth,
41
+ handle,
42
+ tryUpdate,
43
+ tryComplete,
44
+ complete,
45
+ extra: { parents },
27
46
  });
28
- };
29
- const tryUpdate = createTryUpdate({
30
- setNext: handle.setNext,
31
- getSnapshot: handle.getSnapshot,
32
- complete
33
- });
34
- const observable = assembleObservable({
35
- kind: "sync child",
36
- depth,
37
- handle,
38
- tryUpdate,
39
- tryComplete,
40
- complete,
41
- extra: { parents }
42
- });
43
- registerChild(observable, parents);
44
- return observable;
47
+ registerChild(observable, parents);
48
+ return observable;
45
49
  };
46
- const createInitializedSyncChildObservable = (config, createTryUpdate) => {
47
- const observable = createSyncChildObservable(config, createTryUpdate);
48
- return (
49
- // `getSnapshot` always returns `Some` here: `initialValue` is a `Some` and
50
- // `setNext` only ever stores a `Some`.
51
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
52
- observable
53
- );
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+ export const createInitializedSyncChildObservable = (config, createTryUpdate) => {
58
+ const observable = createSyncChildObservable(config, createTryUpdate);
59
+ return (
60
+
61
+
62
+
63
+ observable);
54
64
  };
55
- const createAsyncChildObservable = ({
56
- parents,
57
- depth = 1 + maxDepth(parents),
58
- initialValue,
59
- onComplete
60
- }, createTryUpdate) => {
61
- const handle = createObservableBaseHandle(initialValue);
62
- const { addDescendant, startUpdate } = createManagerObservableParts(handle);
63
- const complete = () => {
64
- onComplete?.();
65
- handle.completeBase();
66
- for (const par of parents) {
67
- par.tryComplete();
68
- }
69
- };
70
- const tryComplete = () => {
71
- tryCompleteChild({
72
- hasSubscriber: handle.hasSubscriber(),
73
- hasActiveChild: handle.hasActiveChild(),
74
- parents,
75
- complete
65
+
66
+
67
+
68
+
69
+
70
+ export const createAsyncChildObservable = ({ parents, depth = 1 + maxDepth(parents), initialValue, onComplete, }, createTryUpdate) => {
71
+ const handle = createObservableBaseHandle(initialValue);
72
+ const { addDescendant, startUpdate } = createManagerObservableParts(handle);
73
+ const complete = () => {
74
+ onComplete?.();
75
+ handle.completeBase();
76
+
77
+ for (const par of parents) {
78
+ par.tryComplete();
79
+ }
80
+ };
81
+ const tryComplete = () => {
82
+ tryCompleteChild({
83
+ hasSubscriber: handle.hasSubscriber(),
84
+ hasActiveChild: handle.hasActiveChild(),
85
+ parents,
86
+ complete,
87
+ });
88
+ };
89
+ const tryUpdate = createTryUpdate({
90
+ setNext: handle.setNext,
91
+ getSnapshot: handle.getSnapshot,
92
+ complete,
93
+ startUpdate,
94
+ });
95
+ const observable = assembleObservable({
96
+ kind: 'async child',
97
+ depth,
98
+ handle,
99
+ tryUpdate,
100
+ tryComplete,
101
+ complete,
102
+ extra: { parents, addDescendant },
76
103
  });
77
- };
78
- const tryUpdate = createTryUpdate({
79
- setNext: handle.setNext,
80
- getSnapshot: handle.getSnapshot,
81
- complete,
82
- startUpdate
83
- });
84
- const observable = assembleObservable({
85
- kind: "async child",
86
- depth,
87
- handle,
88
- tryUpdate,
89
- tryComplete,
90
- complete,
91
- extra: { parents, addDescendant }
92
- });
93
- registerChild(observable, parents);
94
- return observable;
104
+ registerChild(observable, parents);
105
+ return observable;
95
106
  };
107
+
108
+
109
+
110
+
111
+
112
+
113
+
96
114
  const hasCircularDependencyFrom = (node, mut_visited, mut_inPath) => {
97
- if (mut_inPath.has(node.id)) return true;
98
- if (mut_visited.has(node.id)) return false;
99
- mut_visited.add(node.id);
100
- mut_inPath.add(node.id);
101
- if (isChildObservable(node)) {
102
- for (const parent of node.parents) {
103
- if (hasCircularDependencyFrom(parent, mut_visited, mut_inPath)) {
115
+ if (mut_inPath.has(node.id))
104
116
  return true;
105
- }
117
+ if (mut_visited.has(node.id))
118
+ return false;
119
+ mut_visited.add(node.id);
120
+ mut_inPath.add(node.id);
121
+ if (isChildObservable(node)) {
122
+ for (const parent of node.parents) {
123
+ if (hasCircularDependencyFrom(parent, mut_visited, mut_inPath)) {
124
+ return true;
125
+ }
126
+ }
106
127
  }
107
- }
108
- mut_inPath.delete(node.id);
109
- return false;
128
+ mut_inPath.delete(node.id);
129
+ return false;
110
130
  };
111
131
  const detectCircularDependency = (child, parents) => {
112
- const mut_visited = /* @__PURE__ */ new Set();
113
- const mut_inPath = /* @__PURE__ */ new Set([child.id]);
114
- for (const parent of parents) {
115
- if (hasCircularDependencyFrom(parent, mut_visited, mut_inPath)) {
116
- throw new Error(
117
- "Circular dependency detected in observable graph: a child observable cannot be its own ancestor."
118
- );
132
+ const mut_visited = new Set();
133
+ const mut_inPath = new Set([child.id]);
134
+ for (const parent of parents) {
135
+ if (hasCircularDependencyFrom(parent, mut_visited, mut_inPath)) {
136
+ throw new Error('Circular dependency detected in observable graph: a child observable cannot be its own ancestor.');
137
+ }
119
138
  }
120
- }
121
139
  };
140
+
141
+
142
+
143
+
144
+
145
+
122
146
  const registerChild = (child, parents) => {
123
- detectCircularDependency(child, parents);
124
- for (const p of parents) {
125
- p.addChild(child);
126
- }
127
- const mut_rest = Array.from(parents);
128
- while (Arr.isNonEmpty(mut_rest)) {
129
- const p = mut_rest.pop();
130
- if (p === void 0) break;
131
- if (isManagerObservable(p)) {
132
- p.addDescendant(child);
133
- } else {
134
- mut_rest.push(...p.parents);
147
+ detectCircularDependency(child, parents);
148
+ for (const p of parents) {
149
+ p.addChild(child);
150
+ }
151
+
152
+ const mut_rest = Array.from(parents);
153
+ while (Arr.isNonEmpty(mut_rest)) {
154
+ const p = mut_rest.pop();
155
+ if (p === undefined)
156
+ break;
157
+ if (isManagerObservable(p)) {
158
+ p.addDescendant(child);
159
+ }
160
+ else {
161
+
162
+ mut_rest.push(...p.parents);
163
+ }
135
164
  }
136
- }
137
- };
138
- const tryCompleteChild = ({
139
- hasSubscriber,
140
- hasActiveChild,
141
- parents,
142
- complete
143
- }) => {
144
- if (parents.every((r) => r.isCompleted)) {
145
- complete();
146
- return;
147
- }
148
- if (!hasSubscriber && !hasActiveChild) {
149
- complete();
150
- }
151
- for (const par of parents) {
152
- par.tryComplete();
153
- }
154
165
  };
166
+ const tryCompleteChild = ({ hasSubscriber, hasActiveChild, parents, complete, }) => {
155
167
 
156
- export { createAsyncChildObservable, createInitializedSyncChildObservable, createSyncChildObservable };
157
- //# sourceMappingURL=create-child-observable.mjs.map
168
+ if (parents.every((r) => r.isCompleted)) {
169
+ complete();
170
+ return;
171
+ }
172
+
173
+ if (!hasSubscriber && !hasActiveChild) {
174
+ complete();
175
+ }
176
+
177
+ for (const par of parents) {
178
+ par.tryComplete();
179
+ }
180
+ };
181
+ //# sourceMappingURL=create-child-observable.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-child-observable.mjs","sources":["../../../src/core/base/create-child-observable.mts"],"sourcesContent":["import { Arr, type Optional, 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 InitializedSyncChildObservable,\n type NonEmptyUnknownList,\n type Observable,\n type ObservableId,\n type SyncChildObservable,\n type UpdateToken,\n type Wrap,\n} from '../types/index.mjs';\nimport { maxDepth } from '../utils/index.mjs';\nimport {\n assembleObservable,\n createManagerObservableParts,\n createObservableBaseHandle,\n} from './create-observable-base.mjs';\n\n/**\n * The internal tools a sync-child leaf factory (`map`, `filter`, `zip`, …)\n * receives — the replacement for the `protected` methods a subclass of\n * `SyncChildObservableClass` used to inherit.\n */\nexport type SyncChildObservableTools<A> = Readonly<{\n /** Emits `nextValue` under `updateToken` and notifies subscribers. */\n setNext: (nextValue: A, updateToken: UpdateToken) => void;\n\n getSnapshot: () => Optional<A>;\n\n /** Completes this observable (leaf teardown included). */\n complete: () => void;\n}>;\n\n/**\n * The internal tools an async-child leaf factory (`debounce`, `switchMap`, …)\n * receives. Async children additionally start their own update propagation.\n */\nexport type AsyncChildObservableTools<A> = Readonly<{\n /** Emits `nextValue` and propagates the update to all descendants. */\n startUpdate: (nextValue: A) => void;\n}> &\n SyncChildObservableTools<A>;\n\ntype ChildObservableConfigBase<P extends NonEmptyUnknownList> = Readonly<{\n parents: Wrap<P>;\n\n depth?: number;\n\n /**\n * Leaf teardown (clear timers, unsubscribe inner observables, …), run at\n * the beginning of `complete()` — the closure replacement for\n * `override complete() { teardown(); super.complete(); }`.\n */\n onComplete?: () => void;\n}>;\n\nexport type ChildObservableConfig<\n A,\n P extends NonEmptyUnknownList,\n> = ChildObservableConfigBase<P> &\n Readonly<{\n initialValue: Optional<A>;\n }>;\n\nexport type InitializedChildObservableConfig<\n A,\n P extends NonEmptyUnknownList,\n> = ChildObservableConfigBase<P> &\n Readonly<{\n initialValue: Some<A>;\n }>;\n\n/**\n * Creates a sync-child observable — the classless replacement for extending\n * `SyncChildObservableClass`.\n *\n * `createTryUpdate` receives the internal tools and returns the `tryUpdate`\n * implementation (the former `override tryUpdate`). It runs during\n * construction, before the observable is registered to its parents; leaf\n * state can live either in the enclosing factory scope or inside the\n * `createTryUpdate` closure.\n */\nexport const createSyncChildObservable = <A, P extends NonEmptyUnknownList>(\n {\n parents,\n depth = 1 + maxDepth(parents),\n initialValue,\n onComplete,\n }: ChildObservableConfig<A, P>,\n createTryUpdate: (\n tools: SyncChildObservableTools<A>,\n ) => (updateToken: UpdateToken) => void,\n): SyncChildObservable<A, P> => {\n const handle = createObservableBaseHandle<A>(initialValue);\n\n const complete = (): void => {\n onComplete?.();\n\n handle.completeBase();\n\n // propagate to parents\n for (const par of parents) {\n par.tryComplete();\n }\n };\n\n const tryComplete = (): void => {\n tryCompleteChild({\n hasSubscriber: handle.hasSubscriber(),\n hasActiveChild: handle.hasActiveChild(),\n parents,\n complete,\n });\n };\n\n const tryUpdate = createTryUpdate({\n setNext: handle.setNext,\n getSnapshot: handle.getSnapshot,\n complete,\n });\n\n const observable: SyncChildObservable<A, P> = assembleObservable({\n kind: 'sync child',\n depth,\n handle,\n tryUpdate,\n tryComplete,\n complete,\n extra: { parents },\n });\n\n registerChild(observable, parents);\n\n return observable;\n};\n\n/**\n * Creates a sync-child observable that always holds a value.\n *\n * Runtime-wise this is exactly `createSyncChildObservable`; only the types of\n * `getSnapshot` and `pipe` are narrowed, which is what the\n * `InitializedSyncChildObservableClass` overrides existed for.\n */\nexport const createInitializedSyncChildObservable = <\n A,\n P extends NonEmptyUnknownList,\n>(\n config: InitializedChildObservableConfig<A, P>,\n createTryUpdate: (\n tools: SyncChildObservableTools<A>,\n ) => (updateToken: UpdateToken) => void,\n): InitializedSyncChildObservable<A, P> => {\n const observable = createSyncChildObservable<A, P>(config, createTryUpdate);\n\n return (\n // `getSnapshot` always returns `Some` here: `initialValue` is a `Some` and\n // `setNext` only ever stores a `Some`.\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n observable as InitializedSyncChildObservable<A, P>\n );\n};\n\n/**\n * Creates an async-child observable — the classless replacement for extending\n * `AsyncChildObservableClass`. See {@link createSyncChildObservable} for the\n * `createTryUpdate` contract.\n */\nexport const createAsyncChildObservable = <A, P extends NonEmptyUnknownList>(\n {\n parents,\n depth = 1 + maxDepth(parents),\n initialValue,\n onComplete,\n }: ChildObservableConfig<A, P>,\n createTryUpdate: (\n tools: AsyncChildObservableTools<A>,\n ) => (updateToken: UpdateToken) => void,\n): AsyncChildObservable<A, P> => {\n const handle = createObservableBaseHandle<A>(initialValue);\n\n const { addDescendant, startUpdate } = createManagerObservableParts(handle);\n\n const complete = (): void => {\n onComplete?.();\n\n handle.completeBase();\n\n // propagate to parents\n for (const par of parents) {\n par.tryComplete();\n }\n };\n\n const tryComplete = (): void => {\n tryCompleteChild({\n hasSubscriber: handle.hasSubscriber(),\n hasActiveChild: handle.hasActiveChild(),\n parents,\n complete,\n });\n };\n\n const tryUpdate = createTryUpdate({\n setNext: handle.setNext,\n getSnapshot: handle.getSnapshot,\n complete,\n startUpdate,\n });\n\n const observable: AsyncChildObservable<A, P> = assembleObservable({\n kind: 'async child',\n depth,\n handle,\n tryUpdate,\n tryComplete,\n complete,\n extra: { parents, addDescendant },\n });\n\n registerChild(observable, parents);\n\n return observable;\n};\n\n/* helpers */\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\n/**\n * Registers `child` to its parents and to all reachable manager observables.\n * Runs after the child object is fully assembled, so parents only ever hold a\n * reference to the final composed object (the class version registered `this`\n * from inside the constructor instead).\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 tryCompleteChild = <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"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-child-observable.mjs","sourceRoot":"","sources":["../../../src/core/base/create-child-observable.mts"],"names":[],"mappings":"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"}
@@ -1,160 +1,156 @@
1
1
  import { Arr, Optional } from 'ts-data-forge';
2
- import { issueObservableId, issueUpdateToken, issueSubscriberId } from '../utils/id-maker.mjs';
3
- import { toSubscriber } from '../utils/observable-utils.mjs';
4
- import { binarySearch } from '../utils/utils.mjs';
5
-
6
- const createObservableBaseHandle = (initialValue) => {
7
- const id = issueObservableId();
8
- let mut_children = [];
9
- const mut_subscribers = /* @__PURE__ */ new Map();
10
- let mut_currentValue = initialValue;
11
- let mut_isCompleted = false;
12
- let mut_updateToken = issueUpdateToken();
13
- const addSubscriber = (s) => {
14
- const subscriberId = issueSubscriberId();
15
- mut_subscribers.set(subscriberId, s);
16
- return subscriberId;
17
- };
18
- const removeSubscriber = (subscriberId) => {
19
- mut_subscribers.delete(subscriberId);
20
- };
21
- const addChild = (child) => {
22
- mut_children = Arr.toPushed(
23
- mut_children,
24
- child
25
- );
26
- };
27
- const getSnapshot = () => mut_currentValue;
28
- const isCompleted = () => mut_isCompleted;
29
- const updateToken = () => mut_updateToken;
30
- const hasSubscriber = () => mut_subscribers.size > 0;
31
- const hasChild = () => Arr.isNonEmpty(mut_children);
32
- const hasActiveChild = () => mut_children.some((c) => !c.isCompleted);
33
- const setNext = (nextValue, nextUpdateToken) => {
34
- mut_updateToken = nextUpdateToken;
35
- mut_currentValue = Optional.some(nextValue);
36
- for (const s of mut_subscribers.values()) {
37
- s.onNext(nextValue);
38
- }
39
- };
40
- const completeBase = () => {
41
- if (mut_isCompleted) return;
42
- mut_isCompleted = true;
43
- for (const s of mut_subscribers.values()) {
44
- s.onComplete();
45
- }
46
- mut_subscribers.clear();
47
- for (const o of mut_children) {
48
- o.tryComplete();
49
- }
50
- };
51
- const subscribe = (onNext, onComplete) => {
52
- const curr = getSnapshot();
53
- if (Optional.isSome(curr)) {
54
- onNext(curr.value);
55
- }
56
- if (mut_isCompleted) {
57
- if (onComplete !== void 0) {
58
- onComplete();
59
- }
60
- return { unsubscribe: () => {
61
- } };
62
- }
63
- const subscriberId = addSubscriber(
64
- toSubscriber(onNext, onComplete)
65
- );
2
+ import { binarySearch, issueObservableId, issueSubscriberId, issueUpdateToken, toSubscriber, } from '../utils/index.mjs';
3
+ export const createObservableBaseHandle = (initialValue) => {
4
+ const id = issueObservableId();
5
+ let mut_children = [];
6
+ const mut_subscribers = new Map();
7
+ let mut_currentValue = initialValue;
8
+ let mut_isCompleted = false;
9
+ let mut_updateToken = issueUpdateToken();
10
+ const addSubscriber = (s) => {
11
+
12
+ const subscriberId = issueSubscriberId();
13
+ mut_subscribers.set(subscriberId, s);
14
+ return subscriberId;
15
+ };
16
+ const removeSubscriber = (subscriberId) => {
17
+ mut_subscribers.delete(subscriberId);
18
+ };
19
+ const addChild = (child) => {
20
+ mut_children = Arr.toPushed(mut_children, child);
21
+ };
22
+ const getSnapshot = () => mut_currentValue;
23
+ const isCompleted = () => mut_isCompleted;
24
+ const updateToken = () => mut_updateToken;
25
+ const hasSubscriber = () => mut_subscribers.size > 0;
26
+ const hasChild = () => Arr.isNonEmpty(mut_children);
27
+ const hasActiveChild = () => mut_children.some((c) => !c.isCompleted);
28
+ const setNext = (nextValue, nextUpdateToken) => {
29
+ mut_updateToken = nextUpdateToken;
30
+ mut_currentValue = Optional.some(nextValue);
31
+ for (const s of mut_subscribers.values()) {
32
+ s.onNext(nextValue);
33
+ }
34
+ };
35
+ const completeBase = () => {
36
+ if (mut_isCompleted)
37
+ return;
38
+
39
+ mut_isCompleted = true;
40
+
41
+ for (const s of mut_subscribers.values()) {
42
+ s.onComplete();
43
+ }
44
+
45
+ mut_subscribers.clear();
46
+
47
+ for (const o of mut_children) {
48
+ o.tryComplete();
49
+ }
50
+ };
51
+ const subscribe = (onNext, onComplete) => {
52
+
53
+ const curr = getSnapshot();
54
+ if (Optional.isSome(curr)) {
55
+ onNext(curr.value);
56
+ }
57
+ if (mut_isCompleted) {
58
+ if (onComplete !== undefined) {
59
+ onComplete();
60
+ }
61
+ return { unsubscribe: () => { } };
62
+ }
63
+ const subscriberId = addSubscriber(toSubscriber(onNext, onComplete));
64
+ return {
65
+ unsubscribe: () => {
66
+ removeSubscriber(subscriberId);
67
+ },
68
+ };
69
+ };
66
70
  return {
67
- unsubscribe: () => {
68
- removeSubscriber(subscriberId);
69
- }
71
+ id,
72
+ addChild,
73
+ getSnapshot,
74
+ isCompleted,
75
+ updateToken,
76
+ hasSubscriber,
77
+ hasChild,
78
+ hasActiveChild,
79
+ subscribe,
80
+ setNext,
81
+ completeBase,
70
82
  };
71
- };
72
- return {
73
- id,
74
- addChild,
75
- getSnapshot,
76
- isCompleted,
77
- updateToken,
78
- hasSubscriber,
79
- hasChild,
80
- hasActiveChild,
81
- subscribe,
82
- setNext,
83
- completeBase
84
- };
85
83
  };
86
- const createManagerObservableParts = (handle) => {
87
- let mut_propagationOrder = [];
88
- const mut_descendantsIdSet = /* @__PURE__ */ new Set();
89
- const addDescendant = (child) => {
90
- if (mut_descendantsIdSet.has(child.id)) return;
91
- mut_descendantsIdSet.add(child.id);
92
- const insertPos = binarySearch(
93
- mut_propagationOrder.map((a) => a.depth),
94
- child.depth
95
- );
96
- mut_propagationOrder = Arr.toInserted(
97
- mut_propagationOrder,
98
- insertPos,
99
- child
100
- );
101
- };
102
- const startUpdate = (nextValue) => {
103
- const updateToken = issueUpdateToken();
104
- handle.setNext(nextValue, updateToken);
105
- for (const p of mut_propagationOrder) {
106
- p.tryUpdate(updateToken);
107
- }
108
- };
109
- return { addDescendant, startUpdate };
84
+
85
+
86
+
87
+
88
+
89
+
90
+
91
+ export const createManagerObservableParts = (handle) => {
92
+ let mut_propagationOrder = [];
93
+ const mut_descendantsIdSet = new Set();
94
+ const addDescendant = (child) => {
95
+ if (mut_descendantsIdSet.has(child.id))
96
+ return;
97
+ mut_descendantsIdSet.add(child.id);
98
+ const insertPos = binarySearch(mut_propagationOrder.map((a) => a.depth), child.depth);
99
+ mut_propagationOrder = Arr.toInserted(mut_propagationOrder, insertPos, child);
100
+ };
101
+ const startUpdate = (nextValue) => {
102
+ const updateToken = issueUpdateToken();
103
+ handle.setNext(nextValue, updateToken);
104
+ for (const p of mut_propagationOrder) {
105
+ p.tryUpdate(updateToken);
106
+ }
107
+ };
108
+ return { addDescendant, startUpdate };
110
109
  };
111
- const createTryUpdateNotImplemented = () => tryUpdateNotImplemented;
110
+
111
+ export const createTryUpdateNotImplemented = () => tryUpdateNotImplemented;
112
112
  const tryUpdateNotImplemented = (_updateToken) => {
113
- throw new Error("not implemented");
114
- };
115
- const assembleObservable = ({
116
- kind,
117
- depth,
118
- handle,
119
- tryUpdate,
120
- tryComplete,
121
- complete,
122
- extra
123
- }) => {
124
- function pipe(operator) {
125
- return operator(
126
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
127
- observable
128
- );
129
- }
130
- const observable = {
131
- ...extra,
132
- id: handle.id,
133
- kind,
134
- depth,
135
- addChild: handle.addChild,
136
- getSnapshot: handle.getSnapshot,
137
- get isCompleted() {
138
- return handle.isCompleted();
139
- },
140
- get updateToken() {
141
- return handle.updateToken();
142
- },
143
- get hasSubscriber() {
144
- return handle.hasSubscriber();
145
- },
146
- get hasChild() {
147
- return handle.hasChild();
148
- },
149
- hasActiveChild: handle.hasActiveChild,
150
- tryUpdate,
151
- tryComplete,
152
- complete,
153
- subscribe: handle.subscribe,
154
- pipe
155
- };
156
- return observable;
113
+ throw new Error('not implemented');
157
114
  };
158
115
 
159
- export { assembleObservable, createManagerObservableParts, createObservableBaseHandle, createTryUpdateNotImplemented };
160
- //# sourceMappingURL=create-observable-base.mjs.map
116
+
117
+
118
+
119
+
120
+
121
+
122
+ export const assembleObservable = ({ kind, depth, handle, tryUpdate, tryComplete, complete, extra, }) => {
123
+ function pipe(operator) {
124
+ return operator(
125
+
126
+ observable);
127
+ }
128
+ const observable = {
129
+ ...extra,
130
+ id: handle.id,
131
+ kind,
132
+ depth,
133
+ addChild: handle.addChild,
134
+ getSnapshot: handle.getSnapshot,
135
+ get isCompleted() {
136
+ return handle.isCompleted();
137
+ },
138
+ get updateToken() {
139
+ return handle.updateToken();
140
+ },
141
+ get hasSubscriber() {
142
+ return handle.hasSubscriber();
143
+ },
144
+ get hasChild() {
145
+ return handle.hasChild();
146
+ },
147
+ hasActiveChild: handle.hasActiveChild,
148
+ tryUpdate,
149
+ tryComplete,
150
+ complete,
151
+ subscribe: handle.subscribe,
152
+ pipe,
153
+ };
154
+ return observable;
155
+ };
156
+ //# sourceMappingURL=create-observable-base.mjs.map