synstate 0.1.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 (268) hide show
  1. package/README.md +878 -0
  2. package/dist/core/class/child-observable-class.d.mts +37 -0
  3. package/dist/core/class/child-observable-class.d.mts.map +1 -0
  4. package/dist/core/class/child-observable-class.mjs +134 -0
  5. package/dist/core/class/child-observable-class.mjs.map +1 -0
  6. package/dist/core/class/index.d.mts +4 -0
  7. package/dist/core/class/index.d.mts.map +1 -0
  8. package/dist/core/class/index.mjs +4 -0
  9. package/dist/core/class/index.mjs.map +1 -0
  10. package/dist/core/class/observable-base-class.d.mts +28 -0
  11. package/dist/core/class/observable-base-class.d.mts.map +1 -0
  12. package/dist/core/class/observable-base-class.mjs +116 -0
  13. package/dist/core/class/observable-base-class.mjs.map +1 -0
  14. package/dist/core/class/root-observable-class.d.mts +12 -0
  15. package/dist/core/class/root-observable-class.d.mts.map +1 -0
  16. package/dist/core/class/root-observable-class.mjs +35 -0
  17. package/dist/core/class/root-observable-class.mjs.map +1 -0
  18. package/dist/core/combine/combine.d.mts +35 -0
  19. package/dist/core/combine/combine.d.mts.map +1 -0
  20. package/dist/core/combine/combine.mjs +94 -0
  21. package/dist/core/combine/combine.mjs.map +1 -0
  22. package/dist/core/combine/index.d.mts +4 -0
  23. package/dist/core/combine/index.d.mts.map +1 -0
  24. package/dist/core/combine/index.mjs +4 -0
  25. package/dist/core/combine/index.mjs.map +1 -0
  26. package/dist/core/combine/merge.d.mts +28 -0
  27. package/dist/core/combine/merge.d.mts.map +1 -0
  28. package/dist/core/combine/merge.mjs +52 -0
  29. package/dist/core/combine/merge.mjs.map +1 -0
  30. package/dist/core/combine/zip.d.mts +26 -0
  31. package/dist/core/combine/zip.d.mts.map +1 -0
  32. package/dist/core/combine/zip.mjs +63 -0
  33. package/dist/core/combine/zip.mjs.map +1 -0
  34. package/dist/core/create/from-array.d.mts +21 -0
  35. package/dist/core/create/from-array.d.mts.map +1 -0
  36. package/dist/core/create/from-array.mjs +47 -0
  37. package/dist/core/create/from-array.mjs.map +1 -0
  38. package/dist/core/create/from-promise.d.mts +25 -0
  39. package/dist/core/create/from-promise.d.mts.map +1 -0
  40. package/dist/core/create/from-promise.mjs +51 -0
  41. package/dist/core/create/from-promise.mjs.map +1 -0
  42. package/dist/core/create/from-subscribable.d.mts +3 -0
  43. package/dist/core/create/from-subscribable.d.mts.map +1 -0
  44. package/dist/core/create/from-subscribable.mjs +22 -0
  45. package/dist/core/create/from-subscribable.mjs.map +1 -0
  46. package/dist/core/create/index.d.mts +8 -0
  47. package/dist/core/create/index.d.mts.map +1 -0
  48. package/dist/core/create/index.mjs +8 -0
  49. package/dist/core/create/index.mjs.map +1 -0
  50. package/dist/core/create/interval.d.mts +21 -0
  51. package/dist/core/create/interval.d.mts.map +1 -0
  52. package/dist/core/create/interval.mjs +74 -0
  53. package/dist/core/create/interval.mjs.map +1 -0
  54. package/dist/core/create/of.d.mts +20 -0
  55. package/dist/core/create/of.d.mts.map +1 -0
  56. package/dist/core/create/of.mjs +44 -0
  57. package/dist/core/create/of.mjs.map +1 -0
  58. package/dist/core/create/source.d.mts +29 -0
  59. package/dist/core/create/source.d.mts.map +1 -0
  60. package/dist/core/create/source.mjs +29 -0
  61. package/dist/core/create/source.mjs.map +1 -0
  62. package/dist/core/create/timer.d.mts +20 -0
  63. package/dist/core/create/timer.d.mts.map +1 -0
  64. package/dist/core/create/timer.mjs +64 -0
  65. package/dist/core/create/timer.mjs.map +1 -0
  66. package/dist/core/index.d.mts +7 -0
  67. package/dist/core/index.d.mts.map +1 -0
  68. package/dist/core/index.mjs +37 -0
  69. package/dist/core/index.mjs.map +1 -0
  70. package/dist/core/operators/audit-time.d.mts +3 -0
  71. package/dist/core/operators/audit-time.d.mts.map +1 -0
  72. package/dist/core/operators/audit-time.mjs +50 -0
  73. package/dist/core/operators/audit-time.mjs.map +1 -0
  74. package/dist/core/operators/debounce-time.d.mts +31 -0
  75. package/dist/core/operators/debounce-time.d.mts.map +1 -0
  76. package/dist/core/operators/debounce-time.mjs +73 -0
  77. package/dist/core/operators/debounce-time.mjs.map +1 -0
  78. package/dist/core/operators/filter.d.mts +28 -0
  79. package/dist/core/operators/filter.d.mts.map +1 -0
  80. package/dist/core/operators/filter.mjs +38 -0
  81. package/dist/core/operators/filter.mjs.map +1 -0
  82. package/dist/core/operators/index.d.mts +18 -0
  83. package/dist/core/operators/index.d.mts.map +1 -0
  84. package/dist/core/operators/index.mjs +18 -0
  85. package/dist/core/operators/index.mjs.map +1 -0
  86. package/dist/core/operators/map-with-index.d.mts +39 -0
  87. package/dist/core/operators/map-with-index.d.mts.map +1 -0
  88. package/dist/core/operators/map-with-index.mjs +73 -0
  89. package/dist/core/operators/map-with-index.mjs.map +1 -0
  90. package/dist/core/operators/merge-map.d.mts +34 -0
  91. package/dist/core/operators/merge-map.d.mts.map +1 -0
  92. package/dist/core/operators/merge-map.mjs +75 -0
  93. package/dist/core/operators/merge-map.mjs.map +1 -0
  94. package/dist/core/operators/pairwise.d.mts +27 -0
  95. package/dist/core/operators/pairwise.d.mts.map +1 -0
  96. package/dist/core/operators/pairwise.mjs +59 -0
  97. package/dist/core/operators/pairwise.mjs.map +1 -0
  98. package/dist/core/operators/scan.d.mts +30 -0
  99. package/dist/core/operators/scan.d.mts.map +1 -0
  100. package/dist/core/operators/scan.mjs +56 -0
  101. package/dist/core/operators/scan.mjs.map +1 -0
  102. package/dist/core/operators/skip-if-no-change.d.mts +33 -0
  103. package/dist/core/operators/skip-if-no-change.d.mts.map +1 -0
  104. package/dist/core/operators/skip-if-no-change.mjs +68 -0
  105. package/dist/core/operators/skip-if-no-change.mjs.map +1 -0
  106. package/dist/core/operators/skip-until.d.mts +3 -0
  107. package/dist/core/operators/skip-until.d.mts.map +1 -0
  108. package/dist/core/operators/skip-until.mjs +33 -0
  109. package/dist/core/operators/skip-until.mjs.map +1 -0
  110. package/dist/core/operators/skip-while.d.mts +4 -0
  111. package/dist/core/operators/skip-while.d.mts.map +1 -0
  112. package/dist/core/operators/skip-while.mjs +40 -0
  113. package/dist/core/operators/skip-while.mjs.map +1 -0
  114. package/dist/core/operators/switch-map.d.mts +31 -0
  115. package/dist/core/operators/switch-map.d.mts.map +1 -0
  116. package/dist/core/operators/switch-map.mjs +70 -0
  117. package/dist/core/operators/switch-map.mjs.map +1 -0
  118. package/dist/core/operators/take-until.d.mts +32 -0
  119. package/dist/core/operators/take-until.d.mts.map +1 -0
  120. package/dist/core/operators/take-until.mjs +60 -0
  121. package/dist/core/operators/take-until.mjs.map +1 -0
  122. package/dist/core/operators/take-while.d.mts +4 -0
  123. package/dist/core/operators/take-while.d.mts.map +1 -0
  124. package/dist/core/operators/take-while.mjs +42 -0
  125. package/dist/core/operators/take-while.mjs.map +1 -0
  126. package/dist/core/operators/throttle-time.d.mts +23 -0
  127. package/dist/core/operators/throttle-time.d.mts.map +1 -0
  128. package/dist/core/operators/throttle-time.mjs +68 -0
  129. package/dist/core/operators/throttle-time.mjs.map +1 -0
  130. package/dist/core/operators/with-buffered-from.d.mts +4 -0
  131. package/dist/core/operators/with-buffered-from.d.mts.map +1 -0
  132. package/dist/core/operators/with-buffered-from.mjs +45 -0
  133. package/dist/core/operators/with-buffered-from.mjs.map +1 -0
  134. package/dist/core/operators/with-current-value-from.d.mts +4 -0
  135. package/dist/core/operators/with-current-value-from.d.mts.map +1 -0
  136. package/dist/core/operators/with-current-value-from.mjs +37 -0
  137. package/dist/core/operators/with-current-value-from.mjs.map +1 -0
  138. package/dist/core/operators/with-initial-value.d.mts +26 -0
  139. package/dist/core/operators/with-initial-value.d.mts.map +1 -0
  140. package/dist/core/operators/with-initial-value.mjs +47 -0
  141. package/dist/core/operators/with-initial-value.mjs.map +1 -0
  142. package/dist/core/types/id.d.mts +4 -0
  143. package/dist/core/types/id.d.mts.map +1 -0
  144. package/dist/core/types/id.mjs +2 -0
  145. package/dist/core/types/id.mjs.map +1 -0
  146. package/dist/core/types/index.d.mts +6 -0
  147. package/dist/core/types/index.d.mts.map +1 -0
  148. package/dist/core/types/index.mjs +3 -0
  149. package/dist/core/types/index.mjs.map +1 -0
  150. package/dist/core/types/observable-family.d.mts +68 -0
  151. package/dist/core/types/observable-family.d.mts.map +1 -0
  152. package/dist/core/types/observable-family.mjs +2 -0
  153. package/dist/core/types/observable-family.mjs.map +1 -0
  154. package/dist/core/types/observable-kind.d.mts +4 -0
  155. package/dist/core/types/observable-kind.d.mts.map +1 -0
  156. package/dist/core/types/observable-kind.mjs +2 -0
  157. package/dist/core/types/observable-kind.mjs.map +1 -0
  158. package/dist/core/types/observable.d.mts +83 -0
  159. package/dist/core/types/observable.d.mts.map +1 -0
  160. package/dist/core/types/observable.mjs +10 -0
  161. package/dist/core/types/observable.mjs.map +1 -0
  162. package/dist/core/types/types.d.mts +16 -0
  163. package/dist/core/types/types.d.mts.map +1 -0
  164. package/dist/core/types/types.mjs +2 -0
  165. package/dist/core/types/types.mjs.map +1 -0
  166. package/dist/core/utils/id-maker.d.mts +5 -0
  167. package/dist/core/utils/id-maker.d.mts.map +1 -0
  168. package/dist/core/utils/id-maker.mjs +17 -0
  169. package/dist/core/utils/id-maker.mjs.map +1 -0
  170. package/dist/core/utils/index.d.mts +5 -0
  171. package/dist/core/utils/index.d.mts.map +1 -0
  172. package/dist/core/utils/index.mjs +5 -0
  173. package/dist/core/utils/index.mjs.map +1 -0
  174. package/dist/core/utils/max-depth.d.mts +3 -0
  175. package/dist/core/utils/max-depth.d.mts.map +1 -0
  176. package/dist/core/utils/max-depth.mjs +8 -0
  177. package/dist/core/utils/max-depth.mjs.map +1 -0
  178. package/dist/core/utils/observable-utils.d.mts +3 -0
  179. package/dist/core/utils/observable-utils.d.mts.map +1 -0
  180. package/dist/core/utils/observable-utils.mjs +7 -0
  181. package/dist/core/utils/observable-utils.mjs.map +1 -0
  182. package/dist/core/utils/utils.d.mts +4 -0
  183. package/dist/core/utils/utils.d.mts.map +1 -0
  184. package/dist/core/utils/utils.mjs +38 -0
  185. package/dist/core/utils/utils.mjs.map +1 -0
  186. package/dist/entry-point.d.mts +2 -0
  187. package/dist/entry-point.d.mts.map +1 -0
  188. package/dist/entry-point.mjs +40 -0
  189. package/dist/entry-point.mjs.map +1 -0
  190. package/dist/globals.d.mts +4 -0
  191. package/dist/index.d.mts +3 -0
  192. package/dist/index.d.mts.map +1 -0
  193. package/dist/index.mjs +40 -0
  194. package/dist/index.mjs.map +1 -0
  195. package/dist/tsconfig.json +1 -0
  196. package/dist/types.d.mts +2 -0
  197. package/dist/utils/create-event-emitter.d.mts +39 -0
  198. package/dist/utils/create-event-emitter.d.mts.map +1 -0
  199. package/dist/utils/create-event-emitter.mjs +57 -0
  200. package/dist/utils/create-event-emitter.mjs.map +1 -0
  201. package/dist/utils/create-reducer.d.mts +34 -0
  202. package/dist/utils/create-reducer.d.mts.map +1 -0
  203. package/dist/utils/create-reducer.mjs +49 -0
  204. package/dist/utils/create-reducer.mjs.map +1 -0
  205. package/dist/utils/create-state.d.mts +61 -0
  206. package/dist/utils/create-state.d.mts.map +1 -0
  207. package/dist/utils/create-state.mjs +92 -0
  208. package/dist/utils/create-state.mjs.map +1 -0
  209. package/dist/utils/index.d.mts +4 -0
  210. package/dist/utils/index.d.mts.map +1 -0
  211. package/dist/utils/index.mjs +4 -0
  212. package/dist/utils/index.mjs.map +1 -0
  213. package/package.json +71 -0
  214. package/src/core/class/child-observable-class.mts +232 -0
  215. package/src/core/class/index.mts +3 -0
  216. package/src/core/class/observable-base-class.mts +186 -0
  217. package/src/core/class/observable.class.test.mts +89 -0
  218. package/src/core/class/root-observable-class.mts +68 -0
  219. package/src/core/combine/combine.mts +144 -0
  220. package/src/core/combine/index.mts +3 -0
  221. package/src/core/combine/merge.mts +84 -0
  222. package/src/core/combine/zip.mts +149 -0
  223. package/src/core/create/from-array.mts +58 -0
  224. package/src/core/create/from-promise.mts +58 -0
  225. package/src/core/create/from-subscribable.mts +37 -0
  226. package/src/core/create/index.mts +7 -0
  227. package/src/core/create/interval.mts +99 -0
  228. package/src/core/create/of.mts +54 -0
  229. package/src/core/create/source.mts +59 -0
  230. package/src/core/create/timer.mts +84 -0
  231. package/src/core/index.mts +6 -0
  232. package/src/core/operators/audit-time.mts +77 -0
  233. package/src/core/operators/debounce-time.mts +96 -0
  234. package/src/core/operators/filter.mts +125 -0
  235. package/src/core/operators/index.mts +17 -0
  236. package/src/core/operators/map-with-index.mts +168 -0
  237. package/src/core/operators/merge-map.mts +108 -0
  238. package/src/core/operators/pairwise.mts +77 -0
  239. package/src/core/operators/scan.mts +81 -0
  240. package/src/core/operators/skip-if-no-change.mts +91 -0
  241. package/src/core/operators/skip-until.mts +54 -0
  242. package/src/core/operators/skip-while.mts +77 -0
  243. package/src/core/operators/switch-map.mts +101 -0
  244. package/src/core/operators/take-until.mts +80 -0
  245. package/src/core/operators/take-while.mts +103 -0
  246. package/src/core/operators/throttle-time.mts +95 -0
  247. package/src/core/operators/with-buffered-from.mts +68 -0
  248. package/src/core/operators/with-current-value-from.mts +58 -0
  249. package/src/core/operators/with-initial-value.mts +76 -0
  250. package/src/core/types/id.mts +5 -0
  251. package/src/core/types/index.mts +5 -0
  252. package/src/core/types/observable-family.mts +259 -0
  253. package/src/core/types/observable-kind.mts +5 -0
  254. package/src/core/types/observable.mts +218 -0
  255. package/src/core/types/types.mts +40 -0
  256. package/src/core/utils/id-maker.mts +31 -0
  257. package/src/core/utils/index.mts +4 -0
  258. package/src/core/utils/max-depth.mts +7 -0
  259. package/src/core/utils/observable-utils.mts +10 -0
  260. package/src/core/utils/utils.mts +51 -0
  261. package/src/core/utils/utils.test.mts +88 -0
  262. package/src/entry-point.mts +1 -0
  263. package/src/globals.d.mts +4 -0
  264. package/src/index.mts +2 -0
  265. package/src/utils/create-event-emitter.mts +62 -0
  266. package/src/utils/create-reducer.mts +55 -0
  267. package/src/utils/create-state.mts +138 -0
  268. package/src/utils/index.mts +3 -0
@@ -0,0 +1,37 @@
1
+ import { type AsyncChildObservable, type ChildObservable, type InitializedObservable, type InitializedSyncChildObservable, type KeepInitialValueOperator, type NonEmptyUnknownList, type Observable, type ObservableId, type Operator, type SyncChildObservable, type WithInitialValueOperator, type Wrap } from '../types/index.mjs';
2
+ import { ObservableBaseClass } from './observable-base-class.mjs';
3
+ export declare class AsyncChildObservableClass<A, const P extends NonEmptyUnknownList> extends ObservableBaseClass<A, 'async child', number> implements AsyncChildObservable<A, P> {
4
+ #private;
5
+ readonly parents: Readonly<{ [P_1 in keyof P]: Observable<P[P_1]>; }>;
6
+ protected readonly descendantsIdSet: MutableSet<ObservableId>;
7
+ constructor({ parents, depth, initialValue, }: Readonly<{
8
+ parents: Wrap<P>;
9
+ depth?: number;
10
+ initialValue: ReturnType<AsyncChildObservable<A>['getSnapshot']>;
11
+ }>);
12
+ addDescendant<B>(child: ChildObservable<B>): void;
13
+ startUpdate(nextValue: A): void;
14
+ complete(): void;
15
+ tryComplete(): void;
16
+ }
17
+ export declare class SyncChildObservableClass<A, const P extends NonEmptyUnknownList> extends ObservableBaseClass<A, 'sync child', number> implements SyncChildObservable<A, P> {
18
+ readonly parents: Readonly<{ [P_1 in keyof P]: Observable<P[P_1]>; }>;
19
+ constructor({ parents, depth, initialValue, }: Readonly<{
20
+ parents: Wrap<P>;
21
+ depth?: number;
22
+ initialValue: ReturnType<SyncChildObservable<A>['getSnapshot']>;
23
+ }>);
24
+ complete(): void;
25
+ tryComplete(): void;
26
+ }
27
+ export declare class InitializedSyncChildObservableClass<A, const P extends NonEmptyUnknownList> extends SyncChildObservableClass<A, P> implements InitializedSyncChildObservable<A, P> {
28
+ constructor({ parents, depth, initialValue, }: Readonly<{
29
+ parents: Wrap<P>;
30
+ depth?: number;
31
+ initialValue: ReturnType<InitializedSyncChildObservable<A>['getSnapshot']>;
32
+ }>);
33
+ getSnapshot(): Some<A>;
34
+ pipe<B>(operator: KeepInitialValueOperator<A, B> | WithInitialValueOperator<A, B>): InitializedObservable<B>;
35
+ pipe<B>(operator: Operator<A, B>): Observable<B>;
36
+ }
37
+ //# sourceMappingURL=child-observable-class.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"child-observable-class.d.mts","sourceRoot":"","sources":["../../../src/core/class/child-observable-class.mts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,8BAA8B,EACnC,KAAK,wBAAwB,EAC7B,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,IAAI,EACV,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAwDlE,qBAAa,yBAAyB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,SAAS,mBAAmB,CAC3E,SAAQ,mBAAmB,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CACpD,YAAW,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC;;IAErC,QAAQ,CAAC,OAAO,sDAAC;IAEjB,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;gBAElD,EACV,OAAO,EACP,KAA6B,EAC7B,YAAY,GACb,EAAE,QAAQ,CAAC;QACV,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,UAAU,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;KAClE,CAAC;IAiBF,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI;IAajD,WAAW,CAAC,SAAS,EAAE,CAAC,GAAG,IAAI;IAUtB,QAAQ,IAAI,IAAI;IAShB,WAAW,IAAI,IAAI;CAU7B;AAED,qBAAa,wBAAwB,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,SAAS,mBAAmB,CAC1E,SAAQ,mBAAmB,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CACnD,YAAW,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC;IAEpC,QAAQ,CAAC,OAAO,sDAAC;gBAEL,EACV,OAAO,EACP,KAA6B,EAC7B,YAAY,GACb,EAAE,QAAQ,CAAC;QACV,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,UAAU,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;KACjE,CAAC;IAYO,QAAQ,IAAI,IAAI;IAQhB,WAAW,IAAI,IAAI;CAU7B;AAED,qBAAa,mCAAmC,CAC9C,CAAC,EACD,KAAK,CAAC,CAAC,SAAS,mBAAmB,CAEnC,SAAQ,wBAAwB,CAAC,CAAC,EAAE,CAAC,CACrC,YAAW,8BAA8B,CAAC,CAAC,EAAE,CAAC,CAAC;gBAEnC,EACV,OAAO,EACP,KAA6B,EAC7B,YAAY,GACb,EAAE,QAAQ,CAAC;QACV,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,UAAU,CAAC,8BAA8B,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;KAC5E,CAAC;IAIO,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC;IAKtB,IAAI,CAAC,CAAC,EACb,QAAQ,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,GACxE,qBAAqB,CAAC,CAAC,CAAC;IAElB,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;CAO1D"}
@@ -0,0 +1,134 @@
1
+ import { Arr } from 'ts-data-forge';
2
+ import { isManagerObservable } from '../types/observable.mjs';
3
+ import { issueUpdaterSymbol } from '../utils/id-maker.mjs';
4
+ import { maxDepth } from '../utils/max-depth.mjs';
5
+ import { binarySearch } from '../utils/utils.mjs';
6
+ import { ObservableBaseClass } from './observable-base-class.mjs';
7
+
8
+ const registerChild = (child, parents) => {
9
+ for (const p of parents) {
10
+ p.addChild(child);
11
+ }
12
+ // register child to all reachable ManagerObservables
13
+ const mut_rest = Array.from(parents);
14
+ while (Arr.isNonEmpty(mut_rest)) {
15
+ const p = mut_rest.pop();
16
+ if (p === undefined)
17
+ break;
18
+ if (isManagerObservable(p)) {
19
+ p.addDescendant(child);
20
+ }
21
+ else {
22
+ // trace back dependency graph
23
+ mut_rest.push(...p.parents);
24
+ }
25
+ }
26
+ };
27
+ const tryComplete = ({ hasSubscriber, hasActiveChild, parents, complete, }) => {
28
+ // If there is no working parent node
29
+ if (parents.every((r) => r.isCompleted)) {
30
+ complete();
31
+ return;
32
+ }
33
+ // If there are no active child node
34
+ if (!hasSubscriber && !hasActiveChild) {
35
+ complete();
36
+ }
37
+ // propagate to parents
38
+ for (const par of parents) {
39
+ par.tryComplete();
40
+ }
41
+ };
42
+ class AsyncChildObservableClass extends ObservableBaseClass {
43
+ parents;
44
+ #mut_procedure;
45
+ descendantsIdSet;
46
+ constructor({ parents, depth = 1 + maxDepth(parents), initialValue, }) {
47
+ super({
48
+ kind: 'async child',
49
+ depth,
50
+ initialValue,
51
+ });
52
+ this.parents = parents;
53
+ this.#mut_procedure = [];
54
+ this.descendantsIdSet = new Set();
55
+ registerChild(this, parents);
56
+ }
57
+ // overload
58
+ addDescendant(child) {
59
+ if (this.descendantsIdSet.has(child.id))
60
+ return;
61
+ this.descendantsIdSet.add(child.id);
62
+ const insertPos = binarySearch(this.#mut_procedure.map((a) => a.depth), child.depth);
63
+ this.#mut_procedure = Arr.toInserted(this.#mut_procedure, insertPos, child);
64
+ }
65
+ startUpdate(nextValue) {
66
+ const updaterSymbol = issueUpdaterSymbol();
67
+ this.setNext(nextValue, updaterSymbol);
68
+ for (const p of this.#mut_procedure) {
69
+ p.tryUpdate(updaterSymbol);
70
+ }
71
+ }
72
+ complete() {
73
+ super.complete();
74
+ // propagate to parents
75
+ for (const par of this.parents) {
76
+ par.tryComplete();
77
+ }
78
+ }
79
+ tryComplete() {
80
+ tryComplete({
81
+ complete: () => {
82
+ this.complete();
83
+ },
84
+ hasActiveChild: this.hasActiveChild(),
85
+ hasSubscriber: this.hasSubscriber,
86
+ parents: this.parents,
87
+ });
88
+ }
89
+ }
90
+ class SyncChildObservableClass extends ObservableBaseClass {
91
+ parents;
92
+ constructor({ parents, depth = 1 + maxDepth(parents), initialValue, }) {
93
+ super({
94
+ kind: 'sync child',
95
+ depth,
96
+ initialValue,
97
+ });
98
+ this.parents = parents;
99
+ registerChild(this, parents);
100
+ }
101
+ complete() {
102
+ super.complete();
103
+ for (const par of this.parents) {
104
+ par.tryComplete();
105
+ }
106
+ }
107
+ tryComplete() {
108
+ tryComplete({
109
+ complete: () => {
110
+ this.complete();
111
+ },
112
+ hasActiveChild: this.hasActiveChild(),
113
+ hasSubscriber: this.hasSubscriber,
114
+ parents: this.parents,
115
+ });
116
+ }
117
+ }
118
+ class InitializedSyncChildObservableClass extends SyncChildObservableClass {
119
+ constructor({ parents, depth = 1 + maxDepth(parents), initialValue, }) {
120
+ super({ parents, depth, initialValue });
121
+ }
122
+ getSnapshot() {
123
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
124
+ return super.getCurrentValue();
125
+ }
126
+ pipe(operator) {
127
+ return operator(
128
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
129
+ this);
130
+ }
131
+ }
132
+
133
+ export { AsyncChildObservableClass, InitializedSyncChildObservableClass, SyncChildObservableClass };
134
+ //# sourceMappingURL=child-observable-class.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"child-observable-class.mjs","sources":["../../../src/core/class/child-observable-class.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,4 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -0,0 +1,28 @@
1
+ import { type ChildObservable, type InitializedObservable, type Observable, type ObservableBase, type Operator, type Subscription, type UpdaterSymbol, 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 updaterSymbol(): UpdaterSymbol;
17
+ get hasSubscriber(): boolean;
18
+ get hasChild(): boolean;
19
+ hasActiveChild(): boolean;
20
+ protected setNext(nextValue: A, updaterSymbol: UpdaterSymbol): void;
21
+ tryUpdate(_updaterSymbol: UpdaterSymbol): 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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observable-base-class.d.mts","sourceRoot":"","sources":["../../../src/core/class/observable-base-class.mts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,QAAQ,EAGb,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,wBAAwB,EAC9B,MAAM,oBAAoB,CAAC;AAQ5B,qBAAa,mBAAmB,CAC9B,CAAC,EACD,IAAI,SAAS,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EACtC,KAAK,SAAS,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CACxC,YAAW,cAAc,CAAC,CAAC,CAAC;;IAC5B,QAAQ,CAAC,EAAE,yCAAC;IACZ,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;gBAOV,EACV,IAAI,EACJ,KAAK,EACL,YAAY,GACb,EAAE,QAAQ,CAAC;QACV,IAAI,EAAE,IAAI,CAAC;QACX,KAAK,EAAE,KAAK,CAAC;QACb,YAAY,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;KAC5D,CAAC;IAkBF,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI;IAQ5C,WAAW,IAAI,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAI3D,SAAS,CAAC,eAAe,IAAI,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAIzE,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,aAAa,IAAI,aAAa,CAEjC;IAED,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,cAAc,IAAI,OAAO;IAIzB,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,aAAa,EAAE,aAAa,GAAG,IAAI;IAWnE,SAAS,CAAC,cAAc,EAAE,aAAa,GAAG,IAAI;IAI9C,WAAW,IAAI,IAAI;IAMnB,QAAQ,IAAI,IAAI;IAoBhB,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC;IAC3E,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;IAQhD,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,IAAI,GAAG,YAAY;CAuCzE"}
@@ -0,0 +1,116 @@
1
+ import { Arr, Optional } from 'ts-data-forge';
2
+ import { issueObservableId, issueUpdaterSymbol, issueSubscriberId } from '../utils/id-maker.mjs';
3
+ import { toSubscriber } from '../utils/observable-utils.mjs';
4
+
5
+ class ObservableBaseClass {
6
+ id;
7
+ kind;
8
+ depth;
9
+ #mut_children;
10
+ #subscribers;
11
+ #mut_currentValue;
12
+ #mut_isCompleted;
13
+ #mut_updaterSymbol;
14
+ constructor({ kind, depth, initialValue, }) {
15
+ this.kind = kind;
16
+ this.depth = depth;
17
+ this.id = issueObservableId();
18
+ this.#mut_currentValue = initialValue;
19
+ this.#mut_children = [];
20
+ this.#subscribers = new Map();
21
+ this.#mut_isCompleted = false;
22
+ this.#mut_updaterSymbol = issueUpdaterSymbol();
23
+ }
24
+ addChild(child) {
25
+ this.#mut_children = Arr.toPushed(this.#mut_children, child);
26
+ }
27
+ getSnapshot() {
28
+ return this.#mut_currentValue;
29
+ }
30
+ getCurrentValue() {
31
+ return this.#mut_currentValue;
32
+ }
33
+ get isCompleted() {
34
+ return this.#mut_isCompleted;
35
+ }
36
+ get updaterSymbol() {
37
+ return this.#mut_updaterSymbol;
38
+ }
39
+ get hasSubscriber() {
40
+ return this.#subscribers.size > 0;
41
+ }
42
+ get hasChild() {
43
+ return Arr.isNonEmpty(this.#mut_children);
44
+ }
45
+ hasActiveChild() {
46
+ return this.#mut_children.some((c) => !c.isCompleted);
47
+ }
48
+ setNext(nextValue, updaterSymbol) {
49
+ this.#mut_updaterSymbol = updaterSymbol;
50
+ this.#mut_currentValue = Optional.some(nextValue);
51
+ for (const s of this.#subscribers.values()) {
52
+ s.onNext(nextValue);
53
+ }
54
+ }
55
+ // eslint-disable-next-line @typescript-eslint/class-methods-use-this
56
+ tryUpdate(_updaterSymbol) {
57
+ throw new Error('not implemented');
58
+ }
59
+ tryComplete() {
60
+ if (!this.hasSubscriber && !this.hasActiveChild()) {
61
+ this.complete();
62
+ }
63
+ }
64
+ complete() {
65
+ if (this.isCompleted)
66
+ return; // terminate only once
67
+ // change state
68
+ this.#mut_isCompleted = true;
69
+ // run subscribers for the current value
70
+ for (const s of this.#subscribers.values()) {
71
+ s.onComplete();
72
+ }
73
+ // remove all subscribers
74
+ this.#subscribers.clear();
75
+ // propagate to children
76
+ for (const o of this.#mut_children) {
77
+ o.tryComplete();
78
+ }
79
+ }
80
+ pipe(operator) {
81
+ return operator(
82
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
83
+ this);
84
+ }
85
+ subscribe(onNext, onComplete) {
86
+ // first emit
87
+ const curr = this.getSnapshot();
88
+ if (Optional.isSome(curr)) {
89
+ onNext(curr.value);
90
+ }
91
+ if (this.isCompleted) {
92
+ if (onComplete !== undefined) {
93
+ onComplete();
94
+ }
95
+ return { unsubscribe: () => { } };
96
+ }
97
+ const id = this.#addSubscriber(toSubscriber(onNext, onComplete));
98
+ return {
99
+ unsubscribe: () => {
100
+ this.#removeSubscriber(id);
101
+ },
102
+ };
103
+ }
104
+ #addSubscriber(s) {
105
+ // return the id of added subscriber
106
+ const id = issueSubscriberId();
107
+ this.#subscribers.set(id, s);
108
+ return id;
109
+ }
110
+ #removeSubscriber(id) {
111
+ this.#subscribers.delete(id);
112
+ }
113
+ }
114
+
115
+ export { ObservableBaseClass };
116
+ //# sourceMappingURL=observable-base-class.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observable-base-class.mjs","sources":["../../../src/core/class/observable-base-class.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type ChildObservable, type ObservableId, type RootObservable } from '../types/index.mjs';
2
+ import { ObservableBaseClass } from './observable-base-class.mjs';
3
+ export declare class RootObservableClass<A> extends ObservableBaseClass<A, 'root', 0> implements RootObservable<A> {
4
+ #private;
5
+ protected readonly _descendantsIdSet: MutableSet<ObservableId>;
6
+ constructor({ initialValue, }: Readonly<{
7
+ initialValue: ReturnType<RootObservable<A>['getSnapshot']>;
8
+ }>);
9
+ addDescendant<B>(child: ChildObservable<B>): void;
10
+ startUpdate(nextValue: A): void;
11
+ }
12
+ //# sourceMappingURL=root-observable-class.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-observable-class.d.mts","sourceRoot":"","sources":["../../../src/core/class/root-observable-class.mts"],"names":[],"mappings":"AACA,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;gBAEnD,EACV,YAAY,GACb,EAAE,QAAQ,CAAC;QACV,YAAY,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;KAC5D,CAAC;IAYF,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI;IAajD,WAAW,CAAC,SAAS,EAAE,CAAC,GAAG,IAAI;CAShC"}
@@ -0,0 +1,35 @@
1
+ import { Arr } from 'ts-data-forge';
2
+ import { issueUpdaterSymbol } 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_procedure;
8
+ _descendantsIdSet;
9
+ constructor({ initialValue, }) {
10
+ super({
11
+ kind: 'root',
12
+ depth: 0,
13
+ initialValue,
14
+ });
15
+ this.#mut_procedure = [];
16
+ this._descendantsIdSet = new Set();
17
+ }
18
+ addDescendant(child) {
19
+ if (this._descendantsIdSet.has(child.id))
20
+ return;
21
+ this._descendantsIdSet.add(child.id);
22
+ const insertPos = binarySearch(this.#mut_procedure.map((a) => a.depth), child.depth);
23
+ this.#mut_procedure = Arr.toInserted(this.#mut_procedure, insertPos, child);
24
+ }
25
+ startUpdate(nextValue) {
26
+ const updaterSymbol = issueUpdaterSymbol();
27
+ this.setNext(nextValue, updaterSymbol);
28
+ for (const p of this.#mut_procedure) {
29
+ p.tryUpdate(updaterSymbol);
30
+ }
31
+ }
32
+ }
33
+
34
+ export { RootObservableClass };
35
+ //# sourceMappingURL=root-observable-class.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-observable-class.mjs","sources":["../../../src/core/class/root-observable-class.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAUM,MAAO,mBACX,SAAQ,mBAAiC,CAAA;AAGzC,IAAA,cAAc;AACK,IAAA,iBAAiB;IAEpC,WAAA,CAAY,EACV,YAAY,GAGZ,EAAA;AACA,QAAA,KAAK,CAAC;AACJ,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,KAAK,EAAE,CAAC;YACR,YAAY;AACb,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE;AAExB,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,GAAG,EAAgB;IAClD;AAEA,IAAA,aAAa,CAAI,KAAyB,EAAA;QACxC,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAAE;QAE1C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAEpC,MAAM,SAAS,GAAG,YAAY,CAC5B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,EACvC,KAAK,CAAC,KAAK,CACZ;AAED,QAAA,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,EAAE,KAAK,CAAC;IAC7E;AAEA,IAAA,WAAW,CAAC,SAAY,EAAA;AACtB,QAAA,MAAM,aAAa,GAAG,kBAAkB,EAAE;AAE1C,QAAA,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC;AAEtC,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE;AACnC,YAAA,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC;QAC5B;IACF;AACD;;;;"}
@@ -0,0 +1,35 @@
1
+ import { type CombineObservableRefined, type Observable } from '../types/index.mjs';
2
+ /**
3
+ * Combines multiple observables into a single observable that emits an array of their latest values.
4
+ * Emits whenever any of the source observables emit, but only after all sources have emitted at least once.
5
+ *
6
+ * @template OS - Tuple type of source observables
7
+ * @param parents - Array of observables to combine
8
+ * @returns A combined observable emitting tuples of values
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const name$ = source<string>();
13
+ *
14
+ * const age$ = source<number>();
15
+ *
16
+ * const user$ = combine([name$, age$]);
17
+ *
18
+ * user$.subscribe(([name_, age]) => {
19
+ * console.log({ name: name_, age });
20
+ * });
21
+ *
22
+ * name$.next('Alice');
23
+ *
24
+ * age$.next(25); // logs: { name: 'Alice', age: 25 }
25
+ *
26
+ * name$.next('Bob'); // logs: { name: 'Bob', age: 25 }
27
+ * ```
28
+ */
29
+ export declare const combine: <const OS extends NonEmptyArray<Observable<unknown>>>(parents: OS) => CombineObservableRefined<OS>;
30
+ /**
31
+ * Alias for `combine()`.
32
+ * @see combine
33
+ */
34
+ export declare const combineLatest: <const OS extends NonEmptyArray<Observable<unknown>>>(parents: OS) => CombineObservableRefined<OS>;
35
+ //# sourceMappingURL=combine.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combine.d.mts","sourceRoot":"","sources":["../../../src/core/combine/combine.mts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,wBAAwB,EAI7B,KAAK,UAAU,EAIhB,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,OAAO,GAAI,KAAK,CAAC,EAAE,SAAS,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EACzE,SAAS,EAAE,KACV,wBAAwB,CAAC,EAAE,CAIgB,CAAC;AAE/C;;;GAGG;AACH,eAAO,MAAM,aAAa,SAZI,EAAE,SAAS,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,WAChE,EAAE,KACV,wBAAwB,CAAC,EAAE,CAUM,CAAC"}
@@ -0,0 +1,94 @@
1
+ import { Optional, Arr } from 'ts-data-forge';
2
+ import { SyncChildObservableClass } from '../class/child-observable-class.mjs';
3
+ import '../utils/id-maker.mjs';
4
+ import { fromArray } from '../create/from-array.mjs';
5
+ import { source } from '../create/source.mjs';
6
+ import { withInitialValue } from '../operators/with-initial-value.mjs';
7
+
8
+ /**
9
+ * Combines multiple observables into a single observable that emits an array of their latest values.
10
+ * Emits whenever any of the source observables emit, but only after all sources have emitted at least once.
11
+ *
12
+ * @template OS - Tuple type of source observables
13
+ * @param parents - Array of observables to combine
14
+ * @returns A combined observable emitting tuples of values
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * const name$ = source<string>();
19
+ *
20
+ * const age$ = source<number>();
21
+ *
22
+ * const user$ = combine([name$, age$]);
23
+ *
24
+ * user$.subscribe(([name_, age]) => {
25
+ * console.log({ name: name_, age });
26
+ * });
27
+ *
28
+ * name$.next('Alice');
29
+ *
30
+ * age$.next(25); // logs: { name: 'Alice', age: 25 }
31
+ *
32
+ * name$.next('Bob'); // logs: { name: 'Bob', age: 25 }
33
+ * ```
34
+ */
35
+ const combine = (parents) =>
36
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
37
+ new CombineObservableClass(parents);
38
+ /**
39
+ * Alias for `combine()`.
40
+ * @see combine
41
+ */
42
+ const combineLatest = combine; // alias
43
+ class CombineObservableClass extends SyncChildObservableClass {
44
+ constructor(parents) {
45
+ const parentsValues = parents.map((p) => p.getSnapshot());
46
+ super({
47
+ parents,
48
+ initialValue: parentsValues.every(Optional.isSome)
49
+ ? Optional.some(
50
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
51
+ Arr.map(parentsValues, (c) => c.value))
52
+ : Optional.none,
53
+ });
54
+ }
55
+ tryUpdate(updaterSymbol) {
56
+ if (this.parents.every((o) => o.updaterSymbol !== updaterSymbol))
57
+ return; // all parents are skipped
58
+ const parentValues = this.parents.map((a) => a.getSnapshot());
59
+ if (parentValues.every(Optional.isSome)) {
60
+ const nextValue =
61
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
62
+ Arr.map(parentValues, (a) => a.value);
63
+ this.setNext(nextValue, updaterSymbol);
64
+ }
65
+ }
66
+ }
67
+ {
68
+ {
69
+ const s1 = source();
70
+ const s2 = source();
71
+ combine([s1, s2]);
72
+ }
73
+ {
74
+ const s1 = source().pipe(withInitialValue(1));
75
+ const s2 = source();
76
+ combine([s1, s2]);
77
+ }
78
+ {
79
+ const s1 = source().pipe(withInitialValue(1));
80
+ const s2 = source().pipe(withInitialValue(2));
81
+ combine([s1, s2]);
82
+ // Returns InitializedObservable if all OS are InitializedObservable
83
+ }
84
+ const r1 = fromArray([1, 2, 3]);
85
+ const r2 = fromArray(['a', 'b', 'c']);
86
+ combine([r1, r2]);
87
+ combine([
88
+ r1.pipe(withInitialValue(0)),
89
+ r2.pipe(withInitialValue(0)),
90
+ ]);
91
+ }
92
+
93
+ export { combine, combineLatest };
94
+ //# sourceMappingURL=combine.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combine.mjs","sources":["../../../src/core/combine/combine.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;AAgBA;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BG;AACI,MAAM,OAAO,GAAG,CACrB,OAAW;AAEX;AACA,IAAI,sBAAsB,CACxB,OAAO;AAGX;;;AAGG;AACI,MAAM,aAAa,GAAG,QAAQ;AAErC,MAAM,sBACJ,SAAQ,wBAA8B,CAAA;AAGtC,IAAA,WAAA,CAAY,OAAgB,EAAA;AAC1B,QAAA,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;AAEzD,QAAA,KAAK,CAAC;YACJ,OAAO;YACP,YAAY,EAAE,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM;kBAC7C,QAAQ,CAAC,IAAI;;AAEX,gBAAA,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAM;kBAE7C,QAAQ,CAAC,IAAI;AAClB,SAAA,CAAC;;AAGK,IAAA,SAAS,CAAC,aAA4B,EAAA;AAC7C,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,aAAa,KAAK,aAAa,CAAC;AAAE,YAAA,OAAO;AAEzE,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QAE7D,IAAI,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACvC,YAAA,MAAM,SAAS;;AAEb,YAAA,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAM;AAE5C,YAAA,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC;;;AAG3C;AAED;IACE;AACE,QAAA,MAAM,EAAE,GAAkB,MAAM,EAAK;AAErC,QAAA,MAAM,EAAE,GAAkB,MAAM,EAAK;QAE1B,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;;IAO7B;AACE,QAAA,MAAM,EAAE,GAA6B,MAAM,EAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAE1E,QAAA,MAAM,EAAE,GAAkB,MAAM,EAAK;QAE1B,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;;IAO7B;AACE,QAAA,MAAM,EAAE,GAA6B,MAAM,EAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAE1E,QAAA,MAAM,EAAE,GAA6B,MAAM,EAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAE/D,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;;;AAM7B,IAAA,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAE/B,IAAA,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAE1B,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;IAEf,OAAO,CAAC;AAClB,QAAA,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAC5B,QAAA,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAC7B,KAAA;AAQH;;;;"}
@@ -0,0 +1,4 @@
1
+ export * from './combine.mjs';
2
+ export * from './merge.mjs';
3
+ export * from './zip.mjs';
4
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../../src/core/combine/index.mts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC"}
@@ -0,0 +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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
@@ -0,0 +1,28 @@
1
+ import { type MergeObservableRefined, type Observable } from '../types/index.mjs';
2
+ /**
3
+ * Merges multiple observables into a single observable that emits all values from all sources.
4
+ * Emits whenever any source observable emits a value.
5
+ *
6
+ * @template OS - Tuple type of source observables
7
+ * @param parents - Array of observables to merge
8
+ * @returns A merged observable emitting values from any source
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const clicks$ = source<MouseEvent>();
13
+ *
14
+ * const keys$ = source<KeyboardEvent>();
15
+ *
16
+ * const events$ = merge([clicks$, keys$]);
17
+ *
18
+ * events$.subscribe((event_) => {
19
+ * console.log(event_);
20
+ * });
21
+ * // Logs any mouse click or keyboard event
22
+ * ```
23
+ *
24
+ * @note To improve code readability, consider using `createState` instead of `merge`,
25
+ * subscribing to `parents` and calling `setState` within it.
26
+ */
27
+ export declare const merge: <const OS extends NonEmptyArray<Observable<unknown>>>(parents: OS) => MergeObservableRefined<OS>;
28
+ //# sourceMappingURL=merge.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.mts","sourceRoot":"","sources":["../../../src/core/combine/merge.mts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,sBAAsB,EAE3B,KAAK,UAAU,EAIhB,MAAM,oBAAoB,CAAC;AAE5B;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,KAAK,GAAI,KAAK,CAAC,EAAE,SAAS,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EACvE,SAAS,EAAE,KACV,sBAAsB,CAAC,EAAE,CAEqC,CAAC"}