synstate 0.1.0 → 0.1.2

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 (235) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +272 -532
  3. package/assets/synstate-icon.png +0 -0
  4. package/dist/core/combine/combine.d.mts +33 -3
  5. package/dist/core/combine/combine.d.mts.map +1 -1
  6. package/dist/core/combine/combine.mjs +34 -4
  7. package/dist/core/combine/combine.mjs.map +1 -1
  8. package/dist/core/combine/merge.d.mts +30 -4
  9. package/dist/core/combine/merge.d.mts.map +1 -1
  10. package/dist/core/combine/merge.mjs +30 -4
  11. package/dist/core/combine/merge.mjs.map +1 -1
  12. package/dist/core/combine/zip.d.mts +28 -3
  13. package/dist/core/combine/zip.d.mts.map +1 -1
  14. package/dist/core/combine/zip.mjs +28 -3
  15. package/dist/core/combine/zip.mjs.map +1 -1
  16. package/dist/core/create/from-array.d.mts +21 -3
  17. package/dist/core/create/from-array.d.mts.map +1 -1
  18. package/dist/core/create/from-array.mjs +21 -3
  19. package/dist/core/create/from-array.mjs.map +1 -1
  20. package/dist/core/create/from-promise.d.mts +29 -7
  21. package/dist/core/create/from-promise.d.mts.map +1 -1
  22. package/dist/core/create/from-promise.mjs +29 -7
  23. package/dist/core/create/from-promise.mjs.map +1 -1
  24. package/dist/core/create/from-subscribable.d.mts +58 -0
  25. package/dist/core/create/from-subscribable.d.mts.map +1 -1
  26. package/dist/core/create/from-subscribable.mjs +58 -0
  27. package/dist/core/create/from-subscribable.mjs.map +1 -1
  28. package/dist/core/create/interval.d.mts +29 -4
  29. package/dist/core/create/interval.d.mts.map +1 -1
  30. package/dist/core/create/interval.mjs +29 -4
  31. package/dist/core/create/interval.mjs.map +1 -1
  32. package/dist/core/create/of.d.mts +22 -3
  33. package/dist/core/create/of.d.mts.map +1 -1
  34. package/dist/core/create/of.mjs +22 -3
  35. package/dist/core/create/of.mjs.map +1 -1
  36. package/dist/core/create/source.d.mts +21 -2
  37. package/dist/core/create/source.d.mts.map +1 -1
  38. package/dist/core/create/source.mjs +2 -2
  39. package/dist/core/create/source.mjs.map +1 -1
  40. package/dist/core/create/timer.d.mts +23 -4
  41. package/dist/core/create/timer.d.mts.map +1 -1
  42. package/dist/core/create/timer.mjs +23 -4
  43. package/dist/core/create/timer.mjs.map +1 -1
  44. package/dist/core/index.d.mts +1 -0
  45. package/dist/core/index.d.mts.map +1 -1
  46. package/dist/core/index.mjs +15 -3
  47. package/dist/core/index.mjs.map +1 -1
  48. package/dist/core/operators/audit-time.d.mts +59 -0
  49. package/dist/core/operators/audit-time.d.mts.map +1 -1
  50. package/dist/core/operators/audit-time.mjs +59 -0
  51. package/dist/core/operators/audit-time.mjs.map +1 -1
  52. package/dist/core/operators/debounce-time.d.mts +22 -2
  53. package/dist/core/operators/debounce-time.d.mts.map +1 -1
  54. package/dist/core/operators/debounce-time.mjs +22 -2
  55. package/dist/core/operators/debounce-time.mjs.map +1 -1
  56. package/dist/core/operators/filter.d.mts +26 -1
  57. package/dist/core/operators/filter.d.mts.map +1 -1
  58. package/dist/core/operators/filter.mjs.map +1 -1
  59. package/dist/core/operators/index.mjs +3 -3
  60. package/dist/core/operators/map-with-index.d.mts +19 -17
  61. package/dist/core/operators/map-with-index.d.mts.map +1 -1
  62. package/dist/core/operators/map-with-index.mjs +21 -23
  63. package/dist/core/operators/map-with-index.mjs.map +1 -1
  64. package/dist/core/operators/merge-map.d.mts +48 -6
  65. package/dist/core/operators/merge-map.d.mts.map +1 -1
  66. package/dist/core/operators/merge-map.mjs +48 -6
  67. package/dist/core/operators/merge-map.mjs.map +1 -1
  68. package/dist/core/operators/pairwise.d.mts +30 -1
  69. package/dist/core/operators/pairwise.d.mts.map +1 -1
  70. package/dist/core/operators/pairwise.mjs +30 -1
  71. package/dist/core/operators/pairwise.mjs.map +1 -1
  72. package/dist/core/operators/scan.d.mts +23 -1
  73. package/dist/core/operators/scan.d.mts.map +1 -1
  74. package/dist/core/operators/scan.mjs +23 -1
  75. package/dist/core/operators/scan.mjs.map +1 -1
  76. package/dist/core/operators/skip-if-no-change.d.mts +26 -2
  77. package/dist/core/operators/skip-if-no-change.d.mts.map +1 -1
  78. package/dist/core/operators/skip-if-no-change.mjs +27 -3
  79. package/dist/core/operators/skip-if-no-change.mjs.map +1 -1
  80. package/dist/core/operators/skip-until.d.mts +50 -0
  81. package/dist/core/operators/skip-until.d.mts.map +1 -1
  82. package/dist/core/operators/skip-until.mjs +50 -0
  83. package/dist/core/operators/skip-until.mjs.map +1 -1
  84. package/dist/core/operators/skip-while.d.mts +48 -1
  85. package/dist/core/operators/skip-while.d.mts.map +1 -1
  86. package/dist/core/operators/skip-while.mjs +50 -5
  87. package/dist/core/operators/skip-while.mjs.map +1 -1
  88. package/dist/core/operators/switch-map.d.mts +39 -5
  89. package/dist/core/operators/switch-map.d.mts.map +1 -1
  90. package/dist/core/operators/switch-map.mjs +39 -5
  91. package/dist/core/operators/switch-map.mjs.map +1 -1
  92. package/dist/core/operators/take-until.d.mts +20 -1
  93. package/dist/core/operators/take-until.d.mts.map +1 -1
  94. package/dist/core/operators/take-until.mjs +20 -1
  95. package/dist/core/operators/take-until.mjs.map +1 -1
  96. package/dist/core/operators/take-while.d.mts +47 -1
  97. package/dist/core/operators/take-while.d.mts.map +1 -1
  98. package/dist/core/operators/take-while.mjs +48 -3
  99. package/dist/core/operators/take-while.mjs.map +1 -1
  100. package/dist/core/operators/throttle-time.d.mts +44 -5
  101. package/dist/core/operators/throttle-time.d.mts.map +1 -1
  102. package/dist/core/operators/throttle-time.mjs +44 -5
  103. package/dist/core/operators/throttle-time.mjs.map +1 -1
  104. package/dist/core/operators/with-buffered-from.d.mts +57 -0
  105. package/dist/core/operators/with-buffered-from.d.mts.map +1 -1
  106. package/dist/core/operators/with-buffered-from.mjs +58 -1
  107. package/dist/core/operators/with-buffered-from.mjs.map +1 -1
  108. package/dist/core/operators/with-current-value-from.d.mts +59 -0
  109. package/dist/core/operators/with-current-value-from.d.mts.map +1 -1
  110. package/dist/core/operators/with-current-value-from.mjs +60 -1
  111. package/dist/core/operators/with-current-value-from.mjs.map +1 -1
  112. package/dist/core/operators/with-initial-value.d.mts +24 -2
  113. package/dist/core/operators/with-initial-value.d.mts.map +1 -1
  114. package/dist/core/operators/with-initial-value.mjs +24 -2
  115. package/dist/core/operators/with-initial-value.mjs.map +1 -1
  116. package/dist/core/predefined/index.d.mts +2 -0
  117. package/dist/core/predefined/index.d.mts.map +1 -0
  118. package/dist/core/predefined/index.mjs +13 -0
  119. package/dist/core/predefined/index.mjs.map +1 -0
  120. package/dist/core/predefined/operators/attach-index.d.mts +8 -0
  121. package/dist/core/predefined/operators/attach-index.d.mts.map +1 -0
  122. package/dist/core/predefined/operators/attach-index.mjs +13 -0
  123. package/dist/core/predefined/operators/attach-index.mjs.map +1 -0
  124. package/dist/core/predefined/operators/index.d.mts +13 -0
  125. package/dist/core/predefined/operators/index.d.mts.map +1 -0
  126. package/dist/core/predefined/operators/index.mjs +13 -0
  127. package/dist/core/predefined/operators/index.mjs.map +1 -0
  128. package/dist/core/predefined/operators/map-optional.d.mts +4 -0
  129. package/dist/core/predefined/operators/map-optional.d.mts.map +1 -0
  130. package/dist/core/predefined/operators/map-optional.mjs +7 -0
  131. package/dist/core/predefined/operators/map-optional.mjs.map +1 -0
  132. package/dist/core/predefined/operators/map-result-err.d.mts +4 -0
  133. package/dist/core/predefined/operators/map-result-err.d.mts.map +1 -0
  134. package/dist/core/predefined/operators/map-result-err.mjs +7 -0
  135. package/dist/core/predefined/operators/map-result-err.mjs.map +1 -0
  136. package/dist/core/predefined/operators/map-result-ok.d.mts +4 -0
  137. package/dist/core/predefined/operators/map-result-ok.d.mts.map +1 -0
  138. package/dist/core/predefined/operators/map-result-ok.mjs +7 -0
  139. package/dist/core/predefined/operators/map-result-ok.mjs.map +1 -0
  140. package/dist/core/predefined/operators/map-to.d.mts +3 -0
  141. package/dist/core/predefined/operators/map-to.d.mts.map +1 -0
  142. package/dist/core/predefined/operators/map-to.mjs +6 -0
  143. package/dist/core/predefined/operators/map-to.mjs.map +1 -0
  144. package/dist/core/predefined/operators/map.d.mts +3 -0
  145. package/dist/core/predefined/operators/map.d.mts.map +1 -0
  146. package/dist/core/predefined/operators/map.mjs +8 -0
  147. package/dist/core/predefined/operators/map.mjs.map +1 -0
  148. package/dist/core/predefined/operators/pluck.d.mts +8 -0
  149. package/dist/core/predefined/operators/pluck.d.mts.map +1 -0
  150. package/dist/core/predefined/operators/pluck.mjs +11 -0
  151. package/dist/core/predefined/operators/pluck.mjs.map +1 -0
  152. package/dist/core/predefined/operators/skip.d.mts +3 -0
  153. package/dist/core/predefined/operators/skip.d.mts.map +1 -0
  154. package/dist/core/predefined/operators/skip.mjs +9 -0
  155. package/dist/core/predefined/operators/skip.mjs.map +1 -0
  156. package/dist/core/predefined/operators/take.d.mts +3 -0
  157. package/dist/core/predefined/operators/take.d.mts.map +1 -0
  158. package/dist/core/predefined/operators/take.mjs +8 -0
  159. package/dist/core/predefined/operators/take.mjs.map +1 -0
  160. package/dist/core/predefined/operators/unwrap-optional.d.mts +4 -0
  161. package/dist/core/predefined/operators/unwrap-optional.d.mts.map +1 -0
  162. package/dist/core/predefined/operators/unwrap-optional.mjs +9 -0
  163. package/dist/core/predefined/operators/unwrap-optional.mjs.map +1 -0
  164. package/dist/core/predefined/operators/unwrap-result-err.d.mts +4 -0
  165. package/dist/core/predefined/operators/unwrap-result-err.d.mts.map +1 -0
  166. package/dist/core/predefined/operators/unwrap-result-err.mjs +7 -0
  167. package/dist/core/predefined/operators/unwrap-result-err.mjs.map +1 -0
  168. package/dist/core/predefined/operators/unwrap-result-ok.d.mts +4 -0
  169. package/dist/core/predefined/operators/unwrap-result-ok.d.mts.map +1 -0
  170. package/dist/core/predefined/operators/unwrap-result-ok.mjs +9 -0
  171. package/dist/core/predefined/operators/unwrap-result-ok.mjs.map +1 -0
  172. package/dist/core/types/observable-family.d.mts +7 -7
  173. package/dist/entry-point.mjs +15 -3
  174. package/dist/entry-point.mjs.map +1 -1
  175. package/dist/index.mjs +15 -3
  176. package/dist/index.mjs.map +1 -1
  177. package/dist/utils/create-event-emitter.d.mts +20 -2
  178. package/dist/utils/create-event-emitter.d.mts.map +1 -1
  179. package/dist/utils/create-event-emitter.mjs +20 -2
  180. package/dist/utils/create-event-emitter.mjs.map +1 -1
  181. package/dist/utils/create-reducer.d.mts +13 -1
  182. package/dist/utils/create-reducer.d.mts.map +1 -1
  183. package/dist/utils/create-reducer.mjs +13 -1
  184. package/dist/utils/create-reducer.mjs.map +1 -1
  185. package/dist/utils/create-state.d.mts +24 -4
  186. package/dist/utils/create-state.d.mts.map +1 -1
  187. package/dist/utils/create-state.mjs +24 -4
  188. package/dist/utils/create-state.mjs.map +1 -1
  189. package/package.json +13 -12
  190. package/src/core/combine/combine.mts +34 -4
  191. package/src/core/combine/merge.mts +30 -4
  192. package/src/core/combine/zip.mts +28 -3
  193. package/src/core/create/from-array.mts +21 -3
  194. package/src/core/create/from-promise.mts +29 -7
  195. package/src/core/create/from-subscribable.mts +58 -0
  196. package/src/core/create/interval.mts +29 -4
  197. package/src/core/create/of.mts +22 -3
  198. package/src/core/create/source.mts +22 -3
  199. package/src/core/create/timer.mts +23 -4
  200. package/src/core/index.mts +1 -0
  201. package/src/core/operators/audit-time.mts +59 -0
  202. package/src/core/operators/debounce-time.mts +22 -2
  203. package/src/core/operators/filter.mts +26 -1
  204. package/src/core/operators/map-with-index.mts +22 -66
  205. package/src/core/operators/merge-map.mts +48 -6
  206. package/src/core/operators/pairwise.mts +30 -1
  207. package/src/core/operators/scan.mts +23 -1
  208. package/src/core/operators/skip-if-no-change.mts +27 -3
  209. package/src/core/operators/skip-until.mts +50 -0
  210. package/src/core/operators/skip-while.mts +49 -16
  211. package/src/core/operators/switch-map.mts +39 -5
  212. package/src/core/operators/take-until.mts +20 -1
  213. package/src/core/operators/take-while.mts +49 -8
  214. package/src/core/operators/throttle-time.mts +44 -5
  215. package/src/core/operators/with-buffered-from.mts +58 -1
  216. package/src/core/operators/with-current-value-from.mts +60 -1
  217. package/src/core/operators/with-initial-value.mts +24 -2
  218. package/src/core/predefined/index.mts +1 -0
  219. package/src/core/predefined/operators/attach-index.mts +13 -0
  220. package/src/core/predefined/operators/index.mts +12 -0
  221. package/src/core/predefined/operators/map-optional.mts +8 -0
  222. package/src/core/predefined/operators/map-result-err.mts +8 -0
  223. package/src/core/predefined/operators/map-result-ok.mts +8 -0
  224. package/src/core/predefined/operators/map-to.mts +5 -0
  225. package/src/core/predefined/operators/map.mts +5 -0
  226. package/src/core/predefined/operators/pluck.mts +12 -0
  227. package/src/core/predefined/operators/skip.mts +10 -0
  228. package/src/core/predefined/operators/take.mts +6 -0
  229. package/src/core/predefined/operators/unwrap-optional.mts +9 -0
  230. package/src/core/predefined/operators/unwrap-result-err.mts +8 -0
  231. package/src/core/predefined/operators/unwrap-result-ok.mts +9 -0
  232. package/src/core/types/observable-family.mts +7 -7
  233. package/src/utils/create-event-emitter.mts +20 -2
  234. package/src/utils/create-reducer.mts +13 -1
  235. package/src/utils/create-state.mts +24 -4
@@ -27,11 +27,23 @@ import { source } from '../core/create/source.mjs';
27
27
  * 0,
28
28
  * );
29
29
  *
30
+ * const mut_history: number[] = [];
31
+ *
30
32
  * state.subscribe((value: number) => {
31
- * console.log(value);
33
+ * mut_history.push(value);
32
34
  * });
33
35
  *
36
+ * assert.deepStrictEqual(mut_history, [0]);
37
+ *
34
38
  * dispatch({ type: 'increment' }); // logs: 1
39
+ *
40
+ * assert.deepStrictEqual(mut_history, [0, 1]);
41
+ *
42
+ * dispatch({ type: 'increment' });
43
+ *
44
+ * dispatch({ type: 'decrement' });
45
+ *
46
+ * assert.deepStrictEqual(mut_history, [0, 1, 2, 1]);
35
47
  * ```
36
48
  */
37
49
  const createReducer = (reducer, initialState) => {
@@ -1 +1 @@
1
- {"version":3,"file":"create-reducer.mjs","sources":["../../src/utils/create-reducer.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BG;MACU,aAAa,GAAG,CAC3B,OAAsB,EACtB,YAAe,KAKb;AACF,IAAA,MAAM,KAAK,GAAG,MAAM,CAAI,YAAY,CAAC;AAErC,IAAA,MAAM,QAAQ,GAAG,CAAC,MAAS,KAAO;AAChC,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;AAE5D,QAAA,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;AAErB,QAAA,OAAO,SAAS;AAClB,IAAA,CAAC;IAED,MAAM,WAAW,GAAG,MAAS,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK;AAEtD,IAAA,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAU;AAChD;;;;"}
1
+ {"version":3,"file":"create-reducer.mjs","sources":["../../src/utils/create-reducer.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CG;MACU,aAAa,GAAG,CAC3B,OAAsB,EACtB,YAAe,KAKb;AACF,IAAA,MAAM,KAAK,GAAG,MAAM,CAAI,YAAY,CAAC;AAErC,IAAA,MAAM,QAAQ,GAAG,CAAC,MAAS,KAAO;AAChC,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;AAE5D,QAAA,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;AAErB,QAAA,OAAO,SAAS;AAClB,IAAA,CAAC;IAED,MAAM,WAAW,GAAG,MAAS,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK;AAEtD,IAAA,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAU;AAChD;;;;"}
@@ -11,15 +11,25 @@ import { type InitializedObservable } from '../core/index.mjs';
11
11
  * ```ts
12
12
  * const [state, setState, { updateState, resetState }] = createState(0);
13
13
  *
14
+ * const mut_history: number[] = [];
15
+ *
14
16
  * state.subscribe((value: number) => {
15
- * console.log(value);
16
- * }); // logs: 0
17
+ * mut_history.push(value);
18
+ * });
19
+ *
20
+ * assert.deepStrictEqual(mut_history, [0]);
17
21
  *
18
22
  * setState(10); // logs: 10
19
23
  *
24
+ * assert.deepStrictEqual(mut_history, [0, 10]);
25
+ *
20
26
  * updateState((prev: number) => prev + 1); // logs: 11
21
27
  *
28
+ * assert.deepStrictEqual(mut_history, [0, 10, 11]);
29
+ *
22
30
  * resetState(); // logs: 0
31
+ *
32
+ * assert.deepStrictEqual(mut_history, [0, 10, 11, 0]);
23
33
  * ```
24
34
  */
25
35
  export declare const createState: <S>(initialState: S) => readonly [state: InitializedObservable<S>, setState: (v: S) => S, Readonly<{
@@ -38,15 +48,25 @@ export declare const createState: <S>(initialState: S) => readonly [state: Initi
38
48
  * ```ts
39
49
  * const [state, { setTrue, toggle }] = createBooleanState(false);
40
50
  *
51
+ * const mut_history: boolean[] = [];
52
+ *
41
53
  * state.subscribe((value: boolean) => {
42
- * console.log(value);
43
- * }); // logs: false
54
+ * mut_history.push(value);
55
+ * });
56
+ *
57
+ * assert.deepStrictEqual(mut_history, [false]);
44
58
  *
45
59
  * setTrue(); // logs: true
46
60
  *
61
+ * assert.deepStrictEqual(mut_history, [false, true]);
62
+ *
47
63
  * toggle(); // logs: false
48
64
  *
65
+ * assert.deepStrictEqual(mut_history, [false, true, false]);
66
+ *
49
67
  * toggle(); // logs: true
68
+ *
69
+ * assert.deepStrictEqual(mut_history, [false, true, false, true]);
50
70
  * ```
51
71
  */
52
72
  export declare const createBooleanState: (initialState: boolean) => readonly [state: InitializedObservable<boolean>, Readonly<{
@@ -1 +1 @@
1
- {"version":3,"file":"create-state.d.mts","sourceRoot":"","sources":["../../src/utils/create-state.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAwB/D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,EAC3B,cAAc,CAAC,KACd,SAAS,CACV,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,EAC/B,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EACrB,QAAQ,CAAC;IACP,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7C,UAAU,EAAE,MAAM,CAAC,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,CAAC;CACtB,CAAC,CAwBH,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,kBAAkB,GAC7B,cAAc,OAAO,KACpB,SAAS,CACV,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,EACrC,QAAQ,CAAC;IACP,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;IACrC,MAAM,EAAE,MAAM,OAAO,CAAC;IACtB,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,KAAK,OAAO,CAAC;IAC/D,UAAU,EAAE,MAAM,OAAO,CAAC;IAC1B,WAAW,EAAE,MAAM,OAAO,CAAC;CAC5B,CAAC,CAqBH,CAAC"}
1
+ {"version":3,"file":"create-state.d.mts","sourceRoot":"","sources":["../../src/utils/create-state.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAwB/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,EAC3B,cAAc,CAAC,KACd,SAAS,CACV,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,EAC/B,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EACrB,QAAQ,CAAC;IACP,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7C,UAAU,EAAE,MAAM,CAAC,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,CAAC;CACtB,CAAC,CAwBH,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,kBAAkB,GAC7B,cAAc,OAAO,KACpB,SAAS,CACV,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,EACrC,QAAQ,CAAC;IACP,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;IACrC,MAAM,EAAE,MAAM,OAAO,CAAC;IACtB,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,KAAK,OAAO,CAAC;IAC/D,UAAU,EAAE,MAAM,OAAO,CAAC;IAC1B,WAAW,EAAE,MAAM,OAAO,CAAC;CAC5B,CAAC,CAqBH,CAAC"}
@@ -20,15 +20,25 @@ const reducer = (state, action) => {
20
20
  * ```ts
21
21
  * const [state, setState, { updateState, resetState }] = createState(0);
22
22
  *
23
+ * const mut_history: number[] = [];
24
+ *
23
25
  * state.subscribe((value: number) => {
24
- * console.log(value);
25
- * }); // logs: 0
26
+ * mut_history.push(value);
27
+ * });
28
+ *
29
+ * assert.deepStrictEqual(mut_history, [0]);
26
30
  *
27
31
  * setState(10); // logs: 10
28
32
  *
33
+ * assert.deepStrictEqual(mut_history, [0, 10]);
34
+ *
29
35
  * updateState((prev: number) => prev + 1); // logs: 11
30
36
  *
37
+ * assert.deepStrictEqual(mut_history, [0, 10, 11]);
38
+ *
31
39
  * resetState(); // logs: 0
40
+ *
41
+ * assert.deepStrictEqual(mut_history, [0, 10, 11, 0]);
32
42
  * ```
33
43
  */
34
44
  const createState = (initialState) => {
@@ -57,15 +67,25 @@ const createState = (initialState) => {
57
67
  * ```ts
58
68
  * const [state, { setTrue, toggle }] = createBooleanState(false);
59
69
  *
70
+ * const mut_history: boolean[] = [];
71
+ *
60
72
  * state.subscribe((value: boolean) => {
61
- * console.log(value);
62
- * }); // logs: false
73
+ * mut_history.push(value);
74
+ * });
75
+ *
76
+ * assert.deepStrictEqual(mut_history, [false]);
63
77
  *
64
78
  * setTrue(); // logs: true
65
79
  *
80
+ * assert.deepStrictEqual(mut_history, [false, true]);
81
+ *
66
82
  * toggle(); // logs: false
67
83
  *
84
+ * assert.deepStrictEqual(mut_history, [false, true, false]);
85
+ *
68
86
  * toggle(); // logs: true
87
+ *
88
+ * assert.deepStrictEqual(mut_history, [false, true, false, true]);
69
89
  * ```
70
90
  */
71
91
  const createBooleanState = (initialState) => {
@@ -1 +1 @@
1
- {"version":3,"file":"create-state.mjs","sources":["../../src/utils/create-state.mts"],"sourcesContent":[null],"names":[],"mappings":";;AAcA,MAAM,OAAO,GAAG,CAAK,KAAQ,EAAE,MAAiB,KAAO;AACrD,IAAA,QAAQ,MAAM,CAAC,IAAI;AACjB,QAAA,KAAK,KAAK;YACR,OAAO,MAAM,CAAC,SAAS;AAEzB,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;;AAEnC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;AAsBG;AACI,MAAM,WAAW,GAAG,CACzB,YAAe,KASb;AACF,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,GAAG,aAAa,CAClD,OAAO,EACP,YAAY,CACb;AAED,IAAA,MAAM,WAAW,GAAG,CAAC,QAAwB,KAC3C,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAExC,IAAA,MAAM,QAAQ,GAAG,CAAC,SAAY,KAAQ,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAE1E,IAAA,MAAM,UAAU,GAAG,MACjB,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;IAEpD,OAAO;QACL,KAAK;QACL,QAAQ;AACR,QAAA;YACE,WAAW;YACX,UAAU;YACV,WAAW;AACZ,SAAA;KACO;AACZ;AAEA;;;;;;;;;;;;;;;;;;;;;AAqBG;AACI,MAAM,kBAAkB,GAAG,CAChC,YAAqB,KAYnB;AACF,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,GAC/D,WAAW,CAAC,YAAY,CAAC;IAE3B,OAAO;QACL,KAAK;AACL,QAAA;YACE,OAAO,EAAE,MAAK;gBACZ,QAAQ,CAAC,IAAI,CAAC;YAChB,CAAC;YACD,QAAQ,EAAE,MAAK;gBACb,QAAQ,CAAC,KAAK,CAAC;YACjB,CAAC;AACD,YAAA,MAAM,EAAE,MAAM,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACpC,QAAQ;YACR,WAAW;YACX,UAAU;YACV,WAAW;AACZ,SAAA;KACO;AACZ;;;;"}
1
+ {"version":3,"file":"create-state.mjs","sources":["../../src/utils/create-state.mts"],"sourcesContent":[null],"names":[],"mappings":";;AAcA,MAAM,OAAO,GAAG,CAAK,KAAQ,EAAE,MAAiB,KAAO;AACrD,IAAA,QAAQ,MAAM,CAAC,IAAI;AACjB,QAAA,KAAK,KAAK;YACR,OAAO,MAAM,CAAC,SAAS;AAEzB,QAAA,KAAK,QAAQ;AACX,YAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;;AAEnC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCG;AACI,MAAM,WAAW,GAAG,CACzB,YAAe,KASb;AACF,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,GAAG,aAAa,CAClD,OAAO,EACP,YAAY,CACb;AAED,IAAA,MAAM,WAAW,GAAG,CAAC,QAAwB,KAC3C,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAExC,IAAA,MAAM,QAAQ,GAAG,CAAC,SAAY,KAAQ,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAE1E,IAAA,MAAM,UAAU,GAAG,MACjB,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;IAEpD,OAAO;QACL,KAAK;QACL,QAAQ;AACR,QAAA;YACE,WAAW;YACX,UAAU;YACV,WAAW;AACZ,SAAA;KACO;AACZ;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BG;AACI,MAAM,kBAAkB,GAAG,CAChC,YAAqB,KAYnB;AACF,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,GAC/D,WAAW,CAAC,YAAY,CAAC;IAE3B,OAAO;QACL,KAAK;AACL,QAAA;YACE,OAAO,EAAE,MAAK;gBACZ,QAAQ,CAAC,IAAI,CAAC;YAChB,CAAC;YACD,QAAQ,EAAE,MAAK;gBACb,QAAQ,CAAC,KAAK,CAAC;YACjB,CAAC;AACD,YAAA,MAAM,EAAE,MAAM,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YACpC,QAAQ;YACR,WAAW;YACX,UAAU;YACV,WAAW;AACZ,SAAA;KACO;AACZ;;;;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "synstate",
3
- "version": "0.1.0",
4
- "description": "Reactive Programming Library for TypeScript/JavaScript",
3
+ "version": "0.1.2",
4
+ "description": "Type-safe State Management Library for TypeScript/JavaScript",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/noshiro-pf/synstate.git"
@@ -23,9 +23,19 @@
23
23
  "files": [
24
24
  "src",
25
25
  "dist",
26
+ "assets",
26
27
  "README.md",
27
28
  "LICENSE"
28
29
  ],
30
+ "dependencies": {
31
+ "ts-data-forge": "^6.5.0"
32
+ },
33
+ "devDependencies": {
34
+ "@types/argparse": "^2.0.17",
35
+ "@types/react": "^19.2.14",
36
+ "argparse": "^2.0.1",
37
+ "react": "^19.2.4"
38
+ },
29
39
  "scripts": {
30
40
  "build": "tsx ./scripts/cmd/build.mts",
31
41
  "build:min": "tsx ./scripts/cmd/build.mts --skip-check",
@@ -58,14 +68,5 @@
58
68
  "z:vitest": "vitest --config ./configs/vitest.config.mts",
59
69
  "z:vitest:node": "pnpm run z:vitest --project='Node.js'",
60
70
  "z:vitest:stream": "vitest --config ./configs/vitest.config.stream.ts"
61
- },
62
- "dependencies": {
63
- "ts-data-forge": "^6.5.0"
64
- },
65
- "devDependencies": {
66
- "@types/argparse": "^2.0.17",
67
- "@types/react": "^19.2.14",
68
- "argparse": "^2.0.1",
69
- "react": "^19.2.4"
70
71
  }
71
- }
72
+ }
@@ -24,21 +24,51 @@ import {
24
24
  *
25
25
  * @example
26
26
  * ```ts
27
+ * // Timeline:
28
+ * //
29
+ * // name$ "Alice" "Bob"
30
+ * // age$ 25 30
31
+ * // user$ ["Alice",25] ["Bob",25] ["Bob",30]
32
+ * //
33
+ * // Explanation:
34
+ * // - combine waits for all sources to emit at least once
35
+ * // - Then emits the latest value from all sources whenever any source emits
36
+ * // - Always emits an array with the latest values from each source
37
+ *
27
38
  * const name$ = source<string>();
28
39
  *
29
40
  * const age$ = source<number>();
30
41
  *
31
42
  * const user$ = combine([name$, age$]);
32
43
  *
44
+ * const mut_history: (readonly [string, number])[] = [];
45
+ *
33
46
  * user$.subscribe(([name_, age]) => {
34
- * console.log({ name: name_, age });
47
+ * mut_history.push([name_, age]);
35
48
  * });
36
49
  *
37
- * name$.next('Alice');
50
+ * name$.next('Alice'); // nothing logged (age$ hasn't emitted yet)
51
+ *
52
+ * assert.deepStrictEqual(mut_history, []);
38
53
  *
39
54
  * age$.next(25); // logs: { name: 'Alice', age: 25 }
40
55
  *
56
+ * assert.deepStrictEqual(mut_history, [['Alice', 25]]);
57
+ *
41
58
  * name$.next('Bob'); // logs: { name: 'Bob', age: 25 }
59
+ *
60
+ * assert.deepStrictEqual(mut_history, [
61
+ * ['Alice', 25],
62
+ * ['Bob', 25],
63
+ * ]);
64
+ *
65
+ * age$.next(30); // logs: { name: 'Bob', age: 30 }
66
+ *
67
+ * assert.deepStrictEqual(mut_history, [
68
+ * ['Alice', 25],
69
+ * ['Bob', 25],
70
+ * ['Bob', 30],
71
+ * ]);
42
72
  * ```
43
73
  */
44
74
  export const combine = <const OS extends NonEmptyArray<Observable<unknown>>>(
@@ -50,10 +80,10 @@ export const combine = <const OS extends NonEmptyArray<Observable<unknown>>>(
50
80
  ) as unknown as CombineObservableRefined<OS>;
51
81
 
52
82
  /**
53
- * Alias for `combine()`.
83
+ * Alias for `combine`.
54
84
  * @see combine
55
85
  */
56
- export const combineLatest = combine; // alias
86
+ export const combineLatest = combine;
57
87
 
58
88
  class CombineObservableClass<const A extends NonEmptyUnknownList>
59
89
  extends SyncChildObservableClass<A, A>
@@ -21,16 +21,42 @@ import {
21
21
  *
22
22
  * @example
23
23
  * ```ts
24
- * const clicks$ = source<MouseEvent>();
24
+ * // Timeline:
25
+ * //
26
+ * // clicks$ c1 c2 c3
27
+ * // keys$ k1 k2 k3
28
+ * // events$ c1 k1 c2 k2 c3 k3
29
+ * //
30
+ * // Explanation:
31
+ * // - merge combines multiple observables into one
32
+ * // - Emits values from any source as they arrive
33
+ * // - Order is preserved based on emission time
25
34
  *
26
- * const keys$ = source<KeyboardEvent>();
35
+ * const clicks$ = source<string>();
36
+ *
37
+ * const keys$ = source<string>();
27
38
  *
28
39
  * const events$ = merge([clicks$, keys$]);
29
40
  *
41
+ * const mut_history: string[] = [];
42
+ *
30
43
  * events$.subscribe((event_) => {
31
- * console.log(event_);
44
+ * mut_history.push(event_);
32
45
  * });
33
- * // Logs any mouse click or keyboard event
46
+ *
47
+ * clicks$.next('c1');
48
+ *
49
+ * assert.deepStrictEqual(mut_history, ['c1']);
50
+ *
51
+ * keys$.next('k1');
52
+ *
53
+ * assert.deepStrictEqual(mut_history, ['c1', 'k1']);
54
+ *
55
+ * clicks$.next('c2');
56
+ *
57
+ * keys$.next('k2');
58
+ *
59
+ * assert.deepStrictEqual(mut_history, ['c1', 'k1', 'c2', 'k2']);
34
60
  * ```
35
61
  *
36
62
  * @note To improve code readability, consider using `createState` instead of `merge`,
@@ -26,16 +26,41 @@ import {
26
26
  *
27
27
  * @example
28
28
  * ```ts
29
+ * // Timeline:
30
+ * //
31
+ * // letters$ 'a' 'b' 'c'
32
+ * // numbers$ 1 2 3
33
+ * // zipped$ ['a',1] ['b',2] ['c',3]
34
+ * //
35
+ * // Explanation:
36
+ * // - zip pairs values by their index from multiple sources
37
+ * // - Waits for all sources to emit at the same index
38
+ * // - Completes when any source completes
39
+ *
29
40
  * const letters$ = fromArray(['a', 'b', 'c']);
30
41
  *
31
42
  * const numbers$ = fromArray([1, 2, 3]);
32
43
  *
33
44
  * const zipped$ = zip([letters$, numbers$]);
34
45
  *
35
- * zipped$.subscribe(([letter, num]) => {
36
- * console.log(letter, num);
46
+ * const mut_history: (readonly [string, number])[] = [];
47
+ *
48
+ * await new Promise<void>((resolve) => {
49
+ * zipped$.subscribe(
50
+ * ([letter, num]) => {
51
+ * mut_history.push([letter, num]);
52
+ * },
53
+ * () => {
54
+ * resolve();
55
+ * },
56
+ * );
37
57
  * });
38
- * // logs: a 1, b 2, c 3
58
+ *
59
+ * assert.deepStrictEqual(mut_history, [
60
+ * ['a', 1],
61
+ * ['b', 2],
62
+ * ['c', 3],
63
+ * ]);
39
64
  * ```
40
65
  */
41
66
  export const zip = <const OS extends NonEmptyArray<Observable<unknown>>>(
@@ -12,12 +12,30 @@ import { type FromArrayObservable } from '../types/index.mjs';
12
12
  *
13
13
  * @example
14
14
  * ```ts
15
+ * // Timeline:
16
+ * //
17
+ * // nums$ 1 2 3 | (completes)
18
+ * //
19
+ * // Explanation:
20
+ * // - fromArray creates an observable from an array
21
+ * // - Emits all values synchronously, then completes
22
+ *
15
23
  * const nums$ = fromArray([1, 2, 3]);
16
24
  *
17
- * nums$.subscribe((x) => {
18
- * console.log(x);
25
+ * const mut_history: number[] = [];
26
+ *
27
+ * await new Promise<void>((resolve) => {
28
+ * nums$.subscribe(
29
+ * (x) => {
30
+ * mut_history.push(x);
31
+ * },
32
+ * () => {
33
+ * resolve();
34
+ * },
35
+ * );
19
36
  * });
20
- * // logs: 1, 2, 3
37
+ *
38
+ * assert.deepStrictEqual(mut_history, [1, 2, 3]);
21
39
  * ```
22
40
  */
23
41
  export const fromArray = <A,>(
@@ -13,15 +13,37 @@ import { type FromPromiseObservable } from '../types/index.mjs';
13
13
  *
14
14
  * @example
15
15
  * ```ts
16
- * const data$ = fromPromise(fetch('/api/data').then((r) => r.json()));
16
+ * // Timeline:
17
+ * //
18
+ * // promise [pending...] -> resolved/rejected
19
+ * // data$ Ok(value) or Err(error)
20
+ * //
21
+ * // Explanation:
22
+ * // - fromPromise converts a Promise into an observable
23
+ * // - Emits a Result type: Ok(value) on success, Err(error) on failure
24
+ * // - Completes after emitting the result
25
+ * // - Useful for integrating async operations into reactive flows
17
26
  *
18
- * data$.subscribe((result) => {
19
- * if (Result.isOk(result)) {
20
- * console.log('Data:', result.value);
21
- * } else {
22
- * console.error('Error:', result.value);
23
- * }
27
+ * const fetchData = async (): Promise<{ value: number }> => ({ value: 42 });
28
+ *
29
+ * const data$ = fromPromise(fetchData());
30
+ *
31
+ * const mut_history: { value: number }[] = [];
32
+ *
33
+ * await new Promise<void>((resolve) => {
34
+ * data$.subscribe(
35
+ * (result) => {
36
+ * if (Result.isOk(result)) {
37
+ * mut_history.push(result.value);
38
+ * }
39
+ * },
40
+ * () => {
41
+ * resolve();
42
+ * },
43
+ * );
24
44
  * });
45
+ *
46
+ * assert.deepStrictEqual(mut_history, [{ value: 42 }]);
25
47
  * ```
26
48
  */
27
49
  export const fromPromise = <A, E = unknown>(
@@ -5,6 +5,64 @@ import {
5
5
  type Subscribable,
6
6
  } from '../types/index.mjs';
7
7
 
8
+ /**
9
+ * Converts any subscribable object into a SynState Observable.
10
+ * Works with objects that have a subscribe(onNext, onError, onComplete) method.
11
+ *
12
+ * @template A - The type of values from the subscribable
13
+ * @template E - The type of errors from the subscribable
14
+ * @param subscribable - An object with a subscribe method
15
+ * @returns An observable that wraps values in Result type
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * // Explanation:
20
+ * // - fromSubscribable converts any subscribable object into a SynState Observable
21
+ * // - Works with objects that have a subscribe(onNext, onError, onComplete) method
22
+ * // - Wraps values in Result type for error handling
23
+ * // - Useful for integrating with other reactive libraries or custom subscribables
24
+ *
25
+ * // Example: Converting a custom subscribable
26
+ * const customSubscribable = {
27
+ * subscribe: (
28
+ * onNext: (value: number) => void,
29
+ * _onError?: (error: unknown) => void,
30
+ * onComplete?: () => void,
31
+ * ) => {
32
+ * setTimeout(() => {
33
+ * onNext(1);
34
+ *
35
+ * onNext(2);
36
+ *
37
+ * onNext(3);
38
+ *
39
+ * onComplete?.();
40
+ * }, 0);
41
+ *
42
+ * return { unsubscribe: () => {} };
43
+ * },
44
+ * };
45
+ *
46
+ * const observable$ = fromSubscribable<number>(customSubscribable);
47
+ *
48
+ * const mut_history: number[] = [];
49
+ *
50
+ * await new Promise<void>((resolve) => {
51
+ * observable$.subscribe(
52
+ * (result) => {
53
+ * if (Result.isOk(result)) {
54
+ * mut_history.push(result.value);
55
+ * }
56
+ * },
57
+ * () => {
58
+ * resolve();
59
+ * },
60
+ * );
61
+ * });
62
+ *
63
+ * assert.deepStrictEqual(mut_history, [1, 2, 3]);
64
+ * ```
65
+ */
8
66
  export const fromSubscribable = <A, E = unknown>(
9
67
  subscribable: Subscribable<A>,
10
68
  ): FromSubscribableObservable<A, E> =>
@@ -12,12 +12,37 @@ import { type IntervalObservable } from '../types/index.mjs';
12
12
  *
13
13
  * @example
14
14
  * ```ts
15
- * const tick$ = interval(1000);
15
+ * // Timeline:
16
+ * //
17
+ * // Time(s) 0 1 2 3 4 5
18
+ * // tick$ 0 1 2 3 4 5 ...
19
+ * //
20
+ * // Explanation:
21
+ * // - interval emits incrementing numbers at specified intervals
22
+ * // - Starts at 0 and continues indefinitely
23
+ * // - Useful for periodic tasks or animations
16
24
  *
17
- * tick$.subscribe((count) => {
18
- * console.log(count);
25
+ * const tick$ = interval(100);
26
+ *
27
+ * const mut_history: number[] = [];
28
+ *
29
+ * const subscription = tick$.subscribe((count) => {
30
+ * mut_history.push(count);
19
31
  * });
20
- * // logs: 0, 1, 2, 3, ... every second
32
+ *
33
+ * await new Promise((resolve) => {
34
+ * setTimeout(resolve, 350);
35
+ * });
36
+ *
37
+ * subscription.unsubscribe();
38
+ *
39
+ * assert.isTrue(Arr.isArrayAtLeastLength(mut_history, 3));
40
+ *
41
+ * assert.deepStrictEqual(mut_history[0], 0);
42
+ *
43
+ * assert.deepStrictEqual(mut_history[1], 1);
44
+ *
45
+ * assert.deepStrictEqual(mut_history[2], 2);
21
46
  * ```
22
47
  */
23
48
  export const interval = (
@@ -12,11 +12,30 @@ import { type OfObservable } from '../types/index.mjs';
12
12
  *
13
13
  * @example
14
14
  * ```ts
15
+ * // Timeline:
16
+ * //
17
+ * // num$ 42 | (completes immediately)
18
+ * //
19
+ * // Explanation:
20
+ * // - of creates an observable that emits a single value, then completes
21
+ * // - Useful for converting a static value into an observable
22
+ *
15
23
  * const num$ = of(42);
16
24
  *
17
- * num$.subscribe((x) => {
18
- * console.log(x);
19
- * }); // logs: 42
25
+ * const mut_history: number[] = [];
26
+ *
27
+ * await new Promise<void>((resolve) => {
28
+ * num$.subscribe(
29
+ * (x) => {
30
+ * mut_history.push(x);
31
+ * },
32
+ * () => {
33
+ * resolve();
34
+ * },
35
+ * );
36
+ * });
37
+ *
38
+ * assert.deepStrictEqual(mut_history, [42]);
20
39
  * ```
21
40
  */
22
41
  export const of = <A,>(
@@ -14,15 +14,34 @@ import {
14
14
  *
15
15
  * @example
16
16
  * ```ts
17
+ * // Timeline:
18
+ * //
19
+ * // count$ 1 2 3 ...
20
+ * //
21
+ * // Explanation:
22
+ * // - source creates a new observable that you can manually emit values to
23
+ * // - Use .next() to emit values
24
+ * // - Foundation for building custom observables
25
+ *
17
26
  * const count$ = source<number>();
18
27
  *
28
+ * const mut_history: number[] = [];
29
+ *
19
30
  * count$.subscribe((value) => {
20
- * console.log(value);
31
+ * mut_history.push(value);
21
32
  * });
22
33
  *
23
34
  * count$.next(1); // logs: 1
24
35
  *
36
+ * assert.deepStrictEqual(mut_history, [1]);
37
+ *
25
38
  * count$.next(2); // logs: 2
39
+ *
40
+ * assert.deepStrictEqual(mut_history, [1, 2]);
41
+ *
42
+ * count$.next(3); // logs: 3
43
+ *
44
+ * assert.deepStrictEqual(mut_history, [1, 2, 3]);
26
45
  * ```
27
46
  */
28
47
  export function source<A>(initialValue: A): InitializedSourceObservable<A>;
@@ -34,10 +53,10 @@ export function source<A>(...args: readonly A[]): SourceObservable<A> {
34
53
  }
35
54
 
36
55
  /**
37
- * Alias for `source()`. Creates a new Observable source.
56
+ * Alias for `source`. Creates a new Observable source.
38
57
  * @see source
39
58
  */
40
- export const subject = source; // alias
59
+ export const subject = source;
41
60
 
42
61
  class SourceObservableClass<A>
43
62
  extends RootObservableClass<A>
@@ -11,12 +11,31 @@ import { type TimerObservable } from '../types/index.mjs';
11
11
  *
12
12
  * @example
13
13
  * ```ts
14
- * const delayed$ = timer(1000);
14
+ * // Timeline:
15
+ * //
16
+ * // Time(ms) 0 ... 1000
17
+ * // delayed$ X (emits and completes)
18
+ * //
19
+ * // Explanation:
20
+ * // - timer emits once after the specified delay, then completes
21
+ * // - Useful for delayed actions or timeouts
15
22
  *
16
- * delayed$.subscribe(() => {
17
- * console.log('1 second passed');
23
+ * const delayed$ = timer(100);
24
+ *
25
+ * const mut_history: number[] = [];
26
+ *
27
+ * await new Promise<void>((resolve) => {
28
+ * delayed$.subscribe(
29
+ * () => {
30
+ * mut_history.push(1);
31
+ * },
32
+ * () => {
33
+ * resolve();
34
+ * },
35
+ * );
18
36
  * });
19
- * // After 1 second, logs: 1 second passed
37
+ *
38
+ * assert.deepStrictEqual(mut_history, [1]);
20
39
  * ```
21
40
  */
22
41
  export const timer = (
@@ -2,5 +2,6 @@ export * from './class/index.mjs';
2
2
  export * from './combine/index.mjs';
3
3
  export * from './create/index.mjs';
4
4
  export * from './operators/index.mjs';
5
+ export * from './predefined/index.mjs';
5
6
  export * from './types/index.mjs';
6
7
  export * from './utils/index.mjs';