synstate 2.0.1 → 3.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 (161) hide show
  1. package/README.md +2 -2
  2. package/dist/core/base/create-child-observable.d.mts +65 -0
  3. package/dist/core/base/create-child-observable.d.mts.map +1 -0
  4. package/dist/core/base/create-child-observable.mjs +157 -0
  5. package/dist/core/base/create-child-observable.mjs.map +1 -0
  6. package/dist/core/base/create-observable-base.d.mts +82 -0
  7. package/dist/core/base/create-observable-base.d.mts.map +1 -0
  8. package/dist/core/base/create-observable-base.mjs +160 -0
  9. package/dist/core/base/create-observable-base.mjs.map +1 -0
  10. package/dist/core/base/create-root-observable.d.mts +37 -0
  11. package/dist/core/base/create-root-observable.d.mts.map +1 -0
  12. package/dist/core/base/create-root-observable.mjs +36 -0
  13. package/dist/core/base/create-root-observable.mjs.map +1 -0
  14. package/dist/core/base/index.d.mts +3 -0
  15. package/dist/core/base/index.d.mts.map +1 -0
  16. package/dist/core/base/index.mjs +3 -0
  17. package/dist/core/{class → base}/index.mjs.map +1 -1
  18. package/dist/core/combine/combine.d.mts.map +1 -1
  19. package/dist/core/combine/combine.mjs +28 -27
  20. package/dist/core/combine/combine.mjs.map +1 -1
  21. package/dist/core/combine/merge.d.mts.map +1 -1
  22. package/dist/core/combine/merge.mjs +11 -13
  23. package/dist/core/combine/merge.mjs.map +1 -1
  24. package/dist/core/combine/zip.d.mts.map +1 -1
  25. package/dist/core/combine/zip.mjs +32 -31
  26. package/dist/core/combine/zip.mjs.map +1 -1
  27. package/dist/core/create/counter.d.mts.map +1 -1
  28. package/dist/core/create/counter.mjs +39 -50
  29. package/dist/core/create/counter.mjs.map +1 -1
  30. package/dist/core/create/from-abortable-promise.d.mts.map +1 -1
  31. package/dist/core/create/from-abortable-promise.mjs +33 -32
  32. package/dist/core/create/from-abortable-promise.mjs.map +1 -1
  33. package/dist/core/create/from-promise.d.mts.map +1 -1
  34. package/dist/core/create/from-promise.mjs +12 -12
  35. package/dist/core/create/from-promise.mjs.map +1 -1
  36. package/dist/core/create/from-subscribable.d.mts.map +1 -1
  37. package/dist/core/create/from-subscribable.mjs +10 -10
  38. package/dist/core/create/from-subscribable.mjs.map +1 -1
  39. package/dist/core/create/just.d.mts.map +1 -1
  40. package/dist/core/create/just.mjs +5 -4
  41. package/dist/core/create/just.mjs.map +1 -1
  42. package/dist/core/create/source.mjs +11 -12
  43. package/dist/core/create/source.mjs.map +1 -1
  44. package/dist/core/create/timer.d.mts.map +1 -1
  45. package/dist/core/create/timer.mjs +32 -38
  46. package/dist/core/create/timer.mjs.map +1 -1
  47. package/dist/core/index.d.mts +0 -1
  48. package/dist/core/index.d.mts.map +1 -1
  49. package/dist/core/index.mjs +0 -3
  50. package/dist/core/index.mjs.map +1 -1
  51. package/dist/core/operators/audit.d.mts.map +1 -1
  52. package/dist/core/operators/audit.mjs +28 -36
  53. package/dist/core/operators/audit.mjs.map +1 -1
  54. package/dist/core/operators/debounce.d.mts.map +1 -1
  55. package/dist/core/operators/debounce.mjs +26 -33
  56. package/dist/core/operators/debounce.mjs.map +1 -1
  57. package/dist/core/operators/filter.d.mts.map +1 -1
  58. package/dist/core/operators/filter.mjs +23 -27
  59. package/dist/core/operators/filter.mjs.map +1 -1
  60. package/dist/core/operators/map.d.mts.map +1 -1
  61. package/dist/core/operators/map.mjs +21 -28
  62. package/dist/core/operators/map.mjs.map +1 -1
  63. package/dist/core/operators/merge-map.d.mts.map +1 -1
  64. package/dist/core/operators/merge-map.mjs +30 -39
  65. package/dist/core/operators/merge-map.mjs.map +1 -1
  66. package/dist/core/operators/pairwise.d.mts.map +1 -1
  67. package/dist/core/operators/pairwise.mjs +22 -24
  68. package/dist/core/operators/pairwise.mjs.map +1 -1
  69. package/dist/core/operators/scan.d.mts.map +1 -1
  70. package/dist/core/operators/scan.mjs +13 -18
  71. package/dist/core/operators/scan.mjs.map +1 -1
  72. package/dist/core/operators/skip-if-no-change.d.mts.map +1 -1
  73. package/dist/core/operators/skip-if-no-change.mjs +22 -26
  74. package/dist/core/operators/skip-if-no-change.mjs.map +1 -1
  75. package/dist/core/operators/skip-until.d.mts.map +1 -1
  76. package/dist/core/operators/skip-until.mjs +23 -24
  77. package/dist/core/operators/skip-until.mjs.map +1 -1
  78. package/dist/core/operators/skip-while.d.mts.map +1 -1
  79. package/dist/core/operators/skip-while.mjs +27 -32
  80. package/dist/core/operators/skip-while.mjs.map +1 -1
  81. package/dist/core/operators/switch-map.d.mts.map +1 -1
  82. package/dist/core/operators/switch-map.mjs +28 -34
  83. package/dist/core/operators/switch-map.mjs.map +1 -1
  84. package/dist/core/operators/take-until.d.mts.map +1 -1
  85. package/dist/core/operators/take-until.mjs +22 -22
  86. package/dist/core/operators/take-until.mjs.map +1 -1
  87. package/dist/core/operators/take-while.d.mts.map +1 -1
  88. package/dist/core/operators/take-while.mjs +25 -29
  89. package/dist/core/operators/take-while.mjs.map +1 -1
  90. package/dist/core/operators/throttle.d.mts.map +1 -1
  91. package/dist/core/operators/throttle.mjs +27 -35
  92. package/dist/core/operators/throttle.mjs.map +1 -1
  93. package/dist/core/operators/with-buffered-from.d.mts.map +1 -1
  94. package/dist/core/operators/with-buffered-from.mjs +24 -24
  95. package/dist/core/operators/with-buffered-from.mjs.map +1 -1
  96. package/dist/core/operators/with-current-value-from.d.mts.map +1 -1
  97. package/dist/core/operators/with-current-value-from.mjs +20 -25
  98. package/dist/core/operators/with-current-value-from.mjs.map +1 -1
  99. package/dist/core/operators/with-initial-value.d.mts.map +1 -1
  100. package/dist/core/operators/with-initial-value.mjs +12 -15
  101. package/dist/core/operators/with-initial-value.mjs.map +1 -1
  102. package/dist/entry-point.mjs +0 -3
  103. package/dist/entry-point.mjs.map +1 -1
  104. package/dist/index.mjs +0 -3
  105. package/dist/index.mjs.map +1 -1
  106. package/package.json +25 -18
  107. package/src/core/{class → base}/circular-dependency-comparison.test.mts +28 -18
  108. package/src/core/base/circular-dependency.test.mts +322 -0
  109. package/src/core/base/create-child-observable.mts +340 -0
  110. package/src/core/base/create-observable-base.mts +358 -0
  111. package/src/core/base/create-root-observable.mts +102 -0
  112. package/src/core/base/index.mts +2 -0
  113. package/src/core/{class/observable.class.test.mts → base/observable-base.test.mts} +25 -17
  114. package/src/core/combine/combine.mts +51 -53
  115. package/src/core/combine/merge.mts +21 -23
  116. package/src/core/combine/zip.mts +54 -58
  117. package/src/core/create/counter.mts +42 -59
  118. package/src/core/create/from-abortable-promise.mts +38 -45
  119. package/src/core/create/from-promise.mts +25 -28
  120. package/src/core/create/from-subscribable.mts +23 -27
  121. package/src/core/create/just.mts +5 -4
  122. package/src/core/create/source.mts +11 -17
  123. package/src/core/create/timer.mts +32 -47
  124. package/src/core/index.mts +0 -1
  125. package/src/core/operators/audit.mts +43 -57
  126. package/src/core/operators/debounce.mts +35 -45
  127. package/src/core/operators/filter.mts +31 -39
  128. package/src/core/operators/map.mts +32 -40
  129. package/src/core/operators/merge-map.mts +44 -59
  130. package/src/core/operators/pairwise.mts +30 -33
  131. package/src/core/operators/scan.mts +24 -35
  132. package/src/core/operators/skip-if-no-change.mts +31 -36
  133. package/src/core/operators/skip-until.mts +32 -35
  134. package/src/core/operators/skip-while.mts +31 -40
  135. package/src/core/operators/switch-map.mts +36 -48
  136. package/src/core/operators/take-until.mts +31 -29
  137. package/src/core/operators/take-while.mts +33 -41
  138. package/src/core/operators/throttle.mts +37 -51
  139. package/src/core/operators/with-buffered-from.mts +35 -30
  140. package/src/core/operators/with-current-value-from.mts +23 -28
  141. package/src/core/operators/with-initial-value.mts +21 -22
  142. package/dist/core/class/child-observable-class.d.mts +0 -39
  143. package/dist/core/class/child-observable-class.d.mts.map +0 -1
  144. package/dist/core/class/child-observable-class.mjs +0 -173
  145. package/dist/core/class/child-observable-class.mjs.map +0 -1
  146. package/dist/core/class/index.d.mts +0 -4
  147. package/dist/core/class/index.d.mts.map +0 -1
  148. package/dist/core/class/index.mjs +0 -4
  149. package/dist/core/class/observable-base-class.d.mts +0 -28
  150. package/dist/core/class/observable-base-class.d.mts.map +0 -1
  151. package/dist/core/class/observable-base-class.mjs +0 -120
  152. package/dist/core/class/observable-base-class.mjs.map +0 -1
  153. package/dist/core/class/root-observable-class.d.mts +0 -14
  154. package/dist/core/class/root-observable-class.d.mts.map +0 -1
  155. package/dist/core/class/root-observable-class.mjs +0 -43
  156. package/dist/core/class/root-observable-class.mjs.map +0 -1
  157. package/src/core/class/child-observable-class.mts +0 -286
  158. package/src/core/class/circular-dependency.test.mts +0 -251
  159. package/src/core/class/index.mts +0 -3
  160. package/src/core/class/observable-base-class.mts +0 -187
  161. package/src/core/class/root-observable-class.mts +0 -73
@@ -1 +0,0 @@
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,4 +0,0 @@
1
- export * from './child-observable-class.mjs';
2
- export * from './observable-base-class.mjs';
3
- export * from './root-observable-class.mjs';
4
- //# sourceMappingURL=index.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/core/class/index.mts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC"}
@@ -1,4 +0,0 @@
1
- export { AsyncChildObservableClass, InitializedSyncChildObservableClass, SyncChildObservableClass } from './child-observable-class.mjs';
2
- export { ObservableBaseClass } from './observable-base-class.mjs';
3
- export { RootObservableClass } from './root-observable-class.mjs';
4
- //# sourceMappingURL=index.mjs.map
@@ -1,28 +0,0 @@
1
- import { type ChildObservable, type InitializedObservable, type Observable, type ObservableBase, type Operator, type Subscription, type UpdateToken, type WithInitialValueOperator } from '../types/index.mjs';
2
- export declare class ObservableBaseClass<A, Kind extends ObservableBase<A>['kind'], Depth extends ObservableBase<A>['depth']> implements ObservableBase<A> {
3
- #private;
4
- readonly id: import("../types/id.mjs").ObservableId;
5
- readonly kind: Kind;
6
- readonly depth: Depth;
7
- constructor({ kind, depth, initialValue, }: Readonly<{
8
- kind: Kind;
9
- depth: Depth;
10
- initialValue: ReturnType<ObservableBase<A>['getSnapshot']>;
11
- }>);
12
- addChild<B>(child: ChildObservable<B>): void;
13
- getSnapshot(): ReturnType<ObservableBase<A>['getSnapshot']>;
14
- protected getCurrentValue(): ReturnType<ObservableBase<A>['getSnapshot']>;
15
- get isCompleted(): boolean;
16
- get updateToken(): UpdateToken;
17
- get hasSubscriber(): boolean;
18
- get hasChild(): boolean;
19
- hasActiveChild(): boolean;
20
- protected setNext(nextValue: A, updateToken: UpdateToken): void;
21
- tryUpdate(_updateToken: UpdateToken): void;
22
- tryComplete(): void;
23
- complete(): void;
24
- pipe<B>(operator: WithInitialValueOperator<A, B>): InitializedObservable<B>;
25
- pipe<B>(operator: Operator<A, B>): Observable<B>;
26
- subscribe(onNext: (v: A) => void, onComplete?: () => void): Subscription;
27
- }
28
- //# sourceMappingURL=observable-base-class.d.mts.map
@@ -1 +0,0 @@
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"}
@@ -1,120 +0,0 @@
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
-
5
- class ObservableBaseClass {
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
- }
117
- }
118
-
119
- export { ObservableBaseClass };
120
- //# sourceMappingURL=observable-base-class.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"observable-base-class.mjs","sources":["../../../src/core/class/observable-base-class.mts"],"sourcesContent":["import { Arr, Optional } from 'ts-data-forge';\nimport { type MutableMap } from 'ts-type-forge';\nimport {\n type ChildObservable,\n type InitializedObservable,\n type Observable,\n type ObservableBase,\n type Operator,\n type Subscriber,\n type SubscriberId,\n type Subscription,\n type UpdateToken,\n type WithInitialValueOperator,\n} from '../types/index.mjs';\nimport {\n issueObservableId,\n issueSubscriberId,\n issueUpdateToken,\n toSubscriber,\n} from '../utils/index.mjs';\n\nexport class ObservableBaseClass<\n A,\n Kind extends ObservableBase<A>['kind'],\n Depth extends ObservableBase<A>['depth'],\n> implements ObservableBase<A> {\n #mut_children: readonly ChildObservable<unknown>[];\n readonly #subscribers: MutableMap<SubscriberId, Subscriber<A>>;\n #mut_currentValue: ReturnType<ObservableBase<A>['getSnapshot']>;\n #mut_isCompleted: ObservableBase<A>['isCompleted'];\n #mut_updateToken: ObservableBase<A>['updateToken'];\n readonly id;\n readonly kind: Kind;\n readonly depth: Depth;\n\n constructor({\n kind,\n depth,\n initialValue,\n }: Readonly<{\n kind: Kind;\n depth: Depth;\n initialValue: ReturnType<ObservableBase<A>['getSnapshot']>;\n }>) {\n this.kind = kind;\n\n this.depth = depth;\n\n this.id = issueObservableId();\n\n this.#mut_currentValue = initialValue;\n\n this.#mut_children = [];\n\n this.#subscribers = new Map<SubscriberId, Subscriber<A>>();\n\n this.#mut_isCompleted = false;\n\n this.#mut_updateToken = issueUpdateToken();\n }\n\n #addSubscriber(s: Subscriber<A>): SubscriberId {\n // return the id of added subscriber\n const id = issueSubscriberId();\n\n this.#subscribers.set(id, s);\n\n return id;\n }\n\n #removeSubscriber(id: SubscriberId): void {\n this.#subscribers.delete(id);\n }\n\n addChild<B>(child: ChildObservable<B>): void {\n this.#mut_children = Arr.toPushed(\n this.#mut_children,\n\n child as ChildObservable<unknown>,\n );\n }\n\n getSnapshot(): ReturnType<ObservableBase<A>['getSnapshot']> {\n return this.#mut_currentValue;\n }\n\n protected getCurrentValue(): ReturnType<ObservableBase<A>['getSnapshot']> {\n return this.#mut_currentValue;\n }\n\n get isCompleted(): boolean {\n return this.#mut_isCompleted;\n }\n\n get updateToken(): UpdateToken {\n return this.#mut_updateToken;\n }\n\n get hasSubscriber(): boolean {\n return this.#subscribers.size > 0;\n }\n\n get hasChild(): boolean {\n return Arr.isNonEmpty(this.#mut_children);\n }\n\n hasActiveChild(): boolean {\n return this.#mut_children.some((c) => !c.isCompleted);\n }\n\n protected setNext(nextValue: A, updateToken: UpdateToken): void {\n this.#mut_updateToken = updateToken;\n\n this.#mut_currentValue = Optional.some(nextValue);\n\n for (const s of this.#subscribers.values()) {\n s.onNext(nextValue);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/class-methods-use-this\n tryUpdate(_updateToken: UpdateToken): void {\n throw new Error('not implemented');\n }\n\n tryComplete(): void {\n if (!this.hasSubscriber && !this.hasActiveChild()) {\n this.complete();\n }\n }\n\n complete(): void {\n if (this.isCompleted) return; // terminate only once\n\n // change state\n this.#mut_isCompleted = true;\n\n // run subscribers for the current value\n for (const s of this.#subscribers.values()) {\n s.onComplete();\n }\n\n // remove all subscribers\n this.#subscribers.clear();\n\n // propagate to children\n for (const o of this.#mut_children) {\n o.tryComplete();\n }\n }\n\n pipe<B>(operator: WithInitialValueOperator<A, B>): InitializedObservable<B>;\n pipe<B>(operator: Operator<A, B>): Observable<B>;\n pipe<B>(operator: Operator<A, B>): Observable<B> {\n return operator(\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n this as unknown as InitializedObservable<A>,\n );\n }\n\n subscribe(onNext: (v: A) => void, onComplete?: () => void): Subscription {\n // first emit\n const curr = this.getSnapshot();\n\n if (Optional.isSome(curr)) {\n onNext(curr.value);\n }\n\n if (this.isCompleted) {\n if (onComplete !== undefined) {\n onComplete();\n }\n\n return { unsubscribe: () => {} };\n }\n\n const id: SubscriberId = this.#addSubscriber(\n toSubscriber(onNext, onComplete),\n );\n\n return {\n unsubscribe: () => {\n this.#removeSubscriber(id);\n },\n };\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- import { Optional } from 'ts-data-forge';
2
- import { type MutableSet } from 'ts-type-forge';
3
- import { type ChildObservable, type ObservableId, type RootObservable } from '../types/index.mjs';
4
- import { ObservableBaseClass } from './observable-base-class.mjs';
5
- export declare class RootObservableClass<A> extends ObservableBaseClass<A, 'root', 0> implements RootObservable<A> {
6
- #private;
7
- protected readonly _descendantsIdSet: MutableSet<ObservableId>;
8
- constructor({ initialValue, }: Readonly<{
9
- initialValue: Optional<A>;
10
- }>);
11
- addDescendant<B>(child: ChildObservable<B>): void;
12
- startUpdate(nextValue: A): void;
13
- }
14
- //# sourceMappingURL=root-observable-class.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"root-observable-class.d.mts","sourceRoot":"","sources":["../../../src/core/class/root-observable-class.mts"],"names":[],"mappings":"AAAA,OAAO,EAAO,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,qBAAa,mBAAmB,CAAC,CAAC,CAChC,SAAQ,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CACxC,YAAW,cAAc,CAAC,CAAC,CAAC;;IAG5B,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;IAE/D,YAAY,EACV,YAAY,GACb,EAAE,QAAQ,CAAC;QACV,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;KAC3B,CAAC,EAUD;IAED,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAehD;IAED,WAAW,CAAC,SAAS,EAAE,CAAC,GAAG,IAAI,CAQ9B;CACF"}
@@ -1,43 +0,0 @@
1
- import { Arr } from 'ts-data-forge';
2
- import { issueUpdateToken } from '../utils/id-maker.mjs';
3
- import { binarySearch } from '../utils/utils.mjs';
4
- import { ObservableBaseClass } from './observable-base-class.mjs';
5
-
6
- class RootObservableClass extends ObservableBaseClass {
7
- #mut_propagationOrder;
8
- _descendantsIdSet;
9
- constructor({
10
- initialValue
11
- }) {
12
- super({
13
- kind: "root",
14
- depth: 0,
15
- initialValue
16
- });
17
- this.#mut_propagationOrder = [];
18
- this._descendantsIdSet = /* @__PURE__ */ new Set();
19
- }
20
- addDescendant(child) {
21
- if (this._descendantsIdSet.has(child.id)) return;
22
- this._descendantsIdSet.add(child.id);
23
- const insertPos = binarySearch(
24
- this.#mut_propagationOrder.map((a) => a.depth),
25
- child.depth
26
- );
27
- this.#mut_propagationOrder = Arr.toInserted(
28
- this.#mut_propagationOrder,
29
- insertPos,
30
- child
31
- );
32
- }
33
- startUpdate(nextValue) {
34
- const updateToken = issueUpdateToken();
35
- this.setNext(nextValue, updateToken);
36
- for (const p of this.#mut_propagationOrder) {
37
- p.tryUpdate(updateToken);
38
- }
39
- }
40
- }
41
-
42
- export { RootObservableClass };
43
- //# sourceMappingURL=root-observable-class.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"root-observable-class.mjs","sources":["../../../src/core/class/root-observable-class.mts"],"sourcesContent":["import { Arr, Optional } from 'ts-data-forge';\nimport { type MutableSet } from 'ts-type-forge';\nimport {\n isRootObservable,\n type ChildObservable,\n type ObservableId,\n type RootObservable,\n} from '../types/index.mjs';\nimport { binarySearch, issueUpdateToken } from '../utils/index.mjs';\nimport { ObservableBaseClass } from './observable-base-class.mjs';\n\nexport class RootObservableClass<A>\n extends ObservableBaseClass<A, 'root', 0>\n implements RootObservable<A>\n{\n #mut_propagationOrder: readonly ChildObservable<unknown>[];\n protected readonly _descendantsIdSet: MutableSet<ObservableId>;\n\n constructor({\n initialValue,\n }: Readonly<{\n initialValue: Optional<A>;\n }>) {\n super({\n kind: 'root',\n depth: 0,\n initialValue,\n });\n\n this.#mut_propagationOrder = [];\n\n this._descendantsIdSet = new Set<ObservableId>();\n }\n\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\nif (import.meta.vitest !== undefined) {\n test('isRootObservable', () => {\n assert.isTrue(\n isRootObservable(\n new RootObservableClass({\n initialValue: Optional.some(0),\n }),\n ),\n );\n });\n}\n"],"names":[],"mappings":";;;;;AAWO,MAAM,4BACH,mBAAA,CAEV;AAAA,EACE,qBAAA;AAAA,EACmB,iBAAA;AAAA,EAEnB,WAAA,CAAY;AAAA,IACV;AAAA,GACF,EAEI;AACF,IAAA,KAAA,CAAM;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,CAAA;AAAA,MACP;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,wBAAwB,EAAC;AAE9B,IAAA,IAAA,CAAK,iBAAA,uBAAwB,GAAA,EAAkB;AAAA,EACjD;AAAA,EAEA,cAAiB,KAAA,EAAiC;AAChD,IAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA,EAAG;AAE1C,IAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AAEnC,IAAA,MAAM,SAAA,GAAY,YAAA;AAAA,MAChB,KAAK,qBAAA,CAAsB,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAAA,MAC7C,KAAA,CAAM;AAAA,KACR;AAEA,IAAA,IAAA,CAAK,wBAAwB,GAAA,CAAI,UAAA;AAAA,MAC/B,IAAA,CAAK,qBAAA;AAAA,MACL,SAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,YAAY,SAAA,EAAoB;AAC9B,IAAA,MAAM,cAAc,gBAAA,EAAiB;AAErC,IAAA,IAAA,CAAK,OAAA,CAAQ,WAAW,WAAW,CAAA;AAEnC,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,qBAAA,EAAuB;AAC1C,MAAA,CAAA,CAAE,UAAU,WAAW,CAAA;AAAA,IACzB;AAAA,EACF;AACF;;;;"}
@@ -1,286 +0,0 @@
1
- import { Arr, type Some } from 'ts-data-forge';
2
- import { type MutableSet } from 'ts-type-forge';
3
- import {
4
- isChildObservable,
5
- isManagerObservable,
6
- type AsyncChildObservable,
7
- type ChildObservable,
8
- type InitializedObservable,
9
- type InitializedSyncChildObservable,
10
- type KeepInitialValueOperator,
11
- type NonEmptyUnknownList,
12
- type Observable,
13
- type ObservableId,
14
- type Operator,
15
- type SyncChildObservable,
16
- type WithInitialValueOperator,
17
- type Wrap,
18
- } from '../types/index.mjs';
19
- import { binarySearch, issueUpdateToken, maxDepth } from '../utils/index.mjs';
20
- import { ObservableBaseClass } from './observable-base-class.mjs';
21
-
22
- /**
23
- * Detects circular dependencies by walking the full ancestor chain of the
24
- * given parents and checking whether `child` already appears among them.
25
- *
26
- * @throws {Error} if a circular dependency is detected
27
- */
28
- const hasCircularDependencyFrom = (
29
- node: Observable<unknown>,
30
- mut_visited: MutableSet<ObservableId>,
31
- mut_inPath: MutableSet<ObservableId>,
32
- ): boolean => {
33
- if (mut_inPath.has(node.id)) return true;
34
-
35
- if (mut_visited.has(node.id)) return false;
36
-
37
- mut_visited.add(node.id);
38
-
39
- mut_inPath.add(node.id);
40
-
41
- if (isChildObservable(node)) {
42
- for (const parent of node.parents) {
43
- if (hasCircularDependencyFrom(parent, mut_visited, mut_inPath)) {
44
- return true;
45
- }
46
- }
47
- }
48
-
49
- mut_inPath.delete(node.id);
50
-
51
- return false;
52
- };
53
-
54
- const detectCircularDependency = (
55
- child: ChildObservable<unknown>,
56
- parents: readonly Observable<unknown>[],
57
- ): void => {
58
- const mut_visited = new Set<ObservableId>();
59
-
60
- const mut_inPath = new Set<ObservableId>([child.id]);
61
-
62
- for (const parent of parents) {
63
- if (hasCircularDependencyFrom(parent, mut_visited, mut_inPath)) {
64
- throw new Error(
65
- 'Circular dependency detected in observable graph: a child observable cannot be its own ancestor.',
66
- );
67
- }
68
- }
69
- };
70
-
71
- const registerChild = <A,>(
72
- child: ChildObservable<A>,
73
- parents: ChildObservable<A>['parents'],
74
- ): void => {
75
- detectCircularDependency(child, parents);
76
-
77
- for (const p of parents) {
78
- p.addChild(child);
79
- }
80
-
81
- // register child to all reachable ManagerObservables
82
- const mut_rest = Array.from(parents);
83
-
84
- while (Arr.isNonEmpty(mut_rest)) {
85
- const p = mut_rest.pop();
86
-
87
- if (p === undefined) break;
88
-
89
- if (isManagerObservable(p)) {
90
- p.addDescendant(child);
91
- } else {
92
- // trace back dependency graph
93
- mut_rest.push(...p.parents);
94
- }
95
- }
96
- };
97
-
98
- const tryComplete = <A,>({
99
- hasSubscriber,
100
- hasActiveChild,
101
- parents,
102
- complete,
103
- }: Readonly<{
104
- hasSubscriber: boolean;
105
- hasActiveChild: boolean;
106
- parents: ChildObservable<A>['parents'];
107
- complete: () => void;
108
- }>): void => {
109
- // If there is no working parent node
110
- if (parents.every((r) => r.isCompleted)) {
111
- complete();
112
-
113
- return;
114
- }
115
-
116
- // If there are no active child node
117
- if (!hasSubscriber && !hasActiveChild) {
118
- complete();
119
- }
120
-
121
- // propagate to parents
122
- for (const par of parents) {
123
- par.tryComplete();
124
- }
125
- };
126
-
127
- export class AsyncChildObservableClass<A, const P extends NonEmptyUnknownList>
128
- extends ObservableBaseClass<A, 'async child', number>
129
- implements AsyncChildObservable<A, P>
130
- {
131
- #mut_propagationOrder: readonly ChildObservable<unknown>[];
132
- readonly parents;
133
- protected readonly descendantsIdSet: MutableSet<ObservableId>;
134
-
135
- constructor({
136
- parents,
137
- depth = 1 + maxDepth(parents),
138
- initialValue,
139
- }: Readonly<{
140
- parents: Wrap<P>;
141
- depth?: number;
142
- initialValue: ReturnType<AsyncChildObservable<A>['getSnapshot']>;
143
- }>) {
144
- super({
145
- kind: 'async child',
146
- depth,
147
- initialValue,
148
- });
149
-
150
- this.parents = parents;
151
-
152
- this.#mut_propagationOrder = [];
153
-
154
- this.descendantsIdSet = new Set<ObservableId>();
155
-
156
- registerChild(this, parents);
157
- }
158
-
159
- // overload
160
- addDescendant<B>(child: ChildObservable<B>): void {
161
- if (this.descendantsIdSet.has(child.id)) return;
162
-
163
- this.descendantsIdSet.add(child.id);
164
-
165
- const insertPos = binarySearch(
166
- this.#mut_propagationOrder.map((a) => a.depth),
167
- child.depth,
168
- );
169
-
170
- this.#mut_propagationOrder = Arr.toInserted(
171
- this.#mut_propagationOrder,
172
- insertPos,
173
- child,
174
- );
175
- }
176
-
177
- startUpdate(nextValue: A): void {
178
- const updateToken = issueUpdateToken();
179
-
180
- this.setNext(nextValue, updateToken);
181
-
182
- for (const p of this.#mut_propagationOrder) {
183
- p.tryUpdate(updateToken);
184
- }
185
- }
186
-
187
- override complete(): void {
188
- super.complete();
189
-
190
- // propagate to parents
191
- for (const par of this.parents) {
192
- par.tryComplete();
193
- }
194
- }
195
-
196
- override tryComplete(): void {
197
- tryComplete({
198
- complete: () => {
199
- this.complete();
200
- },
201
- hasActiveChild: this.hasActiveChild(),
202
- hasSubscriber: this.hasSubscriber,
203
- parents: this.parents,
204
- });
205
- }
206
- }
207
-
208
- export class SyncChildObservableClass<A, const P extends NonEmptyUnknownList>
209
- extends ObservableBaseClass<A, 'sync child', number>
210
- implements SyncChildObservable<A, P>
211
- {
212
- readonly parents;
213
-
214
- constructor({
215
- parents,
216
- depth = 1 + maxDepth(parents),
217
- initialValue,
218
- }: Readonly<{
219
- parents: Wrap<P>;
220
- depth?: number;
221
- initialValue: ReturnType<SyncChildObservable<A>['getSnapshot']>;
222
- }>) {
223
- super({
224
- kind: 'sync child',
225
- depth,
226
- initialValue,
227
- });
228
-
229
- this.parents = parents;
230
-
231
- registerChild(this, parents);
232
- }
233
-
234
- override complete(): void {
235
- super.complete();
236
-
237
- for (const par of this.parents) {
238
- par.tryComplete();
239
- }
240
- }
241
-
242
- override tryComplete(): void {
243
- tryComplete({
244
- complete: () => {
245
- this.complete();
246
- },
247
- hasActiveChild: this.hasActiveChild(),
248
- hasSubscriber: this.hasSubscriber,
249
- parents: this.parents,
250
- });
251
- }
252
- }
253
-
254
- export class InitializedSyncChildObservableClass<
255
- A,
256
- const P extends NonEmptyUnknownList,
257
- >
258
- extends SyncChildObservableClass<A, P>
259
- implements InitializedSyncChildObservable<A, P>
260
- {
261
- constructor({
262
- parents,
263
- depth = 1 + maxDepth(parents),
264
- initialValue,
265
- }: Readonly<{
266
- parents: Wrap<P>;
267
- depth?: number;
268
- initialValue: ReturnType<InitializedSyncChildObservable<A>['getSnapshot']>;
269
- }>) {
270
- super({ parents, depth, initialValue });
271
- }
272
-
273
- override getSnapshot(): Some<A> {
274
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
275
- return super.getCurrentValue() as Some<A>;
276
- }
277
-
278
- override pipe<B>(
279
- operator: KeepInitialValueOperator<A, B> | WithInitialValueOperator<A, B>,
280
- ): InitializedObservable<B>;
281
-
282
- override pipe<B>(operator: Operator<A, B>): Observable<B>;
283
- override pipe<B>(operator: Operator<A, B>): Observable<B> {
284
- return operator(this);
285
- }
286
- }