synstate 1.0.2 → 2.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 (194) hide show
  1. package/README.md +16 -17
  2. package/dist/core/class/child-observable-class.d.mts.map +1 -1
  3. package/dist/core/class/child-observable-class.mjs +148 -140
  4. package/dist/core/class/child-observable-class.mjs.map +1 -1
  5. package/dist/core/class/observable-base-class.d.mts.map +1 -1
  6. package/dist/core/class/observable-base-class.mjs +111 -107
  7. package/dist/core/class/observable-base-class.mjs.map +1 -1
  8. package/dist/core/class/root-observable-class.d.mts.map +1 -1
  9. package/dist/core/class/root-observable-class.mjs +32 -24
  10. package/dist/core/class/root-observable-class.mjs.map +1 -1
  11. package/dist/core/combine/combine.d.mts +3 -3
  12. package/dist/core/combine/combine.d.mts.map +1 -1
  13. package/dist/core/combine/combine.mjs +31 -113
  14. package/dist/core/combine/combine.mjs.map +1 -1
  15. package/dist/core/combine/merge.d.mts +2 -2
  16. package/dist/core/combine/merge.d.mts.map +1 -1
  17. package/dist/core/combine/merge.mjs +21 -69
  18. package/dist/core/combine/merge.mjs.map +1 -1
  19. package/dist/core/combine/zip.d.mts +2 -2
  20. package/dist/core/combine/zip.d.mts.map +1 -1
  21. package/dist/core/combine/zip.mjs +34 -79
  22. package/dist/core/combine/zip.mjs.map +1 -1
  23. package/dist/core/create/counter.d.mts +1 -1
  24. package/dist/core/create/counter.d.mts.map +1 -1
  25. package/dist/core/create/counter.mjs +45 -84
  26. package/dist/core/create/counter.mjs.map +1 -1
  27. package/dist/core/create/from-abortable-promise.d.mts.map +1 -1
  28. package/dist/core/create/from-abortable-promise.mjs +29 -61
  29. package/dist/core/create/from-abortable-promise.mjs.map +1 -1
  30. package/dist/core/create/from-promise.d.mts.map +1 -1
  31. package/dist/core/create/from-promise.mjs +17 -66
  32. package/dist/core/create/from-promise.mjs.map +1 -1
  33. package/dist/core/create/from-subscribable.d.mts.map +1 -1
  34. package/dist/core/create/from-subscribable.mjs +18 -69
  35. package/dist/core/create/from-subscribable.mjs.map +1 -1
  36. package/dist/core/create/just.d.mts.map +1 -1
  37. package/dist/core/create/just.mjs +5 -35
  38. package/dist/core/create/just.mjs.map +1 -1
  39. package/dist/core/create/source.mjs +10 -13
  40. package/dist/core/create/source.mjs.map +1 -1
  41. package/dist/core/create/timer.d.mts.map +1 -1
  42. package/dist/core/create/timer.mjs +32 -68
  43. package/dist/core/create/timer.mjs.map +1 -1
  44. package/dist/core/operators/audit.d.mts.map +1 -1
  45. package/dist/core/operators/audit.mjs +39 -133
  46. package/dist/core/operators/audit.mjs.map +1 -1
  47. package/dist/core/operators/debounce.d.mts.map +1 -1
  48. package/dist/core/operators/debounce.mjs +36 -119
  49. package/dist/core/operators/debounce.mjs.map +1 -1
  50. package/dist/core/operators/filter.mjs +22 -25
  51. package/dist/core/operators/filter.mjs.map +1 -1
  52. package/dist/core/operators/map.d.mts.map +1 -1
  53. package/dist/core/operators/map.mjs +28 -61
  54. package/dist/core/operators/map.mjs.map +1 -1
  55. package/dist/core/operators/merge-map.d.mts +1 -1
  56. package/dist/core/operators/merge-map.d.mts.map +1 -1
  57. package/dist/core/operators/merge-map.mjs +34 -130
  58. package/dist/core/operators/merge-map.mjs.map +1 -1
  59. package/dist/core/operators/pairwise.d.mts +3 -2
  60. package/dist/core/operators/pairwise.d.mts.map +1 -1
  61. package/dist/core/operators/pairwise.mjs +19 -75
  62. package/dist/core/operators/pairwise.mjs.map +1 -1
  63. package/dist/core/operators/scan.d.mts.map +1 -1
  64. package/dist/core/operators/scan.mjs +16 -67
  65. package/dist/core/operators/scan.mjs.map +1 -1
  66. package/dist/core/operators/skip-if-no-change.d.mts +1 -1
  67. package/dist/core/operators/skip-if-no-change.d.mts.map +1 -1
  68. package/dist/core/operators/skip-if-no-change.mjs +28 -92
  69. package/dist/core/operators/skip-if-no-change.mjs.map +1 -1
  70. package/dist/core/operators/skip-until.d.mts.map +1 -1
  71. package/dist/core/operators/skip-until.mjs +23 -72
  72. package/dist/core/operators/skip-until.mjs.map +1 -1
  73. package/dist/core/operators/skip-while.d.mts.map +1 -1
  74. package/dist/core/operators/skip-while.mjs +26 -88
  75. package/dist/core/operators/skip-while.mjs.map +1 -1
  76. package/dist/core/operators/switch-map.d.mts.map +1 -1
  77. package/dist/core/operators/switch-map.mjs +31 -124
  78. package/dist/core/operators/switch-map.mjs.map +1 -1
  79. package/dist/core/operators/take-until.d.mts.map +1 -1
  80. package/dist/core/operators/take-until.mjs +28 -69
  81. package/dist/core/operators/take-until.mjs.map +1 -1
  82. package/dist/core/operators/take-while.d.mts.map +1 -1
  83. package/dist/core/operators/take-while.mjs +23 -83
  84. package/dist/core/operators/take-while.mjs.map +1 -1
  85. package/dist/core/operators/throttle.d.mts.map +1 -1
  86. package/dist/core/operators/throttle.mjs +38 -115
  87. package/dist/core/operators/throttle.mjs.map +1 -1
  88. package/dist/core/operators/with-buffered-from.d.mts +1 -1
  89. package/dist/core/operators/with-buffered-from.d.mts.map +1 -1
  90. package/dist/core/operators/with-buffered-from.mjs +37 -90
  91. package/dist/core/operators/with-buffered-from.mjs.map +1 -1
  92. package/dist/core/operators/with-current-value-from.d.mts +1 -1
  93. package/dist/core/operators/with-current-value-from.d.mts.map +1 -1
  94. package/dist/core/operators/with-current-value-from.mjs +23 -84
  95. package/dist/core/operators/with-current-value-from.mjs.map +1 -1
  96. package/dist/core/operators/with-initial-value.d.mts.map +1 -1
  97. package/dist/core/operators/with-initial-value.mjs +13 -58
  98. package/dist/core/operators/with-initial-value.mjs.map +1 -1
  99. package/dist/core/predefined/operators/attach-index.d.mts +1 -1
  100. package/dist/core/predefined/operators/attach-index.d.mts.map +1 -1
  101. package/dist/core/predefined/operators/attach-index.mjs +0 -53
  102. package/dist/core/predefined/operators/attach-index.mjs.map +1 -1
  103. package/dist/core/predefined/operators/map-optional.d.mts.map +1 -1
  104. package/dist/core/predefined/operators/map-optional.mjs +1 -48
  105. package/dist/core/predefined/operators/map-optional.mjs.map +1 -1
  106. package/dist/core/predefined/operators/map-result-err.d.mts.map +1 -1
  107. package/dist/core/predefined/operators/map-result-err.mjs +1 -48
  108. package/dist/core/predefined/operators/map-result-err.mjs.map +1 -1
  109. package/dist/core/predefined/operators/map-result-ok.d.mts.map +1 -1
  110. package/dist/core/predefined/operators/map-result-ok.mjs +1 -48
  111. package/dist/core/predefined/operators/map-result-ok.mjs.map +1 -1
  112. package/dist/core/predefined/operators/map-to.d.mts.map +1 -1
  113. package/dist/core/predefined/operators/map-to.mjs +0 -40
  114. package/dist/core/predefined/operators/map-to.mjs.map +1 -1
  115. package/dist/core/predefined/operators/pluck.d.mts +1 -1
  116. package/dist/core/predefined/operators/pluck.d.mts.map +1 -1
  117. package/dist/core/predefined/operators/pluck.mjs +0 -43
  118. package/dist/core/predefined/operators/pluck.mjs.map +1 -1
  119. package/dist/core/predefined/operators/skip.d.mts.map +1 -1
  120. package/dist/core/predefined/operators/skip.mjs +0 -47
  121. package/dist/core/predefined/operators/skip.mjs.map +1 -1
  122. package/dist/core/predefined/operators/take.d.mts.map +1 -1
  123. package/dist/core/predefined/operators/take.mjs +0 -41
  124. package/dist/core/predefined/operators/take.mjs.map +1 -1
  125. package/dist/core/predefined/operators/unwrap-optional.mjs +4 -43
  126. package/dist/core/predefined/operators/unwrap-optional.mjs.map +1 -1
  127. package/dist/core/predefined/operators/unwrap-result-err.mjs +0 -40
  128. package/dist/core/predefined/operators/unwrap-result-err.mjs.map +1 -1
  129. package/dist/core/predefined/operators/unwrap-result-ok.mjs +4 -43
  130. package/dist/core/predefined/operators/unwrap-result-ok.mjs.map +1 -1
  131. package/dist/core/types/observable-family.d.mts +10 -10
  132. package/dist/core/types/observable-family.d.mts.map +1 -1
  133. package/dist/core/types/observable.d.mts.map +1 -1
  134. package/dist/core/types/observable.mjs +3 -5
  135. package/dist/core/types/observable.mjs.map +1 -1
  136. package/dist/core/types/types.d.mts +2 -1
  137. package/dist/core/types/types.d.mts.map +1 -1
  138. package/dist/core/utils/id-maker.mjs +5 -6
  139. package/dist/core/utils/id-maker.mjs.map +1 -1
  140. package/dist/core/utils/max-depth.d.mts.map +1 -1
  141. package/dist/core/utils/max-depth.mjs +1 -3
  142. package/dist/core/utils/max-depth.mjs.map +1 -1
  143. package/dist/core/utils/observable-utils.d.mts.map +1 -1
  144. package/dist/core/utils/observable-utils.mjs +3 -2
  145. package/dist/core/utils/observable-utils.mjs.map +1 -1
  146. package/dist/core/utils/utils.d.mts.map +1 -1
  147. package/dist/core/utils/utils.mjs +23 -30
  148. package/dist/core/utils/utils.mjs.map +1 -1
  149. package/dist/utils/collect-to-array.d.mts.map +1 -1
  150. package/dist/utils/collect-to-array.mjs +9 -6
  151. package/dist/utils/collect-to-array.mjs.map +1 -1
  152. package/dist/utils/create-boolean-state.d.mts +1 -1
  153. package/dist/utils/create-boolean-state.d.mts.map +1 -1
  154. package/dist/utils/create-boolean-state.mjs +18 -46
  155. package/dist/utils/create-boolean-state.mjs.map +1 -1
  156. package/dist/utils/create-event-emitter.mjs +10 -64
  157. package/dist/utils/create-event-emitter.mjs.map +1 -1
  158. package/dist/utils/create-reducer.d.mts +1 -1
  159. package/dist/utils/create-reducer.d.mts.map +1 -1
  160. package/dist/utils/create-reducer.mjs +8 -52
  161. package/dist/utils/create-reducer.mjs.map +1 -1
  162. package/dist/utils/create-state.d.mts +1 -1
  163. package/dist/utils/create-state.d.mts.map +1 -1
  164. package/dist/utils/create-state.mjs +23 -53
  165. package/dist/utils/create-state.mjs.map +1 -1
  166. package/package.json +42 -29
  167. package/src/core/class/child-observable-class.mts +1 -1
  168. package/src/core/class/observable-base-class.mts +16 -16
  169. package/src/core/combine/combine.mts +38 -16
  170. package/src/core/combine/merge.mts +3 -3
  171. package/src/core/combine/zip.mts +24 -13
  172. package/src/core/create/counter.mts +11 -9
  173. package/src/core/create/counter.test.mts +11 -0
  174. package/src/core/create/timer.mts +6 -6
  175. package/src/core/create/timer.test.mts +11 -0
  176. package/src/core/operators/audit-throttle-teardown.test.mts +21 -0
  177. package/src/core/operators/audit.mts +6 -6
  178. package/src/core/operators/debounce.mts +6 -6
  179. package/src/core/operators/pairwise.mts +10 -5
  180. package/src/core/operators/skip-while.mts +1 -5
  181. package/src/core/operators/skip-while.test.mts +20 -0
  182. package/src/core/operators/throttle.mts +6 -6
  183. package/src/core/operators/with-buffered-from.mts +4 -4
  184. package/src/core/predefined/operators/map-optional.mts +1 -2
  185. package/src/core/predefined/operators/map-result-err.mts +1 -1
  186. package/src/core/predefined/operators/map-result-ok.mts +1 -1
  187. package/src/core/types/observable-family.mts +12 -11
  188. package/src/core/types/observable.mts +5 -7
  189. package/src/core/types/types.mts +2 -1
  190. package/src/core/utils/max-depth.mts +5 -1
  191. package/src/core/utils/utils.mts +1 -1
  192. package/src/utils/create-boolean-state.mts +1 -1
  193. package/src/utils/create-reducer.mts +1 -1
  194. package/src/utils/create-state.mts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"collect-to-array.mjs","sources":["../../src/utils/collect-to-array.mts"],"sourcesContent":[null],"names":[],"mappings":"AAEO,MAAM,cAAc,GAAG,CAC5B,UAAyB,KAEzB,IAAI,OAAO,CAAe,CAAC,OAAO,KAAI;IACpC,MAAM,UAAU,GAAQ,EAAE;AAE1B,IAAA,UAAU,CAAC,SAAS,CAClB,CAAC,KAAK,KAAI;AACR,QAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;IACxB,CAAC,EACD,MAAK;QACH,OAAO,CAAC,UAAU,CAAC;AACrB,IAAA,CAAC,CACF;AACH,CAAC;;;;"}
1
+ {"version":3,"file":"collect-to-array.mjs","sources":["../../src/utils/collect-to-array.mts"],"sourcesContent":["import { type Observable } from '../core/index.mjs';\n\nexport const collectToArray = <A,>(\n observable: Observable<A>,\n): Promise<readonly A[]> =>\n new Promise<readonly A[]>((resolve) => {\n const mut_buffer: A[] = [];\n\n observable.subscribe(\n (value) => {\n mut_buffer.push(value);\n },\n () => {\n resolve(mut_buffer);\n },\n );\n });\n"],"names":[],"mappings":"AAEO,MAAM,iBAAiB,CAC5B,UAAA,KAEA,IAAI,OAAA,CAAsB,CAAC,OAAA,KAAY;AACrC,EAAA,MAAM,aAAkB,EAAC;AAEzB,EAAA,UAAA,CAAW,SAAA;AAAA,IACT,CAAC,KAAA,KAAU;AACT,MAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,IACvB,CAAA;AAAA,IACA,MAAM;AACJ,MAAA,OAAA,CAAQ,UAAU,CAAA;AAAA,IACpB;AAAA,GACF;AACF,CAAC;;;;"}
@@ -27,7 +27,7 @@ import { type InitializedObservable } from '../core/index.mjs';
27
27
  * );
28
28
  * ```
29
29
  */
30
- export declare const createBooleanState: (initialState: boolean) => readonly [state: InitializedObservable<boolean>, Readonly<{
30
+ export declare const createBooleanState: (initialState: boolean) => readonly [state: InitializedObservable<boolean>, utils: Readonly<{
31
31
  setTrue: () => void;
32
32
  setFalse: () => void;
33
33
  setState: (next: boolean) => boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"create-boolean-state.d.mts","sourceRoot":"","sources":["../../src/utils/create-boolean-state.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG/D;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,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;IAC3B,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC,CAsBH,CAAC"}
1
+ {"version":3,"file":"create-boolean-state.d.mts","sourceRoot":"","sources":["../../src/utils/create-boolean-state.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG/D;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,eAAO,MAAM,kBAAkB,iBACf,OAAO,KACpB,SAAS,CACV,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,EACrC,KAAK,EAAE,QAAQ,CAAC;IACd,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;IAC3B,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC,CAsBH,CAAC"}
@@ -1,52 +1,24 @@
1
1
  import { createState } from './create-state.mjs';
2
2
 
3
- /**
4
- * Creates a reactive boolean state with convenient methods for boolean operations.
5
- * Extends `createState` with boolean-specific helpers like `toggle`, `setTrue`, and `setFalse`.
6
- *
7
- * @param initialState - The initial boolean value
8
- * @returns A 2-element tuple: `[state, { setTrue, setFalse, toggle, setState, updateState, resetState, getSnapshot, initialState }]`
9
- *
10
- * @example
11
- * ```ts
12
- * import type * as React from 'react';
13
- * import { createBooleanState } from 'synstate';
14
- * import { useObservableValue } from 'synstate-react-hooks';
15
- *
16
- * // Menu drawer open/close state.
17
- * // setTrue and setFalse can be passed directly as callbacks
18
- * // — no need to create wrapper functions like `() => setState(true)`.
19
- * const [menuOpen$, { setTrue: openMenu, setFalse: closeMenu }] =
20
- * createBooleanState(false);
21
- *
22
- * const SampleComponent = (): React.JSX.Element => (
23
- * <MenuDrawer
24
- * open={useObservableValue(menuOpen$)}
25
- * onClose={closeMenu}
26
- * onOpen={openMenu}
27
- * />
28
- * );
29
- * ```
30
- */
31
3
  const createBooleanState = (initialState) => {
32
- const [state, setState, { updateState, resetState, getSnapshot }] = createState(initialState);
33
- return [
34
- state,
35
- {
36
- setTrue: () => {
37
- setState(true);
38
- },
39
- setFalse: () => {
40
- setState(false);
41
- },
42
- toggle: () => updateState((s) => !s),
43
- setState,
44
- updateState,
45
- resetState,
46
- getSnapshot,
47
- initialState,
48
- },
49
- ];
4
+ const [state, setState, { updateState, resetState, getSnapshot }] = createState(initialState);
5
+ return [
6
+ state,
7
+ {
8
+ setTrue: () => {
9
+ setState(true);
10
+ },
11
+ setFalse: () => {
12
+ setState(false);
13
+ },
14
+ toggle: () => updateState((s) => !s),
15
+ setState,
16
+ updateState,
17
+ resetState,
18
+ getSnapshot,
19
+ initialState
20
+ }
21
+ ];
50
22
  };
51
23
 
52
24
  export { createBooleanState };
@@ -1 +1 @@
1
- {"version":3,"file":"create-boolean-state.mjs","sources":["../../src/utils/create-boolean-state.mts"],"sourcesContent":[null],"names":[],"mappings":";;AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BG;AAEI,MAAM,kBAAkB,GAAG,CAChC,YAAqB,KAanB;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;YACX,YAAY;AACb,SAAA;KACO;AACZ;;;;"}
1
+ {"version":3,"file":"create-boolean-state.mjs","sources":["../../src/utils/create-boolean-state.mts"],"sourcesContent":["import { type InitializedObservable } from '../core/index.mjs';\nimport { createState } from './create-state.mjs';\n\n/**\n * Creates a reactive boolean state with convenient methods for boolean operations.\n * Extends `createState` with boolean-specific helpers like `toggle`, `setTrue`, and `setFalse`.\n *\n * @param initialState - The initial boolean value\n * @returns A 2-element tuple: `[state, { setTrue, setFalse, toggle, setState, updateState, resetState, getSnapshot, initialState }]`\n *\n * @example\n * ```ts\n * import type * as React from 'react';\n * import { createBooleanState } from 'synstate';\n * import { useObservableValue } from 'synstate-react-hooks';\n *\n * // Menu drawer open/close state.\n * // setTrue and setFalse can be passed directly as callbacks\n * // — no need to create wrapper functions like `() => setState(true)`.\n * const [menuOpen$, { setTrue: openMenu, setFalse: closeMenu }] =\n * createBooleanState(false);\n *\n * const SampleComponent = (): React.JSX.Element => (\n * <MenuDrawer\n * open={useObservableValue(menuOpen$)}\n * onClose={closeMenu}\n * onOpen={openMenu}\n * />\n * );\n * ```\n */\n\nexport const createBooleanState = (\n initialState: boolean,\n): readonly [\n state: InitializedObservable<boolean>,\n utils: Readonly<{\n setTrue: () => void;\n setFalse: () => void;\n setState: (next: boolean) => boolean;\n toggle: () => boolean;\n updateState: (updateFn: (prev: boolean) => boolean) => boolean;\n resetState: () => boolean;\n getSnapshot: () => boolean;\n initialState: boolean;\n }>,\n] => {\n const [state, setState, { updateState, resetState, getSnapshot }] =\n createState(initialState);\n\n return [\n state,\n {\n setTrue: () => {\n setState(true);\n },\n setFalse: () => {\n setState(false);\n },\n toggle: () => updateState((s) => !s),\n setState,\n updateState,\n resetState,\n getSnapshot,\n initialState,\n },\n ] as const;\n};\n"],"names":[],"mappings":";;AAgCO,MAAM,kBAAA,GAAqB,CAChC,YAAA,KAaG;AACH,EAAA,MAAM,CAAC,KAAA,EAAO,QAAA,EAAU,EAAE,WAAA,EAAa,YAAY,WAAA,EAAa,CAAA,GAC9D,WAAA,CAAY,YAAY,CAAA;AAE1B,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA;AAAA,MACE,SAAS,MAAM;AACb,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MACf,CAAA;AAAA,MACA,UAAU,MAAM;AACd,QAAA,QAAA,CAAS,KAAK,CAAA;AAAA,MAChB,CAAA;AAAA,MACA,QAAQ,MAAM,WAAA,CAAY,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,MACnC,QAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA;AACF,GACF;AACF;;;;"}
@@ -1,74 +1,20 @@
1
1
  import 'ts-data-forge';
2
2
  import '../core/utils/id-maker.mjs';
3
- import '../core/combine/combine.mjs';
4
3
  import { source } from '../core/create/source.mjs';
5
4
 
6
- /**
7
- * Creates an event emitter for void events (events without payload).
8
- * Returns a tuple of [observable, emitter function].
9
- *
10
- * @returns A tuple containing the observable and the emitter function
11
- *
12
- * @example
13
- * ```ts
14
- * const [click$, emitClick] = createEventEmitter();
15
- *
16
- * const mut_clickCount = { value: 0 };
17
- *
18
- * click$.subscribe(() => {
19
- * mut_clickCount.value += 1;
20
- * });
21
- *
22
- * emitClick(); // logs: Clicked!
23
- *
24
- * assert.deepStrictEqual(mut_clickCount.value, 1);
25
- *
26
- * emitClick();
27
- *
28
- * emitClick();
29
- *
30
- * assert.deepStrictEqual(mut_clickCount.value, 3);
31
- * ```
32
- */
33
5
  const createEventEmitter = () => {
34
- const src$ = source();
35
- const emitter = () => {
36
- src$.next(undefined);
37
- };
38
- return [src$, emitter];
6
+ const src$ = source();
7
+ const emitter = () => {
8
+ src$.next(void 0);
9
+ };
10
+ return [src$, emitter];
39
11
  };
40
- /**
41
- * Creates an event emitter with typed payload.
42
- * Returns a tuple of [observable, emitter function].
43
- *
44
- * @template A - The type of the event payload
45
- * @returns A tuple containing the observable and the emitter function
46
- *
47
- * @example
48
- * ```ts
49
- * const [message$, emitMessage] = createValueEmitter<string>();
50
- *
51
- * const messageHistory: string[] = [];
52
- *
53
- * message$.subscribe((msg) => {
54
- * messageHistory.push(msg);
55
- * });
56
- *
57
- * emitMessage('Hello'); // logs: Hello
58
- *
59
- * assert.deepStrictEqual(messageHistory, ['Hello']);
60
- *
61
- * emitMessage('World');
62
- *
63
- * assert.deepStrictEqual(messageHistory, ['Hello', 'World']);
64
- * ```
65
- */
66
12
  const createValueEmitter = () => {
67
- const src$ = source();
68
- const emitter = (value) => {
69
- src$.next(value);
70
- };
71
- return [src$, emitter];
13
+ const src$ = source();
14
+ const emitter = (value) => {
15
+ src$.next(value);
16
+ };
17
+ return [src$, emitter];
72
18
  };
73
19
 
74
20
  export { createEventEmitter, createValueEmitter };
@@ -1 +1 @@
1
- {"version":3,"file":"create-event-emitter.mjs","sources":["../../src/utils/create-event-emitter.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BG;AACI,MAAM,kBAAkB,GAAG,MAG9B;AACF,IAAA,MAAM,IAAI,GAAG,MAAM,EAAa;IAEhC,MAAM,OAAO,GAAG,MAAW;AACzB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;AACtB,IAAA,CAAC;AAED,IAAA,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;AACxB;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;AAyBG;AACI,MAAM,kBAAkB,GAAG,MAG9B;AACF,IAAA,MAAM,IAAI,GAAG,MAAM,EAAK;AAExB,IAAA,MAAM,OAAO,GAAG,CAAC,KAAQ,KAAU;AACjC,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AAClB,IAAA,CAAC;AAED,IAAA,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;AACxB;;;;"}
1
+ {"version":3,"file":"create-event-emitter.mjs","sources":["../../src/utils/create-event-emitter.mts"],"sourcesContent":["import { source, type Observable } from '../core/index.mjs';\n\n/**\n * Creates an event emitter for void events (events without payload).\n * Returns a tuple of [observable, emitter function].\n *\n * @returns A tuple containing the observable and the emitter function\n *\n * @example\n * ```ts\n * const [click$, emitClick] = createEventEmitter();\n *\n * const mut_clickCount = { value: 0 };\n *\n * click$.subscribe(() => {\n * mut_clickCount.value += 1;\n * });\n *\n * emitClick(); // logs: Clicked!\n *\n * assert.deepStrictEqual(mut_clickCount.value, 1);\n *\n * emitClick();\n *\n * emitClick();\n *\n * assert.deepStrictEqual(mut_clickCount.value, 3);\n * ```\n */\nexport const createEventEmitter = (): readonly [\n Observable<void>,\n () => void,\n] => {\n const src$ = source<undefined>();\n\n const emitter = (): void => {\n src$.next(undefined);\n };\n\n return [src$, emitter];\n};\n\n/**\n * Creates an event emitter with typed payload.\n * Returns a tuple of [observable, emitter function].\n *\n * @template A - The type of the event payload\n * @returns A tuple containing the observable and the emitter function\n *\n * @example\n * ```ts\n * const [message$, emitMessage] = createValueEmitter<string>();\n *\n * const messageHistory: string[] = [];\n *\n * message$.subscribe((msg) => {\n * messageHistory.push(msg);\n * });\n *\n * emitMessage('Hello'); // logs: Hello\n *\n * assert.deepStrictEqual(messageHistory, ['Hello']);\n *\n * emitMessage('World');\n *\n * assert.deepStrictEqual(messageHistory, ['Hello', 'World']);\n * ```\n */\nexport const createValueEmitter = <A,>(): readonly [\n Observable<A>,\n (value: A) => void,\n] => {\n const src$ = source<A>();\n\n const emitter = (value: A): void => {\n src$.next(value);\n };\n\n return [src$, emitter];\n};\n"],"names":[],"mappings":";;;;AA6BO,MAAM,qBAAqB,MAG7B;AACH,EAAA,MAAM,OAAO,MAAA,EAAkB;AAE/B,EAAA,MAAM,UAAU,MAAY;AAC1B,IAAA,IAAA,CAAK,KAAK,MAAS,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,OAAO,CAAC,MAAM,OAAO,CAAA;AACvB;AA4BO,MAAM,qBAAqB,MAG7B;AACH,EAAA,MAAM,OAAO,MAAA,EAAU;AAEvB,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAAmB;AAClC,IAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,EACjB,CAAA;AAEA,EAAA,OAAO,CAAC,MAAM,OAAO,CAAA;AACvB;;;;"}
@@ -43,7 +43,7 @@ import { type InitializedObservable } from '../core/index.mjs';
43
43
  * assert.deepStrictEqual(stateHistory, [0, 1, 2, 1]);
44
44
  * ```
45
45
  */
46
- export declare const createReducer: <S, A>(reducer: Reducer<S, A>, initialState: S) => readonly [state: InitializedObservable<S>, dispatch: (action: A) => S, Readonly<{
46
+ export declare const createReducer: <S, A>(reducer: Reducer<S, A>, initialState: S) => readonly [state: InitializedObservable<S>, dispatch: (action: A) => S, utils: Readonly<{
47
47
  getSnapshot: () => S;
48
48
  initialState: S;
49
49
  }>];
@@ -1 +1 @@
1
- {"version":3,"file":"create-reducer.d.mts","sourceRoot":"","sources":["../../src/utils/create-reducer.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAU,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,CAAC,EAChC,SAAS,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EACtB,cAAc,CAAC,KACd,SAAS,CACV,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,EAC/B,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAC1B,QAAQ,CAAC;IACP,WAAW,EAAE,MAAM,CAAC,CAAC;IACrB,YAAY,EAAE,CAAC,CAAC;CACjB,CAAC,CAeH,CAAC"}
1
+ {"version":3,"file":"create-reducer.d.mts","sourceRoot":"","sources":["../../src/utils/create-reducer.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAU,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,CAAC,WACvB,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,gBACR,CAAC,KACd,SAAS,CACV,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,EAC/B,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EAC1B,KAAK,EAAE,QAAQ,CAAC;IACd,WAAW,EAAE,MAAM,CAAC,CAAC;IACrB,YAAY,EAAE,CAAC,CAAC;CACjB,CAAC,CAeH,CAAC"}
@@ -1,60 +1,16 @@
1
1
  import 'ts-data-forge';
2
2
  import '../core/utils/id-maker.mjs';
3
- import '../core/combine/combine.mjs';
4
3
  import { source } from '../core/create/source.mjs';
5
4
 
6
- /**
7
- * Creates a reducer-based state management container following the Redux pattern.
8
- * Actions are dispatched to update the state according to the reducer function.
9
- *
10
- * @template S - The type of the state
11
- * @template A - The type of actions
12
- * @param reducer - A pure function that takes current state and action, returns new state
13
- * @param initialState - The initial value of the state
14
- * @returns A 3-element tuple: `[state, dispatch, { getSnapshot, initialState }]`
15
- *
16
- * @example
17
- * ```ts
18
- * const [state, dispatch] = createReducer(
19
- * (s, action: Readonly<{ type: 'increment' } | { type: 'decrement' }>) => {
20
- * switch (action.type) {
21
- * case 'increment':
22
- * return s + 1;
23
- * case 'decrement':
24
- * return s - 1;
25
- * }
26
- * },
27
- * 0,
28
- * );
29
- *
30
- * const stateHistory: number[] = [];
31
- *
32
- * state.subscribe((value: number) => {
33
- * stateHistory.push(value);
34
- * });
35
- *
36
- * assert.deepStrictEqual(stateHistory, [0]);
37
- *
38
- * dispatch({ type: 'increment' }); // logs: 1
39
- *
40
- * assert.deepStrictEqual(stateHistory, [0, 1]);
41
- *
42
- * dispatch({ type: 'increment' });
43
- *
44
- * dispatch({ type: 'decrement' });
45
- *
46
- * assert.deepStrictEqual(stateHistory, [0, 1, 2, 1]);
47
- * ```
48
- */
49
5
  const createReducer = (reducer, initialState) => {
50
- const state = source(initialState);
51
- const dispatch = (action) => {
52
- const nextState = reducer(state.getSnapshot().value, action);
53
- state.next(nextState);
54
- return nextState;
55
- };
56
- const getSnapshot = () => state.getSnapshot().value;
57
- return [state, dispatch, { getSnapshot, initialState }];
6
+ const state = source(initialState);
7
+ const dispatch = (action) => {
8
+ const nextState = reducer(state.getSnapshot().value, action);
9
+ state.next(nextState);
10
+ return nextState;
11
+ };
12
+ const getSnapshot = () => state.getSnapshot().value;
13
+ return [state, dispatch, { getSnapshot, initialState }];
58
14
  };
59
15
 
60
16
  export { createReducer };
@@ -1 +1 @@
1
- {"version":3,"file":"create-reducer.mjs","sources":["../../src/utils/create-reducer.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CG;MACU,aAAa,GAAG,CAC3B,OAAsB,EACtB,YAAe,KAQb;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;IAEtD,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,CAAU;AAClE;;;;"}
1
+ {"version":3,"file":"create-reducer.mjs","sources":["../../src/utils/create-reducer.mts"],"sourcesContent":["import { type Reducer } from 'ts-type-forge';\nimport { source, type InitializedObservable } from '../core/index.mjs';\n\n/**\n * Creates a reducer-based state management container following the Redux pattern.\n * Actions are dispatched to update the state according to the reducer function.\n *\n * @template S - The type of the state\n * @template A - The type of actions\n * @param reducer - A pure function that takes current state and action, returns new state\n * @param initialState - The initial value of the state\n * @returns A 3-element tuple: `[state, dispatch, { getSnapshot, initialState }]`\n *\n * @example\n * ```ts\n * const [state, dispatch] = createReducer(\n * (s, action: Readonly<{ type: 'increment' } | { type: 'decrement' }>) => {\n * switch (action.type) {\n * case 'increment':\n * return s + 1;\n * case 'decrement':\n * return s - 1;\n * }\n * },\n * 0,\n * );\n *\n * const stateHistory: number[] = [];\n *\n * state.subscribe((value: number) => {\n * stateHistory.push(value);\n * });\n *\n * assert.deepStrictEqual(stateHistory, [0]);\n *\n * dispatch({ type: 'increment' }); // logs: 1\n *\n * assert.deepStrictEqual(stateHistory, [0, 1]);\n *\n * dispatch({ type: 'increment' });\n *\n * dispatch({ type: 'decrement' });\n *\n * assert.deepStrictEqual(stateHistory, [0, 1, 2, 1]);\n * ```\n */\nexport const createReducer = <S, A>(\n reducer: Reducer<S, A>,\n initialState: S,\n): readonly [\n state: InitializedObservable<S>,\n dispatch: (action: A) => S,\n utils: Readonly<{\n getSnapshot: () => S;\n initialState: S;\n }>,\n] => {\n const state = source<S>(initialState);\n\n const dispatch = (action: A): S => {\n const nextState = reducer(state.getSnapshot().value, action);\n\n state.next(nextState);\n\n return nextState;\n };\n\n const getSnapshot = (): S => state.getSnapshot().value;\n\n return [state, dispatch, { getSnapshot, initialState }] as const;\n};\n"],"names":[],"mappings":";;;;AA8CO,MAAM,aAAA,GAAgB,CAC3B,OAAA,EACA,YAAA,KAQG;AACH,EAAA,MAAM,KAAA,GAAQ,OAAU,YAAY,CAAA;AAEpC,EAAA,MAAM,QAAA,GAAW,CAAC,MAAA,KAAiB;AACjC,IAAA,MAAM,YAAY,OAAA,CAAQ,KAAA,CAAM,WAAA,EAAY,CAAE,OAAO,MAAM,CAAA;AAE3D,IAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAEpB,IAAA,OAAO,SAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,MAAS,KAAA,CAAM,WAAA,EAAY,CAAE,KAAA;AAEjD,EAAA,OAAO,CAAC,KAAA,EAAO,QAAA,EAAU,EAAE,WAAA,EAAa,cAAc,CAAA;AACxD;;;;"}
@@ -32,7 +32,7 @@ import { type InitializedObservable } from '../core/index.mjs';
32
32
  * assert.deepStrictEqual(stateHistory, [0, 10, 11, 0]);
33
33
  * ```
34
34
  */
35
- export declare const createState: <S>(initialState: S) => readonly [state: InitializedObservable<S>, setState: (v: S) => S, Readonly<{
35
+ export declare const createState: <S>(initialState: S) => readonly [state: InitializedObservable<S>, setState: (v: S) => S, utils: Readonly<{
36
36
  updateState: (updateFn: (prev: S) => S) => S;
37
37
  resetState: () => S;
38
38
  getSnapshot: () => S;
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;IACrB,YAAY,EAAE,CAAC,CAAC;CACjB,CAAC,CAyBH,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,gBACb,CAAC,KACd,SAAS,CACV,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,EAC/B,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EACrB,KAAK,EAAE,QAAQ,CAAC;IACd,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;IACrB,YAAY,EAAE,CAAC,CAAC;CACjB,CAAC,CAyBH,CAAC"}
@@ -1,61 +1,31 @@
1
1
  import { createReducer } from './create-reducer.mjs';
2
2
 
3
3
  const reducer = (state, action) => {
4
- switch (action.type) {
5
- case 'set':
6
- return action.nextState;
7
- case 'update':
8
- return action.updateFn(state);
9
- }
4
+ switch (action.type) {
5
+ case "set":
6
+ return action.nextState;
7
+ case "update":
8
+ return action.updateFn(state);
9
+ }
10
10
  };
11
- /**
12
- * Creates a reactive state container with getter and setter methods.
13
- * Provides a simple state management solution with observable state.
14
- *
15
- * @template S - The type of the state
16
- * @param initialState - The initial value of the state
17
- * @returns A 3-element tuple: `[state, setState, { updateState, resetState, getSnapshot, initialState }]`
18
- *
19
- * @example
20
- * ```ts
21
- * const [state, setState, { updateState, resetState }] = createState(0);
22
- *
23
- * const stateHistory: number[] = [];
24
- *
25
- * state.subscribe((value: number) => {
26
- * stateHistory.push(value);
27
- * });
28
- *
29
- * assert.deepStrictEqual(stateHistory, [0]);
30
- *
31
- * setState(10); // logs: 10
32
- *
33
- * assert.deepStrictEqual(stateHistory, [0, 10]);
34
- *
35
- * updateState((prev: number) => prev + 1); // logs: 11
36
- *
37
- * assert.deepStrictEqual(stateHistory, [0, 10, 11]);
38
- *
39
- * resetState(); // logs: 0
40
- *
41
- * assert.deepStrictEqual(stateHistory, [0, 10, 11, 0]);
42
- * ```
43
- */
44
11
  const createState = (initialState) => {
45
- const [state, dispatch, { getSnapshot }] = createReducer(reducer, initialState);
46
- const updateState = (updateFn) => dispatch({ type: 'update', updateFn });
47
- const setState = (nextState) => dispatch({ type: 'set', nextState });
48
- const resetState = () => dispatch({ type: 'set', nextState: initialState });
49
- return [
50
- state,
51
- setState,
52
- {
53
- updateState,
54
- resetState,
55
- getSnapshot,
56
- initialState,
57
- },
58
- ];
12
+ const [state, dispatch, { getSnapshot }] = createReducer(
13
+ reducer,
14
+ initialState
15
+ );
16
+ const updateState = (updateFn) => dispatch({ type: "update", updateFn });
17
+ const setState = (nextState) => dispatch({ type: "set", nextState });
18
+ const resetState = () => dispatch({ type: "set", nextState: initialState });
19
+ return [
20
+ state,
21
+ setState,
22
+ {
23
+ updateState,
24
+ resetState,
25
+ getSnapshot,
26
+ initialState
27
+ }
28
+ ];
59
29
  };
60
30
 
61
31
  export { createState };
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCG;AACI,MAAM,WAAW,GAAG,CACzB,YAAe,KAUb;AACF,IAAA,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,GAAG,aAAa,CACtD,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;YACX,YAAY;AACb,SAAA;KACO;AACZ;;;;"}
1
+ {"version":3,"file":"create-state.mjs","sources":["../../src/utils/create-state.mts"],"sourcesContent":["import { type InitializedObservable } from '../core/index.mjs';\nimport { createReducer } from './create-reducer.mjs';\n\ntype Action<S> = Readonly<\n | {\n type: 'set';\n nextState: S;\n }\n | {\n type: 'update';\n updateFn: (a: S) => S;\n }\n>;\n\nconst reducer = <S,>(state: S, action: Action<S>): S => {\n switch (action.type) {\n case 'set':\n return action.nextState;\n\n case 'update':\n return action.updateFn(state);\n }\n};\n\n/**\n * Creates a reactive state container with getter and setter methods.\n * Provides a simple state management solution with observable state.\n *\n * @template S - The type of the state\n * @param initialState - The initial value of the state\n * @returns A 3-element tuple: `[state, setState, { updateState, resetState, getSnapshot, initialState }]`\n *\n * @example\n * ```ts\n * const [state, setState, { updateState, resetState }] = createState(0);\n *\n * const stateHistory: number[] = [];\n *\n * state.subscribe((value: number) => {\n * stateHistory.push(value);\n * });\n *\n * assert.deepStrictEqual(stateHistory, [0]);\n *\n * setState(10); // logs: 10\n *\n * assert.deepStrictEqual(stateHistory, [0, 10]);\n *\n * updateState((prev: number) => prev + 1); // logs: 11\n *\n * assert.deepStrictEqual(stateHistory, [0, 10, 11]);\n *\n * resetState(); // logs: 0\n *\n * assert.deepStrictEqual(stateHistory, [0, 10, 11, 0]);\n * ```\n */\nexport const createState = <S,>(\n initialState: S,\n): readonly [\n state: InitializedObservable<S>,\n setState: (v: S) => S,\n utils: Readonly<{\n updateState: (updateFn: (prev: S) => S) => S;\n resetState: () => S;\n getSnapshot: () => S;\n initialState: S;\n }>,\n] => {\n const [state, dispatch, { getSnapshot }] = createReducer<S, Action<S>>(\n reducer,\n initialState,\n );\n\n const updateState = (updateFn: (prev: S) => S): S =>\n dispatch({ type: 'update', updateFn });\n\n const setState = (nextState: S): S => dispatch({ type: 'set', nextState });\n\n const resetState = (): S =>\n dispatch({ type: 'set', nextState: initialState });\n\n return [\n state,\n setState,\n {\n updateState,\n resetState,\n getSnapshot,\n initialState,\n },\n ] as const;\n};\n"],"names":[],"mappings":";;AAcA,MAAM,OAAA,GAAU,CAAK,KAAA,EAAU,MAAA,KAAyB;AACtD,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,KAAA;AACH,MAAA,OAAO,MAAA,CAAO,SAAA;AAAA,IAEhB,KAAK,QAAA;AACH,MAAA,OAAO,MAAA,CAAO,SAAS,KAAK,CAAA;AAAA;AAElC,CAAA;AAmCO,MAAM,WAAA,GAAc,CACzB,YAAA,KAUG;AACH,EAAA,MAAM,CAAC,KAAA,EAAO,QAAA,EAAU,EAAE,WAAA,EAAa,CAAA,GAAI,aAAA;AAAA,IACzC,OAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,QAAA,KACnB,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,CAAA;AAEvC,EAAA,MAAM,QAAA,GAAW,CAAC,SAAA,KAAoB,QAAA,CAAS,EAAE,IAAA,EAAM,KAAA,EAAO,WAAW,CAAA;AAEzE,EAAA,MAAM,UAAA,GAAa,MACjB,QAAA,CAAS,EAAE,MAAM,KAAA,EAAO,SAAA,EAAW,cAAc,CAAA;AAEnD,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,MACE,WAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA;AACF,GACF;AACF;;;;"}
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "synstate",
3
- "version": "1.0.2",
3
+ "version": "2.0.1",
4
4
  "description": "Type-safe State Management Library for TypeScript/JavaScript",
5
5
  "repository": {
6
6
  "type": "git",
7
- "url": "git+https://github.com/noshiro-pf/synstate.git"
7
+ "url": "git+https://github.com/noshiro-pf/mono.git",
8
+ "directory": "libs/synstate"
8
9
  },
9
10
  "license": "Apache-2.0",
10
11
  "author": "noshiro-pf <noshiro.pf@gmail.com>",
@@ -28,38 +29,51 @@
28
29
  "LICENSE"
29
30
  ],
30
31
  "dependencies": {
31
- "ts-data-forge": "^6.9.6",
32
- "ts-type-forge": "^3.1.0"
32
+ "ts-data-forge": "^14.2.1",
33
+ "ts-type-forge": "^9.2.1"
33
34
  },
34
35
  "devDependencies": {
35
36
  "@reduxjs/toolkit": "2.12.0",
36
- "@types/argparse": "2.0.17",
37
- "@types/react": "19.2.14",
38
- "argparse": "2.0.1",
39
- "jotai": "2.19.1",
40
- "mobx": "6.15.0",
41
- "react": "19.2.5",
37
+ "@rollup/plugin-replace": "6.0.3",
38
+ "@rollup/plugin-strip": "3.0.4",
39
+ "@types/react": "19.2.18",
40
+ "argparse": "3.0.0",
41
+ "jotai": "2.20.2",
42
+ "mobx": "7.0.0",
43
+ "prettier": "3.9.6",
44
+ "prettier-plugin-organize-imports": "4.3.0",
45
+ "prettier-plugin-packagejson": "3.0.2",
46
+ "react": "19.2.8",
47
+ "rollup": "4.62.4",
48
+ "rollup-plugin-esbuild": "6.2.1",
42
49
  "rxjs": "7.8.2",
43
- "valtio": "2.3.1",
44
- "zustand": "5.0.12"
50
+ "valtio": "2.3.2",
51
+ "zustand": "5.0.14",
52
+ "eslint-config-typed": "5.8.5",
53
+ "eslint-plugin-ts-data-forge": "0.4.4",
54
+ "eslint-plugin-ts-fortress": "1.0.1",
55
+ "eslint-plugin-ts-type-forge": "0.6.3",
56
+ "synstate-react-hooks": "2.0.1",
57
+ "synstate-react-hooks-compat": "2.0.1",
58
+ "ts-repo-utils": "10.2.0"
45
59
  },
46
60
  "scripts": {
47
- "benchmark": "tsx ./scripts/cmd/run-benchmark.mts",
48
- "benchmark:cascaded-diamond": "tsx ./scripts/cmd/run-benchmark-cascaded-diamond.mts",
49
- "benchmark:deep-chain": "tsx ./scripts/cmd/run-benchmark-deep-chain.mts",
50
- "build": "tsx ./scripts/cmd/build.mts",
51
- "build:min": "tsx ./scripts/cmd/build.mts --skip-check",
52
- "check:ext": "tsx ./scripts/cmd/check-ext.mts",
53
- "check-all": "tsx ./scripts/cmd/check-all.mts",
61
+ "benchmark": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/run-benchmark.mts",
62
+ "benchmark:cascaded-diamond": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/run-benchmark-cascaded-diamond.mts",
63
+ "benchmark:deep-chain": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/run-benchmark-deep-chain.mts",
64
+ "build": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/build.mts",
65
+ "build:min": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/build.mts --skip-check",
66
+ "check:ext": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/check-ext.mts",
67
+ "check-all": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/check-all.mts",
54
68
  "doc": "run-s doc:embed doc:embed:jsdoc doc:gen-sample-diffs fmt",
55
- "doc:embed": "tsx ./scripts/cmd/embed-examples.mts",
56
- "doc:embed:jsdoc": "tsx ./scripts/cmd/embed-examples-in-jsdoc.mts",
57
- "doc:gen-sample-diffs": "tsx ./scripts/cmd/generate-sample-diffs.mts",
58
- "fmt": "format-uncommitted --cwd .",
59
- "fmt:diff": "format-diff-from origin/main --cwd .",
69
+ "doc:embed": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/embed-examples.mts",
70
+ "doc:embed:jsdoc": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/embed-examples-in-jsdoc.mts",
71
+ "doc:gen-sample-diffs": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ./scripts/cmd/generate-sample-diffs.mts",
72
+ "fmt": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ../../libs/ts-repo-utils/src/cmd/format-uncommitted.mts --cwd .",
73
+ "fmt:diff": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ../../libs/ts-repo-utils/src/cmd/format-diff-from.mts origin/main --cwd .",
60
74
  "fmt:full": "pnpm run z:prettier .",
61
75
  "gi": "run-s gi:src fmt",
62
- "gi:src": "gen-index-ts ./src --index-ext .mts --export-ext .mjs --target-ext .mts --target-ext .tsx --exclude entry-point.mts --exclude \"core/utils/**\"",
76
+ "gi:src": "tsx --tsconfig ../../tools/configs/tsconfig.tsx.json ../../libs/ts-repo-utils/src/cmd/gen-index-ts.mts ./src --index-ext .mts --export-ext .mjs --target-ext .mts --target-ext .tsx --exclude entry-point.mts --exclude \"core/utils/**\"",
63
77
  "lint": "eslint .",
64
78
  "lint:fix": "eslint . --fix",
65
79
  "test": "pnpm run z:vitest:node run",
@@ -68,10 +82,9 @@
68
82
  "test:cov:ui": "vite preview --outDir ./coverage",
69
83
  "test:ui": "pnpm run z:vitest:node --ui",
70
84
  "testw": "pnpm run z:vitest:node watch",
71
- "tsc": "tsc --noEmit",
72
- "tscw": "tsc --noEmit --watch",
73
- "type-check": "tsc --noEmit",
74
- "update-packages": "pnpm update --latest",
85
+ "tsc": "node ../../node_modules/typescript-native/bin/tsc --noEmit",
86
+ "tscw": "node ../../node_modules/typescript-native/bin/tsc --noEmit --watch",
87
+ "type-check": "node ../../node_modules/typescript-native/bin/tsc --noEmit",
75
88
  "z:prettier": "prettier --config ../../.prettierrc --ignore-path ../../.prettierignore --ignore-path ../../.gitignore --ignore-unknown --no-error-on-unmatched-pattern --write",
76
89
  "z:vitest": "vitest --config ./configs/vitest.config.mts",
77
90
  "z:vitest:node": "pnpm run z:vitest --project='Node.js'",
@@ -128,8 +128,8 @@ export class AsyncChildObservableClass<A, const P extends NonEmptyUnknownList>
128
128
  extends ObservableBaseClass<A, 'async child', number>
129
129
  implements AsyncChildObservable<A, P>
130
130
  {
131
- readonly parents;
132
131
  #mut_propagationOrder: readonly ChildObservable<unknown>[];
132
+ readonly parents;
133
133
  protected readonly descendantsIdSet: MutableSet<ObservableId>;
134
134
 
135
135
  constructor({
@@ -24,14 +24,14 @@ export class ObservableBaseClass<
24
24
  Kind extends ObservableBase<A>['kind'],
25
25
  Depth extends ObservableBase<A>['depth'],
26
26
  > implements ObservableBase<A> {
27
- readonly id;
28
- readonly kind: Kind;
29
- readonly depth: Depth;
30
27
  #mut_children: readonly ChildObservable<unknown>[];
31
28
  readonly #subscribers: MutableMap<SubscriberId, Subscriber<A>>;
32
29
  #mut_currentValue: ReturnType<ObservableBase<A>['getSnapshot']>;
33
30
  #mut_isCompleted: ObservableBase<A>['isCompleted'];
34
31
  #mut_updateToken: ObservableBase<A>['updateToken'];
32
+ readonly id;
33
+ readonly kind: Kind;
34
+ readonly depth: Depth;
35
35
 
36
36
  constructor({
37
37
  kind,
@@ -59,6 +59,19 @@ export class ObservableBaseClass<
59
59
  this.#mut_updateToken = issueUpdateToken();
60
60
  }
61
61
 
62
+ #addSubscriber(s: Subscriber<A>): SubscriberId {
63
+ // return the id of added subscriber
64
+ const id = issueSubscriberId();
65
+
66
+ this.#subscribers.set(id, s);
67
+
68
+ return id;
69
+ }
70
+
71
+ #removeSubscriber(id: SubscriberId): void {
72
+ this.#subscribers.delete(id);
73
+ }
74
+
62
75
  addChild<B>(child: ChildObservable<B>): void {
63
76
  this.#mut_children = Arr.toPushed(
64
77
  this.#mut_children,
@@ -171,17 +184,4 @@ export class ObservableBaseClass<
171
184
  },
172
185
  };
173
186
  }
174
-
175
- #addSubscriber(s: Subscriber<A>): SubscriberId {
176
- // return the id of added subscriber
177
- const id = issueSubscriberId();
178
-
179
- this.#subscribers.set(id, s);
180
-
181
- return id;
182
- }
183
-
184
- #removeSubscriber(id: SubscriberId): void {
185
- this.#subscribers.delete(id);
186
- }
187
187
  }