synstate 2.0.2 → 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 (230) 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 +181 -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 +156 -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 +50 -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/base/index.mjs.map +1 -0
  18. package/dist/core/combine/combine.d.mts.map +1 -1
  19. package/dist/core/combine/combine.mjs +132 -39
  20. package/dist/core/combine/combine.mjs.map +1 -1
  21. package/dist/core/combine/index.mjs +4 -4
  22. package/dist/core/combine/index.mjs.map +1 -1
  23. package/dist/core/combine/merge.d.mts.map +1 -1
  24. package/dist/core/combine/merge.mjs +78 -29
  25. package/dist/core/combine/merge.mjs.map +1 -1
  26. package/dist/core/combine/zip.d.mts.map +1 -1
  27. package/dist/core/combine/zip.mjs +124 -42
  28. package/dist/core/combine/zip.mjs.map +1 -1
  29. package/dist/core/create/counter.d.mts.map +1 -1
  30. package/dist/core/create/counter.mjs +82 -57
  31. package/dist/core/create/counter.mjs.map +1 -1
  32. package/dist/core/create/from-abortable-promise.d.mts.map +1 -1
  33. package/dist/core/create/from-abortable-promise.mjs +62 -36
  34. package/dist/core/create/from-abortable-promise.mjs.map +1 -1
  35. package/dist/core/create/from-promise.d.mts.map +1 -1
  36. package/dist/core/create/from-promise.mjs +67 -25
  37. package/dist/core/create/from-promise.mjs.map +1 -1
  38. package/dist/core/create/from-subscribable.d.mts.map +1 -1
  39. package/dist/core/create/from-subscribable.mjs +72 -28
  40. package/dist/core/create/from-subscribable.mjs.map +1 -1
  41. package/dist/core/create/index.mjs +8 -8
  42. package/dist/core/create/index.mjs.map +1 -1
  43. package/dist/core/create/just.d.mts.map +1 -1
  44. package/dist/core/create/just.mjs +36 -12
  45. package/dist/core/create/just.mjs.map +1 -1
  46. package/dist/core/create/source.mjs +15 -20
  47. package/dist/core/create/source.mjs.map +1 -1
  48. package/dist/core/create/timer.d.mts.map +1 -1
  49. package/dist/core/create/timer.mjs +67 -44
  50. package/dist/core/create/timer.mjs.map +1 -1
  51. package/dist/core/index.d.mts +0 -1
  52. package/dist/core/index.d.mts.map +1 -1
  53. package/dist/core/index.mjs +6 -44
  54. package/dist/core/index.mjs.map +1 -1
  55. package/dist/core/operators/audit.d.mts.map +1 -1
  56. package/dist/core/operators/audit.mjs +127 -48
  57. package/dist/core/operators/audit.mjs.map +1 -1
  58. package/dist/core/operators/debounce.d.mts.map +1 -1
  59. package/dist/core/operators/debounce.mjs +115 -45
  60. package/dist/core/operators/debounce.mjs.map +1 -1
  61. package/dist/core/operators/filter.d.mts.map +1 -1
  62. package/dist/core/operators/filter.mjs +43 -32
  63. package/dist/core/operators/filter.mjs.map +1 -1
  64. package/dist/core/operators/index.mjs +18 -18
  65. package/dist/core/operators/index.mjs.map +1 -1
  66. package/dist/core/operators/map.d.mts.map +1 -1
  67. package/dist/core/operators/map.mjs +79 -38
  68. package/dist/core/operators/map.mjs.map +1 -1
  69. package/dist/core/operators/merge-map.d.mts.map +1 -1
  70. package/dist/core/operators/merge-map.mjs +131 -47
  71. package/dist/core/operators/merge-map.mjs.map +1 -1
  72. package/dist/core/operators/pairwise.d.mts.map +1 -1
  73. package/dist/core/operators/pairwise.mjs +79 -31
  74. package/dist/core/operators/pairwise.mjs.map +1 -1
  75. package/dist/core/operators/scan.d.mts.map +1 -1
  76. package/dist/core/operators/scan.mjs +64 -25
  77. package/dist/core/operators/scan.mjs.map +1 -1
  78. package/dist/core/operators/skip-if-no-change.d.mts.map +1 -1
  79. package/dist/core/operators/skip-if-no-change.mjs +93 -39
  80. package/dist/core/operators/skip-if-no-change.mjs.map +1 -1
  81. package/dist/core/operators/skip-until.d.mts.map +1 -1
  82. package/dist/core/operators/skip-until.mjs +73 -32
  83. package/dist/core/operators/skip-until.mjs.map +1 -1
  84. package/dist/core/operators/skip-while.d.mts.map +1 -1
  85. package/dist/core/operators/skip-while.mjs +85 -38
  86. package/dist/core/operators/skip-while.mjs.map +1 -1
  87. package/dist/core/operators/switch-map.d.mts.map +1 -1
  88. package/dist/core/operators/switch-map.mjs +121 -40
  89. package/dist/core/operators/switch-map.mjs.map +1 -1
  90. package/dist/core/operators/take-until.d.mts.map +1 -1
  91. package/dist/core/operators/take-until.mjs +71 -36
  92. package/dist/core/operators/take-until.mjs.map +1 -1
  93. package/dist/core/operators/take-while.d.mts.map +1 -1
  94. package/dist/core/operators/take-while.mjs +103 -35
  95. package/dist/core/operators/take-while.mjs.map +1 -1
  96. package/dist/core/operators/throttle.d.mts.map +1 -1
  97. package/dist/core/operators/throttle.mjs +109 -47
  98. package/dist/core/operators/throttle.mjs.map +1 -1
  99. package/dist/core/operators/with-buffered-from.d.mts.map +1 -1
  100. package/dist/core/operators/with-buffered-from.mjs +93 -46
  101. package/dist/core/operators/with-buffered-from.mjs.map +1 -1
  102. package/dist/core/operators/with-current-value-from.d.mts.map +1 -1
  103. package/dist/core/operators/with-current-value-from.mjs +84 -34
  104. package/dist/core/operators/with-current-value-from.mjs.map +1 -1
  105. package/dist/core/operators/with-initial-value.d.mts.map +1 -1
  106. package/dist/core/operators/with-initial-value.mjs +68 -21
  107. package/dist/core/operators/with-initial-value.mjs.map +1 -1
  108. package/dist/core/predefined/index.mjs +2 -12
  109. package/dist/core/predefined/index.mjs.map +1 -1
  110. package/dist/core/predefined/operators/attach-index.mjs +55 -7
  111. package/dist/core/predefined/operators/attach-index.mjs.map +1 -1
  112. package/dist/core/predefined/operators/index.mjs +12 -12
  113. package/dist/core/predefined/operators/index.mjs.map +1 -1
  114. package/dist/core/predefined/operators/map-optional.mjs +48 -5
  115. package/dist/core/predefined/operators/map-optional.mjs.map +1 -1
  116. package/dist/core/predefined/operators/map-result-err.mjs +48 -5
  117. package/dist/core/predefined/operators/map-result-err.mjs.map +1 -1
  118. package/dist/core/predefined/operators/map-result-ok.mjs +48 -5
  119. package/dist/core/predefined/operators/map-result-ok.mjs.map +1 -1
  120. package/dist/core/predefined/operators/map-to.mjs +41 -6
  121. package/dist/core/predefined/operators/map-to.mjs.map +1 -1
  122. package/dist/core/predefined/operators/pluck.mjs +45 -7
  123. package/dist/core/predefined/operators/pluck.mjs.map +1 -1
  124. package/dist/core/predefined/operators/skip.mjs +49 -6
  125. package/dist/core/predefined/operators/skip.mjs.map +1 -1
  126. package/dist/core/predefined/operators/take.mjs +42 -6
  127. package/dist/core/predefined/operators/take.mjs.map +1 -1
  128. package/dist/core/predefined/operators/unwrap-optional.mjs +43 -8
  129. package/dist/core/predefined/operators/unwrap-optional.mjs.map +1 -1
  130. package/dist/core/predefined/operators/unwrap-result-err.mjs +41 -5
  131. package/dist/core/predefined/operators/unwrap-result-err.mjs.map +1 -1
  132. package/dist/core/predefined/operators/unwrap-result-ok.mjs +43 -8
  133. package/dist/core/predefined/operators/unwrap-result-ok.mjs.map +1 -1
  134. package/dist/core/types/id.mjs +2 -2
  135. package/dist/core/types/id.mjs.map +1 -1
  136. package/dist/core/types/index.mjs +7 -3
  137. package/dist/core/types/index.mjs.map +1 -1
  138. package/dist/core/types/observable-family.mjs +14 -2
  139. package/dist/core/types/observable-family.mjs.map +1 -1
  140. package/dist/core/types/observable-kind.mjs +2 -2
  141. package/dist/core/types/observable-kind.mjs.map +1 -1
  142. package/dist/core/types/observable.mjs +14 -6
  143. package/dist/core/types/observable.mjs.map +1 -1
  144. package/dist/core/types/timer.mjs +2 -2
  145. package/dist/core/types/timer.mjs.map +1 -1
  146. package/dist/core/types/types.mjs +9 -2
  147. package/dist/core/types/types.mjs.map +1 -1
  148. package/dist/core/utils/id-maker.mjs +10 -11
  149. package/dist/core/utils/id-maker.mjs.map +1 -1
  150. package/dist/core/utils/index.mjs +5 -5
  151. package/dist/core/utils/index.mjs.map +1 -1
  152. package/dist/core/utils/max-depth.mjs +7 -4
  153. package/dist/core/utils/max-depth.mjs.map +1 -1
  154. package/dist/core/utils/observable-utils.mjs +4 -7
  155. package/dist/core/utils/observable-utils.mjs.map +1 -1
  156. package/dist/core/utils/utils.mjs +32 -28
  157. package/dist/core/utils/utils.mjs.map +1 -1
  158. package/dist/entry-point.mjs +2 -49
  159. package/dist/entry-point.mjs.map +1 -1
  160. package/dist/index.mjs +3 -49
  161. package/dist/index.mjs.map +1 -1
  162. package/dist/utils/collect-to-array.mjs +8 -13
  163. package/dist/utils/collect-to-array.mjs.map +1 -1
  164. package/dist/utils/create-boolean-state.mjs +47 -22
  165. package/dist/utils/create-boolean-state.mjs.map +1 -1
  166. package/dist/utils/create-event-emitter.mjs +67 -19
  167. package/dist/utils/create-event-emitter.mjs.map +1 -1
  168. package/dist/utils/create-reducer.mjs +54 -16
  169. package/dist/utils/create-reducer.mjs.map +1 -1
  170. package/dist/utils/create-state.mjs +54 -27
  171. package/dist/utils/create-state.mjs.map +1 -1
  172. package/dist/utils/index.mjs +6 -6
  173. package/dist/utils/index.mjs.map +1 -1
  174. package/package.json +17 -19
  175. package/src/core/{class → base}/circular-dependency-comparison.test.mts +28 -18
  176. package/src/core/base/circular-dependency.test.mts +322 -0
  177. package/src/core/base/create-child-observable.mts +340 -0
  178. package/src/core/base/create-observable-base.mts +358 -0
  179. package/src/core/base/create-root-observable.mts +102 -0
  180. package/src/core/base/index.mts +2 -0
  181. package/src/core/{class/observable.class.test.mts → base/observable-base.test.mts} +25 -17
  182. package/src/core/combine/combine.mts +51 -53
  183. package/src/core/combine/merge.mts +21 -23
  184. package/src/core/combine/zip.mts +54 -58
  185. package/src/core/create/counter.mts +42 -59
  186. package/src/core/create/from-abortable-promise.mts +38 -45
  187. package/src/core/create/from-promise.mts +25 -28
  188. package/src/core/create/from-subscribable.mts +23 -27
  189. package/src/core/create/just.mts +5 -4
  190. package/src/core/create/source.mts +11 -17
  191. package/src/core/create/timer.mts +32 -47
  192. package/src/core/index.mts +0 -1
  193. package/src/core/operators/audit.mts +43 -57
  194. package/src/core/operators/debounce.mts +35 -45
  195. package/src/core/operators/filter.mts +31 -39
  196. package/src/core/operators/map.mts +32 -40
  197. package/src/core/operators/merge-map.mts +44 -59
  198. package/src/core/operators/pairwise.mts +30 -33
  199. package/src/core/operators/scan.mts +24 -35
  200. package/src/core/operators/skip-if-no-change.mts +31 -36
  201. package/src/core/operators/skip-until.mts +32 -35
  202. package/src/core/operators/skip-while.mts +31 -40
  203. package/src/core/operators/switch-map.mts +36 -48
  204. package/src/core/operators/take-until.mts +31 -29
  205. package/src/core/operators/take-while.mts +33 -41
  206. package/src/core/operators/throttle.mts +37 -51
  207. package/src/core/operators/with-buffered-from.mts +35 -30
  208. package/src/core/operators/with-current-value-from.mts +23 -28
  209. package/src/core/operators/with-initial-value.mts +21 -22
  210. package/dist/core/class/child-observable-class.d.mts +0 -39
  211. package/dist/core/class/child-observable-class.d.mts.map +0 -1
  212. package/dist/core/class/child-observable-class.mjs +0 -173
  213. package/dist/core/class/child-observable-class.mjs.map +0 -1
  214. package/dist/core/class/index.d.mts +0 -4
  215. package/dist/core/class/index.d.mts.map +0 -1
  216. package/dist/core/class/index.mjs +0 -4
  217. package/dist/core/class/index.mjs.map +0 -1
  218. package/dist/core/class/observable-base-class.d.mts +0 -28
  219. package/dist/core/class/observable-base-class.d.mts.map +0 -1
  220. package/dist/core/class/observable-base-class.mjs +0 -120
  221. package/dist/core/class/observable-base-class.mjs.map +0 -1
  222. package/dist/core/class/root-observable-class.d.mts +0 -14
  223. package/dist/core/class/root-observable-class.d.mts.map +0 -1
  224. package/dist/core/class/root-observable-class.mjs +0 -43
  225. package/dist/core/class/root-observable-class.mjs.map +0 -1
  226. package/src/core/class/child-observable-class.mts +0 -286
  227. package/src/core/class/circular-dependency.test.mts +0 -251
  228. package/src/core/class/index.mts +0 -3
  229. package/src/core/class/observable-base-class.mts +0 -187
  230. package/src/core/class/root-observable-class.mts +0 -73
@@ -1,11 +1,10 @@
1
1
  import { Optional } from 'ts-data-forge';
2
2
  import { type FixedLengthTuple } from 'ts-type-forge';
3
- import { SyncChildObservableClass } from '../class/index.mjs';
3
+ import { createSyncChildObservable } from '../base/index.mjs';
4
4
  import {
5
5
  type DropInitialValueOperator,
6
6
  type Observable,
7
7
  type PairwiseOperatorObservable,
8
- type UpdateToken,
9
8
  } from '../types/index.mjs';
10
9
 
11
10
  /**
@@ -69,43 +68,41 @@ export const pairwise = <A,>(): DropInitialValueOperator<
69
68
  const f = <A,>(
70
69
  parentObservable: Observable<A>,
71
70
  ): Observable<FixedLengthTuple<2, A>> =>
72
- new PairwiseObservableClass(parentObservable);
71
+ createPairwiseObservable(parentObservable);
73
72
 
74
- class PairwiseObservableClass<A>
75
- extends SyncChildObservableClass<FixedLengthTuple<2, A>, readonly [A]>
76
- implements PairwiseOperatorObservable<A>
77
- {
78
- #mut_previousValue: Optional<A>;
79
-
80
- constructor(parentObservable: Observable<A>) {
81
- super({
73
+ const createPairwiseObservable = <A,>(
74
+ parentObservable: Observable<A>,
75
+ ): PairwiseOperatorObservable<A> =>
76
+ createSyncChildObservable<FixedLengthTuple<2, A>, readonly [A]>(
77
+ {
82
78
  parents: [parentObservable],
83
79
  initialValue: Optional.none,
84
- });
85
-
86
- // parentObservable.snapshot has value
87
- // if parentObservable is InitializedObservable
88
- this.#mut_previousValue = parentObservable.getSnapshot();
89
- }
90
-
91
- override tryUpdate(updateToken: UpdateToken): void {
92
- const par = this.parents[0];
80
+ },
81
+ ({ setNext }) => {
82
+ // parentObservable.snapshot has value
83
+ // if parentObservable is InitializedObservable
84
+ let mut_previousValue: Optional<A> = parentObservable.getSnapshot();
93
85
 
94
- const sn = par.getSnapshot();
86
+ return (updateToken) => {
87
+ const sn = parentObservable.getSnapshot();
95
88
 
96
- if (par.updateToken !== updateToken || Optional.isNone(sn)) {
97
- return; // skip update
98
- }
89
+ if (
90
+ parentObservable.updateToken !== updateToken ||
91
+ Optional.isNone(sn)
92
+ ) {
93
+ return; // skip update
94
+ }
99
95
 
100
- const prev = this.#mut_previousValue;
96
+ const prev = mut_previousValue;
101
97
 
102
- const cond = !Optional.isNone(prev);
98
+ const cond = !Optional.isNone(prev);
103
99
 
104
- // NOTE: Must update before setNext, otherwise Optional.isNone(prev) remains true when tryUpdate is called consecutively
105
- this.#mut_previousValue = par.getSnapshot();
100
+ // NOTE: Must update before setNext, otherwise Optional.isNone(prev) remains true when tryUpdate is called consecutively
101
+ mut_previousValue = parentObservable.getSnapshot();
106
102
 
107
- if (cond) {
108
- this.setNext([prev.value, sn.value], updateToken);
109
- }
110
- }
111
- }
103
+ if (cond) {
104
+ setNext([prev.value, sn.value], updateToken);
105
+ }
106
+ };
107
+ },
108
+ );
@@ -1,9 +1,8 @@
1
1
  import { Optional } from 'ts-data-forge';
2
- import { InitializedSyncChildObservableClass } from '../class/index.mjs';
2
+ import { createInitializedSyncChildObservable } from '../base/index.mjs';
3
3
  import {
4
4
  type Observable,
5
5
  type ScanOperatorObservable,
6
- type UpdateToken,
7
6
  type WithInitialValueOperator,
8
7
  } from '../types/index.mjs';
9
8
 
@@ -62,42 +61,32 @@ export const scan =
62
61
  initialValue: B,
63
62
  ): WithInitialValueOperator<A, B> =>
64
63
  (parentObservable) =>
65
- new ScanObservableClass(parentObservable, reducer, initialValue);
64
+ createScanObservable(parentObservable, reducer, initialValue);
66
65
 
67
- class ScanObservableClass<A, B>
68
- extends InitializedSyncChildObservableClass<B, readonly [A]>
69
- implements ScanOperatorObservable<A, B>
70
- {
71
- readonly #reducer: (acc: B, curr: A) => B;
72
-
73
- constructor(
74
- parentObservable: Observable<A>,
75
- reducer: (acc: B, curr: A) => B,
76
- initialValue: B,
77
- ) {
78
- super({
66
+ const createScanObservable = <A, B>(
67
+ parentObservable: Observable<A>,
68
+ reducer: (acc: B, curr: A) => B,
69
+ initialValue: B,
70
+ ): ScanOperatorObservable<A, B> =>
71
+ createInitializedSyncChildObservable(
72
+ {
79
73
  parents: [parentObservable],
80
74
  initialValue: Optional.some(initialValue),
81
- });
82
-
83
- this.#reducer = reducer;
84
- }
85
-
86
- override tryUpdate(updateToken: UpdateToken): void {
87
- const par = this.parents[0];
88
-
89
- const psn = par.getSnapshot();
75
+ },
76
+ ({ setNext, getSnapshot }) =>
77
+ (updateToken) => {
78
+ const psn = parentObservable.getSnapshot();
90
79
 
91
- const sn = this.getSnapshot();
80
+ const sn = getSnapshot();
92
81
 
93
- if (
94
- par.updateToken !== updateToken ||
95
- Optional.isNone(psn) ||
96
- Optional.isNone(sn)
97
- ) {
98
- return; // skip update
99
- }
82
+ if (
83
+ parentObservable.updateToken !== updateToken ||
84
+ Optional.isNone(psn) ||
85
+ Optional.isNone(sn)
86
+ ) {
87
+ return; // skip update
88
+ }
100
89
 
101
- this.setNext(this.#reducer(sn.value, psn.value), updateToken);
102
- }
103
- }
90
+ setNext(reducer(sn.value, psn.value), updateToken);
91
+ },
92
+ );
@@ -1,10 +1,9 @@
1
1
  import { Optional } from 'ts-data-forge';
2
- import { SyncChildObservableClass } from '../class/index.mjs';
2
+ import { createSyncChildObservable } from '../base/index.mjs';
3
3
  import {
4
4
  type KeepInitialValueOperator,
5
5
  type Observable,
6
6
  type SkipIfNoChangeOperatorObservable,
7
- type UpdateToken,
8
7
  } from '../types/index.mjs';
9
8
 
10
9
  /**
@@ -73,7 +72,7 @@ export const skipIfNoChange = <A,>(
73
72
  ): KeepInitialValueOperator<A, A> =>
74
73
  // eslint-disable-next-line total-functions/no-unsafe-type-assertion
75
74
  ((parentObservable) =>
76
- new SkipIfNoChangeObservableClass(
75
+ createSkipIfNoChangeObservable(
77
76
  parentObservable,
78
77
  eq,
79
78
  )) as KeepInitialValueOperator<A, A>;
@@ -84,44 +83,40 @@ export const skipIfNoChange = <A,>(
84
83
  */
85
84
  export const distinctUntilChanged = skipIfNoChange;
86
85
 
87
- class SkipIfNoChangeObservableClass<A>
88
- extends SyncChildObservableClass<A, readonly [A]>
89
- implements SkipIfNoChangeOperatorObservable<A>
90
- {
91
- readonly #eq: (x: A, y: A) => boolean;
92
- #mut_previousValue: Optional<A>;
93
-
94
- constructor(parentObservable: Observable<A>, eq: (x: A, y: A) => boolean) {
95
- super({
86
+ const createSkipIfNoChangeObservable = <A,>(
87
+ parentObservable: Observable<A>,
88
+ eq: (x: A, y: A) => boolean,
89
+ ): SkipIfNoChangeOperatorObservable<A> =>
90
+ createSyncChildObservable(
91
+ {
96
92
  parents: [parentObservable],
97
93
  initialValue: parentObservable.getSnapshot(),
98
- });
99
-
100
- // parentObservable.snapshot has value
101
- // if parentObservable is InitializedObservable
102
- this.#mut_previousValue = parentObservable.getSnapshot();
103
-
104
- this.#eq = eq;
105
- }
106
-
107
- override tryUpdate(updateToken: UpdateToken): void {
108
- const par = this.parents[0];
94
+ },
95
+ ({ setNext }) => {
96
+ // parentObservable.snapshot has value
97
+ // if parentObservable is InitializedObservable
98
+ let mut_previousValue: Optional<A> = parentObservable.getSnapshot();
109
99
 
110
- const sn = par.getSnapshot();
100
+ return (updateToken) => {
101
+ const sn = parentObservable.getSnapshot();
111
102
 
112
- if (par.updateToken !== updateToken || Optional.isNone(sn)) {
113
- return; // skip update
114
- }
103
+ if (
104
+ parentObservable.updateToken !== updateToken ||
105
+ Optional.isNone(sn)
106
+ ) {
107
+ return; // skip update
108
+ }
115
109
 
116
- const prev = this.#mut_previousValue;
110
+ const prev = mut_previousValue;
117
111
 
118
- const cond = Optional.isNone(prev) || !this.#eq(prev.value, sn.value);
112
+ const cond = Optional.isNone(prev) || !eq(prev.value, sn.value);
119
113
 
120
- // NOTE: Must update before setNext, otherwise Optional.isNone(prev) remains true when tryUpdate is called consecutively
121
- this.#mut_previousValue = sn;
114
+ // NOTE: Must update before setNext, otherwise Optional.isNone(prev) remains true when tryUpdate is called consecutively
115
+ mut_previousValue = sn;
122
116
 
123
- if (cond) {
124
- this.setNext(sn.value, updateToken);
125
- }
126
- }
127
- }
117
+ if (cond) {
118
+ setNext(sn.value, updateToken);
119
+ }
120
+ };
121
+ },
122
+ );
@@ -1,10 +1,9 @@
1
1
  import { Optional } from 'ts-data-forge';
2
- import { SyncChildObservableClass } from '../class/index.mjs';
2
+ import { createSyncChildObservable } from '../base/index.mjs';
3
3
  import {
4
4
  type DropInitialValueOperator,
5
5
  type Observable,
6
6
  type SkipUntilOperatorObservable,
7
- type UpdateToken,
8
7
  } from '../types/index.mjs';
9
8
 
10
9
  /**
@@ -60,45 +59,43 @@ import {
60
59
  export const skipUntil =
61
60
  <A,>(notifier: Observable<unknown>): DropInitialValueOperator<A, A> =>
62
61
  (parentObservable) =>
63
- new SkipUntilObservableClass(parentObservable, notifier);
62
+ createSkipUntilObservable(parentObservable, notifier);
64
63
 
65
- class SkipUntilObservableClass<A>
66
- extends SyncChildObservableClass<A, readonly [A]>
67
- implements SkipUntilOperatorObservable<A>
68
- {
69
- #mut_isSkipping: boolean;
64
+ const createSkipUntilObservable = <A,>(
65
+ parentObservable: Observable<A>,
66
+ notifier: Observable<unknown>,
67
+ ): SkipUntilOperatorObservable<A> => {
68
+ let mut_isSkipping = true;
70
69
 
71
- constructor(parentObservable: Observable<A>, notifier: Observable<unknown>) {
72
- super({
70
+ const observable = createSyncChildObservable<A, readonly [A]>(
71
+ {
73
72
  parents: [parentObservable],
74
73
  initialValue: Optional.none,
75
- });
74
+ },
75
+ ({ setNext }) =>
76
+ (updateToken) => {
77
+ const sn = parentObservable.getSnapshot();
76
78
 
77
- this.#mut_isSkipping = true;
79
+ if (
80
+ mut_isSkipping ||
81
+ parentObservable.updateToken !== updateToken ||
82
+ Optional.isNone(sn)
83
+ ) {
84
+ return; // skip update
85
+ }
78
86
 
79
- notifier.subscribe(
80
- () => {
81
- this.#mut_isSkipping = false;
87
+ setNext(sn.value, updateToken);
82
88
  },
83
- () => {
84
- this.#mut_isSkipping = false;
85
- },
86
- );
87
- }
88
-
89
- override tryUpdate(updateToken: UpdateToken): void {
90
- const par = this.parents[0];
91
-
92
- const sn = par.getSnapshot();
89
+ );
93
90
 
94
- if (
95
- par.updateToken !== updateToken ||
96
- Optional.isNone(sn) ||
97
- this.#mut_isSkipping
98
- ) {
99
- return; // skip update
100
- }
91
+ notifier.subscribe(
92
+ () => {
93
+ mut_isSkipping = false;
94
+ },
95
+ () => {
96
+ mut_isSkipping = false;
97
+ },
98
+ );
101
99
 
102
- this.setNext(sn.value, updateToken);
103
- }
104
- }
100
+ return observable;
101
+ };
@@ -1,10 +1,9 @@
1
1
  import { Optional, SafeUint, asSafeUint, pipe } from 'ts-data-forge';
2
- import { SyncChildObservableClass } from '../class/index.mjs';
2
+ import { createSyncChildObservable } from '../base/index.mjs';
3
3
  import {
4
4
  type DropInitialValueOperator,
5
5
  type Observable,
6
6
  type SkipWhileOperatorObservable,
7
- type UpdateToken,
8
7
  } from '../types/index.mjs';
9
8
 
10
9
  /**
@@ -70,54 +69,46 @@ export const skipWhile =
70
69
  predicate: (value: A, index: SafeUint | -1) => boolean,
71
70
  ): DropInitialValueOperator<A, A> =>
72
71
  (parentObservable) =>
73
- new SkipWhileObservableClass(parentObservable, predicate);
72
+ createSkipWhileObservable(parentObservable, predicate);
74
73
 
75
74
  /* implementation */
76
75
 
77
- class SkipWhileObservableClass<A>
78
- extends SyncChildObservableClass<A, readonly [A]>
79
- implements SkipWhileOperatorObservable<A>
80
- {
81
- readonly #predicate: (value: A, index: SafeUint | -1) => boolean;
82
- #mut_index: SafeUint | -1;
83
- #mut_skipping: boolean;
84
-
85
- constructor(
86
- parentObservable: Observable<A>,
87
- predicate: (value: A, index: SafeUint | -1) => boolean,
88
- ) {
89
- super({
76
+ const createSkipWhileObservable = <A,>(
77
+ parentObservable: Observable<A>,
78
+ predicate: (value: A, index: SafeUint | -1) => boolean,
79
+ ): SkipWhileOperatorObservable<A> =>
80
+ createSyncChildObservable(
81
+ {
90
82
  parents: [parentObservable],
91
83
  initialValue: pipe(parentObservable.getSnapshot()).map((sn) =>
92
84
  Optional.isNone(sn) || predicate(sn.value, -1) ? Optional.none : sn,
93
85
  ).value,
94
- });
95
-
96
- this.#mut_index = -1;
97
-
98
- this.#predicate = predicate;
99
-
100
- this.#mut_skipping = true;
101
- }
86
+ },
87
+ ({ setNext }) => {
88
+ let mut_index: SafeUint | -1 = -1;
102
89
 
103
- override tryUpdate(updateToken: UpdateToken): void {
104
- const par = this.parents[0];
90
+ let mut_skipping = true;
105
91
 
106
- const sn = par.getSnapshot();
92
+ return (updateToken) => {
93
+ const sn = parentObservable.getSnapshot();
107
94
 
108
- if (par.updateToken !== updateToken || Optional.isNone(sn)) {
109
- return; // skip update
110
- }
95
+ if (
96
+ parentObservable.updateToken !== updateToken ||
97
+ Optional.isNone(sn)
98
+ ) {
99
+ return; // skip update
100
+ }
111
101
 
112
- this.#mut_index =
113
- this.#mut_index === -1 ? asSafeUint(0) : SafeUint.add(1, this.#mut_index);
102
+ mut_index =
103
+ mut_index === -1 ? asSafeUint(0) : SafeUint.add(1, mut_index);
114
104
 
115
- if (!this.#predicate(sn.value, this.#mut_index)) {
116
- this.#mut_skipping = false;
117
- }
105
+ if (!predicate(sn.value, mut_index)) {
106
+ mut_skipping = false;
107
+ }
118
108
 
119
- if (!this.#mut_skipping) {
120
- this.setNext(sn.value, updateToken);
121
- }
122
- }
123
- }
109
+ if (!mut_skipping) {
110
+ setNext(sn.value, updateToken);
111
+ }
112
+ };
113
+ },
114
+ );
@@ -1,11 +1,10 @@
1
1
  import { Optional } from 'ts-data-forge';
2
- import { AsyncChildObservableClass } from '../class/index.mjs';
2
+ import { createAsyncChildObservable } from '../base/index.mjs';
3
3
  import {
4
4
  type DropInitialValueOperator,
5
5
  type Observable,
6
6
  type Subscription,
7
7
  type SwitchMapOperatorObservable,
8
- type UpdateToken,
9
8
  } from '../types/index.mjs';
10
9
 
11
10
  /**
@@ -106,61 +105,50 @@ export const switchMap =
106
105
  mapToObservable: (curr: A) => Observable<B>,
107
106
  ): DropInitialValueOperator<A, B> =>
108
107
  (parentObservable) =>
109
- new SwitchMapObservableClass(parentObservable, mapToObservable);
108
+ createSwitchMapObservable(parentObservable, mapToObservable);
110
109
 
111
- class SwitchMapObservableClass<A, B>
112
- extends AsyncChildObservableClass<B, readonly [A]>
113
- implements SwitchMapOperatorObservable<A, B>
114
- {
115
- readonly #mapToObservable: (curr: A) => Observable<B>;
116
- #mut_observable: Observable<B> | undefined;
117
- #mut_subscription: Subscription | undefined;
110
+ const createSwitchMapObservable = <A, B>(
111
+ parentObservable: Observable<A>,
112
+ mapToObservable: (curr: A) => Observable<B>,
113
+ ): SwitchMapOperatorObservable<A, B> => {
114
+ let mut_observable: Observable<B> | undefined = undefined;
118
115
 
119
- constructor(
120
- parentObservable: Observable<A>,
121
- mapToObservable: (curr: A) => Observable<B>,
122
- ) {
123
- super({
116
+ let mut_subscription: Subscription | undefined = undefined;
117
+
118
+ return createAsyncChildObservable(
119
+ {
124
120
  parents: [parentObservable],
125
121
  initialValue: Optional.none,
126
- });
127
-
128
- this.#mapToObservable = mapToObservable;
129
-
130
- this.#mut_observable = undefined;
131
-
132
- this.#mut_subscription = undefined;
133
- }
134
-
135
- override tryUpdate(updateToken: UpdateToken): void {
136
- const par = this.parents[0];
137
-
138
- const sn = par.getSnapshot();
139
-
140
- if (par.updateToken !== updateToken || Optional.isNone(sn)) {
141
- return; // skip update
142
- }
143
-
144
- this.#mut_observable?.complete();
122
+ onComplete: () => {
123
+ mut_subscription?.unsubscribe();
145
124
 
146
- this.#mut_subscription?.unsubscribe();
125
+ mut_observable?.complete();
126
+ },
127
+ },
128
+ ({ startUpdate }) =>
129
+ (updateToken) => {
130
+ const sn = parentObservable.getSnapshot();
147
131
 
148
- const observable = this.#mapToObservable(sn.value);
132
+ if (
133
+ parentObservable.updateToken !== updateToken ||
134
+ Optional.isNone(sn)
135
+ ) {
136
+ return; // skip update
137
+ }
149
138
 
150
- this.#mut_observable = observable;
139
+ mut_observable?.complete();
151
140
 
152
- const subscription = observable.subscribe((curr) => {
153
- this.startUpdate(curr);
154
- });
141
+ mut_subscription?.unsubscribe();
155
142
 
156
- this.#mut_subscription = subscription;
157
- }
143
+ const observable = mapToObservable(sn.value);
158
144
 
159
- override complete(): void {
160
- this.#mut_subscription?.unsubscribe();
145
+ mut_observable = observable;
161
146
 
162
- this.#mut_observable?.complete();
147
+ const subscription = observable.subscribe((curr) => {
148
+ startUpdate(curr);
149
+ });
163
150
 
164
- super.complete();
165
- }
166
- }
151
+ mut_subscription = subscription;
152
+ },
153
+ );
154
+ };
@@ -1,10 +1,9 @@
1
1
  import { Optional } from 'ts-data-forge';
2
- import { SyncChildObservableClass } from '../class/index.mjs';
2
+ import { createSyncChildObservable } from '../base/index.mjs';
3
3
  import {
4
4
  type KeepInitialValueOperator,
5
5
  type Observable,
6
6
  type TakeUntilOperatorObservable,
7
- type UpdateToken,
8
7
  } from '../types/index.mjs';
9
8
 
10
9
  /**
@@ -60,40 +59,43 @@ export const takeUntil = <A,>(
60
59
  ): KeepInitialValueOperator<A, A> =>
61
60
  // eslint-disable-next-line total-functions/no-unsafe-type-assertion
62
61
  ((parentObservable) =>
63
- new TakeUntilObservableClass(
62
+ createTakeUntilObservable(
64
63
  parentObservable,
65
64
  notifier,
66
65
  )) as KeepInitialValueOperator<A, A>;
67
66
 
68
- class TakeUntilObservableClass<A>
69
- extends SyncChildObservableClass<A, readonly [A]>
70
- implements TakeUntilOperatorObservable<A>
71
- {
72
- constructor(parentObservable: Observable<A>, notifier: Observable<unknown>) {
73
- super({
67
+ const createTakeUntilObservable = <A,>(
68
+ parentObservable: Observable<A>,
69
+ notifier: Observable<unknown>,
70
+ ): TakeUntilOperatorObservable<A> => {
71
+ const observable = createSyncChildObservable<A, readonly [A]>(
72
+ {
74
73
  parents: [parentObservable],
75
74
  initialValue: parentObservable.getSnapshot(),
76
- });
75
+ },
76
+ ({ setNext }) =>
77
+ (updateToken) => {
78
+ const sn = parentObservable.getSnapshot();
77
79
 
78
- notifier.subscribe(
79
- () => {
80
- this.complete();
81
- },
82
- () => {
83
- this.complete();
84
- },
85
- );
86
- }
80
+ if (
81
+ parentObservable.updateToken !== updateToken ||
82
+ Optional.isNone(sn)
83
+ ) {
84
+ return; // skip update
85
+ }
87
86
 
88
- override tryUpdate(updateToken: UpdateToken): void {
89
- const par = this.parents[0];
90
-
91
- const sn = par.getSnapshot();
87
+ setNext(sn.value, updateToken);
88
+ },
89
+ );
92
90
 
93
- if (par.updateToken !== updateToken || Optional.isNone(sn)) {
94
- return; // skip update
95
- }
91
+ notifier.subscribe(
92
+ () => {
93
+ observable.complete();
94
+ },
95
+ () => {
96
+ observable.complete();
97
+ },
98
+ );
96
99
 
97
- this.setNext(sn.value, updateToken);
98
- }
99
- }
100
+ return observable;
101
+ };