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,41 +1,134 @@
1
1
  import { Arr, Optional } from 'ts-data-forge';
2
- import { SyncChildObservableClass } from '../class/child-observable-class.mjs';
3
- import '../utils/id-maker.mjs';
4
-
5
- const combine = (parents) => (
6
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
7
- new CombineObservableClass(
8
- parents
9
- )
10
- );
11
- const combineLatest = combine;
12
- class CombineObservableClass extends SyncChildObservableClass {
13
- constructor(parents) {
14
- const parentsValues = Arr.map(
15
- parents,
16
- (p) => p.getSnapshot()
17
- );
18
- const initialValue = Arr.every(parentsValues, Optional.isSome) ? Optional.some(Arr.map(parentsValues, (c) => c.value)) : Optional.none;
19
- super({
20
- parents,
21
- initialValue
2
+ import { createSyncChildObservable } from '../base/index.mjs';
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+ export const combine = (parents) =>
63
+
64
+ createCombineObservable(parents);
65
+
66
+
67
+
68
+
69
+ export const combineLatest = combine;
70
+ const createCombineObservable = (parents) => {
71
+ const parentsValues = Arr.map(parents, (p) => p.getSnapshot());
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+
80
+ const initialValue = Arr.every(parentsValues, Optional.isSome)
81
+ ? Optional.some(Arr.map(parentsValues, (c) => c.value))
82
+ : Optional.none;
83
+ return createSyncChildObservable({
84
+ parents,
85
+ initialValue,
86
+ }, ({ setNext }) => (updateToken) => {
87
+ if (parents.every((o) => o.updateToken !== updateToken))
88
+ return;
89
+
90
+
91
+
92
+ const parentValues = Arr.map(parents, (a) => a.getSnapshot());
93
+ if (Arr.every(parentValues, Optional.isSome)) {
94
+ const nextValue = Arr.map(parentValues, (a) => a.value);
95
+ setNext(nextValue, updateToken);
96
+ }
22
97
  });
23
- }
24
- tryUpdate(updateToken) {
25
- if (this.parents.every((o) => o.updateToken !== updateToken)) return;
26
- const parentValues = Arr.map(
27
- this.parents,
28
- (a) => a.getSnapshot()
29
- );
30
- if (Arr.every(parentValues, Optional.isSome)) {
31
- const nextValue = Arr.map(
32
- parentValues,
33
- (a) => a.value
34
- );
35
- this.setNext(nextValue, updateToken);
36
- }
37
- }
38
- }
39
-
40
- export { combine, combineLatest };
41
- //# sourceMappingURL=combine.mjs.map
98
+ };
99
+
100
+
101
+
102
+
103
+
104
+
105
+
106
+
107
+
108
+
109
+
110
+
111
+
112
+
113
+
114
+
115
+
116
+
117
+
118
+
119
+
120
+
121
+
122
+
123
+
124
+
125
+
126
+
127
+
128
+
129
+
130
+
131
+
132
+
133
+
134
+ //# sourceMappingURL=combine.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"combine.mjs","sources":["../../../src/core/combine/combine.mts"],"sourcesContent":["import { Arr, expectType, Optional } from 'ts-data-forge';\nimport { type NonEmptyTuple, type Tuple } from 'ts-type-forge';\nimport { SyncChildObservableClass } from '../class/index.mjs';\nimport { source } from '../create/index.mjs';\nimport { withInitialValue } from '../operators/index.mjs';\nimport {\n type CombineObservable,\n type CombineObservableRefined,\n type InitializedObservable,\n type InitializedSyncChildObservable,\n type NonEmptyUnknownList,\n type Observable,\n type SyncChildObservable,\n type UpdateToken,\n type Wrap,\n} from '../types/index.mjs';\n\n/**\n * Combines multiple observables into a single observable that emits an array of their latest values.\n * Emits whenever any of the source observables emit, but only after all sources have emitted at least once.\n *\n * @template OS - Tuple type of source observables\n * @param parents - Array of observables to combine\n * @returns A combined observable emitting tuples of values\n *\n * @example\n * ```ts\n * // Timeline:\n * //\n * // name$ \"Alice\" \"Bob\"\n * // age$ 25 30\n * // user$ [\"Alice\",25] [\"Bob\",25] [\"Bob\",30]\n * //\n * // Explanation:\n * // - combine waits for all sources to emit at least once\n * // - Then emits the latest value from all sources whenever any source emits\n * // - Always emits an array with the latest values from each source\n *\n * const name$ = source<string>();\n *\n * const age$ = source<number>();\n *\n * const user$ = combine([name$, age$]);\n *\n * const userHistory: (readonly [string, number])[] = [];\n *\n * user$.subscribe(([name_, age]) => {\n * userHistory.push([name_, age]);\n * });\n *\n * name$.next('Alice'); // nothing logged (age$ hasn't emitted yet)\n *\n * assert.deepStrictEqual(userHistory, []);\n *\n * age$.next(25); // logs: { name: 'Alice', age: 25 }\n *\n * assert.deepStrictEqual(userHistory, [['Alice', 25]]);\n *\n * name$.next('Bob'); // logs: { name: 'Bob', age: 25 }\n *\n * assert.deepStrictEqual(userHistory, [\n * ['Alice', 25],\n * ['Bob', 25],\n * ]);\n *\n * age$.next(30); // logs: { name: 'Bob', age: 30 }\n *\n * assert.deepStrictEqual(userHistory, [\n * ['Alice', 25],\n * ['Bob', 25],\n * ['Bob', 30],\n * ]);\n * ```\n */\nexport const combine = <const OS extends NonEmptyTuple<Observable<unknown>>>(\n parents: OS,\n): CombineObservableRefined<OS> =>\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n new CombineObservableClass(\n parents,\n ) as unknown as CombineObservableRefined<OS>;\n\n/**\n * Alias for `combine`.\n * @see combine\n */\nexport const combineLatest = combine;\n\nclass CombineObservableClass<const A extends NonEmptyUnknownList>\n extends SyncChildObservableClass<A, A>\n implements CombineObservable<A>\n{\n constructor(parents: Wrap<A>) {\n const parentsValues: Tuple.MapTo<Optional<A[number]>, A> = Arr.map(\n parents,\n (p) => p.getSnapshot(),\n );\n\n // The annotation on `initialValue` is what replaces the type assertion.\n // `Arr.map` carries a single result element type, so it reports `A[number]`\n // at every position, and `Tuple.MapTo<A[number], A>` — the uniform mapping\n // — is *not* assignable back to `A`. The positional\n // `Readonly<{ [K in keyof A]: A[K] }>` is, and TypeScript accepts the\n // uniform result into it because the two mapped types share `keyof A`. So\n // it is the annotation, not an assertion, that records the position-wise\n // fact the checker cannot derive on its own.\n const initialValue: Optional<Readonly<{ [K in keyof A]: A[K] }>> =\n Arr.every(parentsValues, Optional.isSome)\n ? Optional.some(Arr.map(parentsValues, (c) => c.value))\n : Optional.none;\n\n super({\n parents,\n initialValue,\n });\n }\n\n override tryUpdate(updateToken: UpdateToken): void {\n if (this.parents.every((o) => o.updateToken !== updateToken)) return; // all parents are skipped\n\n // Same shape-preserving chain as the constructor: `Arr.map` (not the\n // native one, which drops the tuple shape) into the uniform\n // `Tuple.MapTo`, then a positional annotation to get back to `A`.\n const parentValues: Tuple.MapTo<Optional<A[number]>, A> = Arr.map(\n this.parents,\n (a) => a.getSnapshot(),\n );\n\n if (Arr.every(parentValues, Optional.isSome)) {\n const nextValue: Readonly<{ [K in keyof A]: A[K] }> = Arr.map(\n parentValues,\n (a) => a.value,\n );\n\n this.setNext(nextValue, updateToken);\n }\n }\n}\n\nif (import.meta.vitest !== undefined) {\n test('type test', () => {\n expect(1).toBe(1); // dummy\n });\n\n {\n const s1: Observable<1> = source<1>();\n\n const s2: Observable<2> = source<2>();\n\n const _d = combine([s1, s2]);\n\n expectType<typeof _d, CombineObservable<readonly [1, 2]>>('=');\n\n expectType<typeof _d, Observable<readonly [1, 2]>>('<=');\n }\n\n {\n const s1: InitializedObservable<1> = source<1>().pipe(withInitialValue(1));\n\n const s2: Observable<2> = source<2>();\n\n const _d = combine([s1, s2]);\n\n expectType<typeof _d, CombineObservable<readonly [1, 2]>>('=');\n\n expectType<typeof _d, Observable<readonly [1, 2]>>('<=');\n }\n\n {\n const s1: InitializedObservable<1> = source<1>().pipe(withInitialValue(1));\n\n const s2: InitializedObservable<2> = source<2>().pipe(withInitialValue(2));\n\n const _d = combine([s1, s2]);\n\n // Returns InitializedObservable if all OS are InitializedObservable\n expectType<typeof _d, InitializedObservable<readonly [1, 2]>>('<=');\n }\n\n const r1 = source(1);\n\n const r2 = source('a');\n\n const _c = combine([r1, r2]);\n\n const _ci = combine([\n r1.pipe(withInitialValue(0)),\n r2.pipe(withInitialValue(0)),\n ]);\n\n expectType<typeof _c, SyncChildObservable<readonly [number, string]>>('<=');\n\n expectType<\n typeof _ci,\n InitializedSyncChildObservable<readonly [number, number | string]>\n >('<=');\n}\n"],"names":[],"mappings":";;;;AA0EO,MAAM,UAAU,CACrB,OAAA;AAAA;AAAA,EAGA,IAAI,sBAAA;AAAA,IACF;AAAA;AACF;AAMK,MAAM,aAAA,GAAgB;AAE7B,MAAM,+BACI,wBAAA,CAEV;AAAA,EACE,YAAY,OAAA,EAAkB;AAC5B,IAAA,MAAM,gBAAqD,GAAA,CAAI,GAAA;AAAA,MAC7D,OAAA;AAAA,MACA,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA;AAAY,KACvB;AAUA,IAAA,MAAM,eACJ,GAAA,CAAI,KAAA,CAAM,eAAe,QAAA,CAAS,MAAM,IACpC,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,eAAe,CAAC,CAAA,KAAM,EAAE,KAAK,CAAC,IACpD,QAAA,CAAS,IAAA;AAEf,IAAA,KAAA,CAAM;AAAA,MACJ,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EAAA;AACH,EAES,UAAU,WAAA,EAAgC;AACjD,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,CAAM,CAAC,MAAM,CAAA,CAAE,WAAA,KAAgB,WAAW,CAAA,EAAG;AAK9D,IAAA,MAAM,eAAoD,GAAA,CAAI,GAAA;AAAA,MAC5D,IAAA,CAAK,OAAA;AAAA,MACL,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA;AAAY,KACvB;AAEA,IAAA,IAAI,GAAA,CAAI,KAAA,CAAM,YAAA,EAAc,QAAA,CAAS,MAAM,CAAA,EAAG;AAC5C,MAAA,MAAM,YAAgD,GAAA,CAAI,GAAA;AAAA,QACxD,YAAA;AAAA,QACA,CAAC,MAAM,CAAA,CAAE;AAAA,OACX;AAEA,MAAA,IAAA,CAAK,OAAA,CAAQ,WAAW,WAAW,CAAA;AAAA,IAAA;AACrC,EAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"combine.mjs","sourceRoot":"","sources":["../../../src/core/combine/combine.mts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export { combine, combineLatest } from './combine.mjs';
2
- export { merge } from './merge.mjs';
3
- export { zip } from './zip.mjs';
4
- //# sourceMappingURL=index.mjs.map
1
+ export * from './combine.mjs';
2
+ export * from './merge.mjs';
3
+ export * from './zip.mjs';
4
+ //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../src/core/combine/index.mts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"merge.d.mts","sourceRoot":"","sources":["../../../src/core/combine/merge.mts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAGtE,OAAO,EAEL,KAAK,sBAAsB,EAE3B,KAAK,UAAU,EAIhB,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,eAAO,MAAM,KAAK,GAAI,KAAK,CAAC,EAAE,SAAS,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,WAC9D,EAAE,KACV,sBAAsB,CAAC,EAAE,CAEqC,CAAC"}
1
+ {"version":3,"file":"merge.d.mts","sourceRoot":"","sources":["../../../src/core/combine/merge.mts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AAGtE,OAAO,EAEL,KAAK,sBAAsB,EAE3B,KAAK,UAAU,EAGhB,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,eAAO,MAAM,KAAK,GAAI,KAAK,CAAC,EAAE,SAAS,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,WAC9D,EAAE,KACV,sBAAsB,CAAC,EAAE,CAEkC,CAAC"}
@@ -1,30 +1,79 @@
1
1
  import { Optional } from 'ts-data-forge';
2
- import { SyncChildObservableClass } from '../class/child-observable-class.mjs';
3
- import '../utils/id-maker.mjs';
4
-
5
- const merge = (parents) => (
6
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
7
- new MergeObservableClass(parents)
8
- );
9
- class MergeObservableClass extends SyncChildObservableClass {
10
- constructor(parents) {
11
- super({
12
- parents,
13
- initialValue: Optional.none
14
- });
15
- }
16
- tryUpdate(updateToken) {
17
- const parentToUse = this.parents.find(
18
- (o) => o.updateToken === updateToken && Optional.isSome(o.getSnapshot())
19
- );
20
- if (parentToUse === void 0) return;
21
- const nextValue = (
22
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
23
- Optional.unwrap(parentToUse.getSnapshot())
24
- );
25
- this.setNext(nextValue, updateToken);
26
- }
27
- }
28
-
29
- export { merge };
30
- //# sourceMappingURL=merge.mjs.map
2
+ import { createSyncChildObservable } from '../base/index.mjs';
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+
55
+ export const merge = (parents) =>
56
+
57
+ createMergeObservable(parents);
58
+ const createMergeObservable = (parents) => createSyncChildObservable({
59
+ parents,
60
+ initialValue: Optional.none,
61
+ }, ({ setNext }) => (updateToken) => {
62
+ const parentToUse = parents.find((o) => o.updateToken === updateToken && Optional.isSome(o.getSnapshot()));
63
+ if (parentToUse === undefined)
64
+ return;
65
+ const nextValue =
66
+
67
+ Optional.unwrap(parentToUse.getSnapshot());
68
+ setNext(nextValue, updateToken);
69
+ });
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+ //# sourceMappingURL=merge.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"merge.mjs","sources":["../../../src/core/combine/merge.mts"],"sourcesContent":["import { Optional, expectType } from 'ts-data-forge';\nimport { type ArrayElement, type NonEmptyTuple } from 'ts-type-forge';\nimport { SyncChildObservableClass } from '../class/index.mjs';\nimport { source } from '../create/index.mjs';\nimport {\n type MergeObservable,\n type MergeObservableRefined,\n type NonEmptyUnknownList,\n type Observable,\n type SyncChildObservable,\n type UpdateToken,\n type Wrap,\n} from '../types/index.mjs';\n\n/**\n * Merges multiple observables into a single observable that emits all values from all sources.\n * Emits whenever any source observable emits a value.\n *\n * @template OS - Tuple type of source observables\n * @param parents - Array of observables to merge\n * @returns A merged observable emitting values from any source\n *\n * @example\n * ```ts\n * // Timeline:\n * //\n * // clicks$ c1 c2 c3\n * // keys$ k1 k2 k3\n * // events$ c1 k1 c2 k2 c3 k3\n * //\n * // Explanation:\n * // - merge combines multiple observables into one\n * // - Emits values from any source as they arrive\n * // - Order is preserved based on emission time\n *\n * const clicks$ = source<string>();\n *\n * const keys$ = source<string>();\n *\n * const events$ = merge([clicks$, keys$]);\n *\n * const valueHistory: string[] = [];\n *\n * events$.subscribe((event_) => {\n * valueHistory.push(event_);\n * });\n *\n * clicks$.next('c1');\n *\n * assert.deepStrictEqual(valueHistory, ['c1']);\n *\n * keys$.next('k1');\n *\n * assert.deepStrictEqual(valueHistory, ['c1', 'k1']);\n *\n * clicks$.next('c2');\n *\n * keys$.next('k2');\n *\n * assert.deepStrictEqual(valueHistory, ['c1', 'k1', 'c2', 'k2']);\n * ```\n *\n * @note To improve code readability, consider using `createState` instead of `merge`,\n * subscribing to `parents` and calling `setState` within it.\n */\nexport const merge = <const OS extends NonEmptyTuple<Observable<unknown>>>(\n parents: OS,\n): MergeObservableRefined<OS> =>\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n new MergeObservableClass(parents) as MergeObservableRefined<OS>;\n\nclass MergeObservableClass<const P extends NonEmptyUnknownList>\n extends SyncChildObservableClass<ArrayElement<P>, P>\n implements MergeObservable<P>\n{\n constructor(parents: Wrap<P>) {\n super({\n parents,\n initialValue: Optional.none,\n });\n }\n\n override tryUpdate(updateToken: UpdateToken): void {\n const parentToUse = this.parents.find(\n (o) => o.updateToken === updateToken && Optional.isSome(o.getSnapshot()),\n );\n\n if (parentToUse === undefined) return;\n\n const nextValue =\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n Optional.unwrap(parentToUse.getSnapshot()) as ArrayElement<P>;\n\n this.setNext(nextValue, updateToken);\n }\n}\n\nif (import.meta.vitest !== undefined) {\n test('type test', () => {\n expect(1).toBe(1); // dummy\n });\n\n const r1 = source(1);\n\n const r2 = source('a');\n\n const _m = merge([r1, r2]);\n\n expectType<typeof _m, SyncChildObservable<number | string>>('<=');\n}\n"],"names":[],"mappings":";;;;AAiEO,MAAM,QAAQ,CACnB,OAAA;AAAA;AAAA,EAGA,IAAI,qBAAqB,OAAO;AAAA;AAElC,MAAM,6BACI,wBAAA,CAEV;AAAA,EACE,YAAY,OAAA,EAAkB;AAC5B,IAAA,KAAA,CAAM;AAAA,MACJ,OAAA;AAAA,MACA,cAAc,QAAA,CAAS;AAAA,KACxB,CAAA;AAAA,EAAA;AACH,EAES,UAAU,WAAA,EAAgC;AACjD,IAAA,MAAM,WAAA,GAAc,KAAK,OAAA,CAAQ,IAAA;AAAA,MAC/B,CAAC,MAAM,CAAA,CAAE,WAAA,KAAgB,eAAe,QAAA,CAAS,MAAA,CAAO,CAAA,CAAE,WAAA,EAAa;AAAA,KACzE;AAEA,IAAA,IAAI,gBAAgB,MAAA,EAAW;AAE/B,IAAA,MAAM,SAAA;AAAA;AAAA,MAEJ,QAAA,CAAS,MAAA,CAAO,WAAA,CAAY,WAAA,EAAa;AAAA,KAAA;AAE3C,IAAA,IAAA,CAAK,OAAA,CAAQ,WAAW,WAAW,CAAA;AAAA,EAAA;AAEvC;;;;"}
1
+ {"version":3,"file":"merge.mjs","sourceRoot":"","sources":["../../../src/core/combine/merge.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAU7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CACnB,OAAW,EACiB,EAAE;AAC9B,oEAAoE;AACpE,qBAAqB,CAAC,OAAO,CAA+B,CAAC;AAE/D,MAAM,qBAAqB,GAAG,CAC5B,OAAgB,EACI,EAAE,CACtB,yBAAyB,CACvB;IACE,OAAO;IACP,YAAY,EAAE,QAAQ,CAAC,IAAI;CAC5B,EACD,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CACd,CAAC,WAAW,EAAE,EAAE;IACd,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAC9B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,WAAW,KAAK,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CACpE,CAAC;IAEF,IAAI,WAAW,KAAK,SAAS;QAAE,OAAO;IAEtC,MAAM,SAAS;IACb,oEAAoE;IACpE,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,CAAoB,CAAC;IAEhE,OAAO,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;AAClC,CAAC,CACJ,CAAC;AAEJ,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;IACrC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;QACrB,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ;IAC7B,CAAC,CAAC,CAAC;IAEH,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAErB,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAEvB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAE3B,UAAU,CAAkD,IAAI,CAAC,CAAC;AACpE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"zip.d.mts","sourceRoot":"","sources":["../../../src/core/combine/zip.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAc,MAAM,eAAe,CAAC;AAI/D,OAAO,EAIL,KAAK,UAAU,EAMf,KAAK,oBAAoB,EAC1B,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,eAAO,MAAM,GAAG,GAAI,KAAK,CAAC,EAAE,SAAS,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,WAC5D,EAAE,KACV,oBAAoB,CAAC,EAAE,CAE8C,CAAC"}
1
+ {"version":3,"file":"zip.d.mts","sourceRoot":"","sources":["../../../src/core/combine/zip.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAc,MAAM,eAAe,CAAC;AAI/D,OAAO,EAIL,KAAK,UAAU,EAKf,KAAK,oBAAoB,EAC1B,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AACH,eAAO,MAAM,GAAG,GAAI,KAAK,CAAC,EAAE,SAAS,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,WAC5D,EAAE,KACV,oBAAoB,CAAC,EAAE,CAE2C,CAAC"}
@@ -1,44 +1,126 @@
1
1
  import { Arr, Optional, createQueue } from 'ts-data-forge';
2
- import { SyncChildObservableClass } from '../class/child-observable-class.mjs';
3
- import '../utils/id-maker.mjs';
4
-
5
- const zip = (parents) => (
6
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
7
- new ZipObservableClass(parents)
8
- );
9
- class ZipObservableClass extends SyncChildObservableClass {
10
- #queues;
11
- constructor(parents) {
12
- const parentsValues = Arr.map(
13
- parents,
14
- (p) => p.getSnapshot()
15
- );
16
- const initialValue = Arr.every(parentsValues, Optional.isSome) ? Optional.some(Arr.map(parentsValues, (c) => c.value)) : Optional.none;
17
- super({
18
- parents,
19
- initialValue
2
+ import { createSyncChildObservable } from '../base/index.mjs';
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
27
+
28
+
29
+
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+
47
+
48
+
49
+
50
+
51
+
52
+
53
+
54
+ export const zip = (parents) =>
55
+
56
+ createZipObservable(parents);
57
+ const createZipObservable = (parents) => {
58
+ const parentsValues = Arr.map(parents, (p) => p.getSnapshot());
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+ const initialValue = Arr.every(parentsValues, Optional.isSome)
68
+ ? Optional.some(Arr.map(parentsValues, (c) => c.value))
69
+ : Optional.none;
70
+ const queues = Arr.map(parents, () => createQueue());
71
+ return createSyncChildObservable({
72
+ parents,
73
+ initialValue,
74
+ }, ({ setNext }) => (updateToken) => {
75
+ for (const [index, par] of parents.entries()) {
76
+ const sn = par.getSnapshot();
77
+ if (par.updateToken === updateToken && Optional.isSome(sn)) {
78
+ queues[index]?.enqueue(sn.value);
79
+ }
80
+ }
81
+ if (queues.every((list) => !list.isEmpty)) {
82
+ const nextValue =
83
+
84
+
85
+
86
+ Arr.map(queues, (q) => Optional.unwrap(q.dequeue()));
87
+ setNext(nextValue, updateToken);
88
+ }
20
89
  });
21
- this.#queues = Arr.map(parents, () => createQueue());
22
- }
23
- tryUpdate(updateToken) {
24
- const queues = this.#queues;
25
- for (const [index, par] of this.parents.entries()) {
26
- const sn = par.getSnapshot();
27
- if (par.updateToken === updateToken && Optional.isSome(sn)) {
28
- queues[index]?.enqueue(sn.value);
29
- }
30
- }
31
- if (queues.every((list) => !list.isEmpty)) {
32
- const nextValue = (
33
- // `Arr.map` has a single result element type, so it reports
34
- // `A[number] | undefined` per position rather than `A[P]`.
35
- // eslint-disable-next-line total-functions/no-unsafe-type-assertion
36
- Arr.map(queues, (q) => Optional.unwrap(q.dequeue()))
37
- );
38
- this.setNext(nextValue, updateToken);
39
- }
40
- }
41
- }
42
-
43
- export { zip };
44
- //# sourceMappingURL=zip.mjs.map
90
+ };
91
+
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+
100
+
101
+
102
+
103
+
104
+
105
+
106
+
107
+
108
+
109
+
110
+
111
+
112
+
113
+
114
+
115
+
116
+
117
+
118
+
119
+
120
+
121
+
122
+
123
+
124
+
125
+
126
+ //# sourceMappingURL=zip.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"zip.mjs","sources":["../../../src/core/combine/zip.mts"],"sourcesContent":["import { Arr, Optional, createQueue, expectType } from 'ts-data-forge';\nimport { type NonEmptyTuple, type Tuple } from 'ts-type-forge';\nimport { SyncChildObservableClass } from '../class/index.mjs';\nimport { source } from '../create/index.mjs';\nimport { withInitialValue } from '../operators/index.mjs';\nimport {\n type InitializedObservable,\n type InitializedSyncChildObservable,\n type NonEmptyUnknownList,\n type Observable,\n type SyncChildObservable,\n type TupleToQueueTuple,\n type UpdateToken,\n type Wrap,\n type ZipObservable,\n type ZipObservableRefined,\n} from '../types/index.mjs';\n\n/**\n * Combines multiple observables by pairing their emissions by index.\n * Waits for all sources to emit their nth value before emitting the nth tuple.\n * Completes when any source completes.\n *\n * @template OS - Tuple type of source observables\n * @param parents - Array of observables to zip\n * @returns A zipped observable emitting tuples of values\n *\n * @example\n * ```ts\n * // Timeline:\n * //\n * // letters$ 'A' 'B' 'C'\n * // numbers$ 1 2 3\n * // zipped$ ['A',1] ['B',2] ['C',3]\n * //\n * // Explanation:\n * // - zip pairs values by their index from multiple sources\n * // - Waits for all sources to emit at the same index\n * // - Completes when any source completes\n *\n * const [letters$, setLetter] = createState<string>('A');\n *\n * const [numbers$, setNumber] = createState<number>(1);\n *\n * const zipped$ = zip([letters$, numbers$]);\n *\n * const valueHistory: (readonly [string, number])[] = [];\n *\n * zipped$.subscribe(([letter, num]) => {\n * valueHistory.push([letter, num]);\n * });\n *\n * for (const letter of ['B', 'C']) {\n * setLetter(letter);\n * }\n *\n * for (const num of [2, 3]) {\n * setNumber(num);\n * }\n *\n * assert.deepStrictEqual(valueHistory, [\n * ['A', 1],\n * ['B', 2],\n * ['C', 3],\n * ]);\n * ```\n */\nexport const zip = <const OS extends NonEmptyTuple<Observable<unknown>>>(\n parents: OS,\n): ZipObservableRefined<OS> =>\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n new ZipObservableClass(parents) as unknown as ZipObservableRefined<OS>;\n\nclass ZipObservableClass<const A extends NonEmptyUnknownList>\n extends SyncChildObservableClass<A, A>\n implements ZipObservable<A>\n{\n readonly #queues: TupleToQueueTuple<A>;\n\n constructor(parents: Wrap<A>) {\n const parentsValues: Tuple.MapTo<Optional<A[number]>, A> = Arr.map(\n parents,\n (p) => p.getSnapshot(),\n );\n\n // The annotation on `initialValue` is what replaces the type assertion.\n // `Arr.map` carries a single result element type, so it reports `A[number]`\n // at every position, and `Tuple.MapTo<A[number], A>` — the uniform mapping\n // — is *not* assignable back to `A`. The positional\n // `Readonly<{ [K in keyof A]: A[K] }>` is, and TypeScript accepts the\n // uniform result into it because the two mapped types share `keyof A`. So\n // it is the annotation, not an assertion, that records the position-wise\n // fact the checker cannot derive on its own.\n const initialValue: Optional<Readonly<{ [K in keyof A]: A[K] }>> =\n Arr.every(parentsValues, Optional.isSome)\n ? Optional.some(Arr.map(parentsValues, (c) => c.value))\n : Optional.none;\n\n super({\n parents,\n initialValue,\n });\n\n this.#queues = Arr.map(parents, () => createQueue());\n }\n\n override tryUpdate(updateToken: UpdateToken): void {\n const queues = this.#queues;\n\n for (const [index, par] of this.parents.entries()) {\n const sn = par.getSnapshot();\n\n if (par.updateToken === updateToken && Optional.isSome(sn)) {\n queues[index]?.enqueue(sn.value);\n }\n }\n\n if (queues.every((list) => !list.isEmpty)) {\n const nextValue =\n // `Arr.map` has a single result element type, so it reports\n // `A[number] | undefined` per position rather than `A[P]`.\n // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n Arr.map(queues, (q) => Optional.unwrap(q.dequeue())) as A;\n\n this.setNext(nextValue, updateToken);\n }\n }\n}\n\nif (import.meta.vitest !== undefined) {\n test('type test', () => {\n expect(1).toBe(1); // dummy\n });\n\n {\n const s1: Observable<1> = source<1>();\n\n const s2: Observable<2> = source<2>();\n\n const _d = zip([s1, s2]);\n\n expectType<typeof _d, ZipObservable<readonly [1, 2]>>('=');\n\n expectType<typeof _d, Observable<readonly [1, 2]>>('<=');\n }\n\n {\n const s1: InitializedObservable<1> = source<1>().pipe(withInitialValue(1));\n\n const s2: Observable<2> = source<2>();\n\n const _d = zip([s1, s2]);\n\n expectType<typeof _d, ZipObservable<readonly [1, 2]>>('=');\n\n expectType<typeof _d, Observable<readonly [1, 2]>>('<=');\n }\n\n {\n const s1: InitializedObservable<1> = source<1>().pipe(withInitialValue(1));\n\n const s2: InitializedObservable<2> = source<2>().pipe(withInitialValue(2));\n\n const _d = zip([s1, s2]);\n\n // Returns InitializedObservable if all OS are InitializedObservable\n expectType<typeof _d, InitializedObservable<readonly [1, 2]>>('<=');\n }\n\n const r1 = source(1);\n\n const r2 = source('a');\n\n const _z = zip([r1, r2]);\n\n const _zi = zip([\n r1.pipe(withInitialValue(0)),\n r2.pipe(withInitialValue('0')),\n ] as const);\n\n expectType<typeof _z, SyncChildObservable<readonly [number, string]>>('<=');\n\n expectType<\n typeof _zi,\n InitializedSyncChildObservable<readonly [number, string]>\n >('<=');\n}\n"],"names":[],"mappings":";;;;AAmEO,MAAM,MAAM,CACjB,OAAA;AAAA;AAAA,EAGA,IAAI,mBAAmB,OAAO;AAAA;AAEhC,MAAM,2BACI,wBAAA,CAEV;AAAA,EACW,OAAA;AAAA,EAET,YAAY,OAAA,EAAkB;AAC5B,IAAA,MAAM,gBAAqD,GAAA,CAAI,GAAA;AAAA,MAC7D,OAAA;AAAA,MACA,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA;AAAY,KACvB;AAUA,IAAA,MAAM,eACJ,GAAA,CAAI,KAAA,CAAM,eAAe,QAAA,CAAS,MAAM,IACpC,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,eAAe,CAAC,CAAA,KAAM,EAAE,KAAK,CAAC,IACpD,QAAA,CAAS,IAAA;AAEf,IAAA,KAAA,CAAM;AAAA,MACJ,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,UAAU,GAAA,CAAI,GAAA,CAAI,OAAA,EAAS,MAAM,aAAa,CAAA;AAAA,EAAA;AACrD,EAES,UAAU,WAAA,EAAgC;AACjD,IAAA,MAAM,SAAS,IAAA,CAAK,OAAA;AAEpB,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,GAAG,KAAK,IAAA,CAAK,OAAA,CAAQ,SAAQ,EAAG;AACjD,MAAA,MAAM,EAAA,GAAK,IAAI,WAAA,EAAY;AAE3B,MAAA,IAAI,IAAI,WAAA,KAAgB,WAAA,IAAe,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA,EAAG;AAC1D,QAAA,MAAA,CAAO,KAAK,CAAA,EAAG,OAAA,CAAQ,EAAA,CAAG,KAAK,CAAA;AAAA,MAAA;AACjC,IAAA;AAGF,IAAA,IAAI,OAAO,KAAA,CAAM,CAAC,SAAS,CAAC,IAAA,CAAK,OAAO,CAAA,EAAG;AACzC,MAAA,MAAM,SAAA;AAAA;AAAA;AAAA;AAAA,QAIJ,GAAA,CAAI,GAAA,CAAI,MAAA,EAAQ,CAAC,CAAA,KAAM,SAAS,MAAA,CAAO,CAAA,CAAE,OAAA,EAAS,CAAC;AAAA,OAAA;AAErD,MAAA,IAAA,CAAK,OAAA,CAAQ,WAAW,WAAW,CAAA;AAAA,IAAA;AACrC,EAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"zip.mjs","sourceRoot":"","sources":["../../../src/core/combine/zip.mts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"counter.d.mts","sourceRoot":"","sources":["../../../src/core/create/counter.mts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,iBAAiB,EAAgB,MAAM,oBAAoB,CAAC;AAE1E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,eAAO,MAAM,OAAO,yBACI,MAAM,YAClB,QAAQ,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC,KACD,iBAIA,CAAC"}
1
+ {"version":3,"file":"counter.d.mts","sourceRoot":"","sources":["../../../src/core/create/counter.mts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,iBAAiB,EAAgB,MAAM,oBAAoB,CAAC;AAE1E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,eAAO,MAAM,OAAO,yBACI,MAAM,YAClB,QAAQ,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC,KACD,iBA0DF,CAAC"}