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.
- package/README.md +16 -17
- package/dist/core/class/child-observable-class.d.mts.map +1 -1
- package/dist/core/class/child-observable-class.mjs +148 -140
- package/dist/core/class/child-observable-class.mjs.map +1 -1
- package/dist/core/class/observable-base-class.d.mts.map +1 -1
- package/dist/core/class/observable-base-class.mjs +111 -107
- package/dist/core/class/observable-base-class.mjs.map +1 -1
- package/dist/core/class/root-observable-class.d.mts.map +1 -1
- package/dist/core/class/root-observable-class.mjs +32 -24
- package/dist/core/class/root-observable-class.mjs.map +1 -1
- package/dist/core/combine/combine.d.mts +3 -3
- package/dist/core/combine/combine.d.mts.map +1 -1
- package/dist/core/combine/combine.mjs +31 -113
- package/dist/core/combine/combine.mjs.map +1 -1
- package/dist/core/combine/merge.d.mts +2 -2
- package/dist/core/combine/merge.d.mts.map +1 -1
- package/dist/core/combine/merge.mjs +21 -69
- package/dist/core/combine/merge.mjs.map +1 -1
- package/dist/core/combine/zip.d.mts +2 -2
- package/dist/core/combine/zip.d.mts.map +1 -1
- package/dist/core/combine/zip.mjs +34 -79
- package/dist/core/combine/zip.mjs.map +1 -1
- package/dist/core/create/counter.d.mts +1 -1
- package/dist/core/create/counter.d.mts.map +1 -1
- package/dist/core/create/counter.mjs +45 -84
- package/dist/core/create/counter.mjs.map +1 -1
- package/dist/core/create/from-abortable-promise.d.mts.map +1 -1
- package/dist/core/create/from-abortable-promise.mjs +29 -61
- package/dist/core/create/from-abortable-promise.mjs.map +1 -1
- package/dist/core/create/from-promise.d.mts.map +1 -1
- package/dist/core/create/from-promise.mjs +17 -66
- package/dist/core/create/from-promise.mjs.map +1 -1
- package/dist/core/create/from-subscribable.d.mts.map +1 -1
- package/dist/core/create/from-subscribable.mjs +18 -69
- package/dist/core/create/from-subscribable.mjs.map +1 -1
- package/dist/core/create/just.d.mts.map +1 -1
- package/dist/core/create/just.mjs +5 -35
- package/dist/core/create/just.mjs.map +1 -1
- package/dist/core/create/source.mjs +10 -13
- package/dist/core/create/source.mjs.map +1 -1
- package/dist/core/create/timer.d.mts.map +1 -1
- package/dist/core/create/timer.mjs +32 -68
- package/dist/core/create/timer.mjs.map +1 -1
- package/dist/core/operators/audit.d.mts.map +1 -1
- package/dist/core/operators/audit.mjs +39 -133
- package/dist/core/operators/audit.mjs.map +1 -1
- package/dist/core/operators/debounce.d.mts.map +1 -1
- package/dist/core/operators/debounce.mjs +36 -119
- package/dist/core/operators/debounce.mjs.map +1 -1
- package/dist/core/operators/filter.mjs +22 -25
- package/dist/core/operators/filter.mjs.map +1 -1
- package/dist/core/operators/map.d.mts.map +1 -1
- package/dist/core/operators/map.mjs +28 -61
- package/dist/core/operators/map.mjs.map +1 -1
- package/dist/core/operators/merge-map.d.mts +1 -1
- package/dist/core/operators/merge-map.d.mts.map +1 -1
- package/dist/core/operators/merge-map.mjs +34 -130
- package/dist/core/operators/merge-map.mjs.map +1 -1
- package/dist/core/operators/pairwise.d.mts +3 -2
- package/dist/core/operators/pairwise.d.mts.map +1 -1
- package/dist/core/operators/pairwise.mjs +19 -75
- package/dist/core/operators/pairwise.mjs.map +1 -1
- package/dist/core/operators/scan.d.mts.map +1 -1
- package/dist/core/operators/scan.mjs +16 -67
- package/dist/core/operators/scan.mjs.map +1 -1
- package/dist/core/operators/skip-if-no-change.d.mts +1 -1
- package/dist/core/operators/skip-if-no-change.d.mts.map +1 -1
- package/dist/core/operators/skip-if-no-change.mjs +28 -92
- package/dist/core/operators/skip-if-no-change.mjs.map +1 -1
- package/dist/core/operators/skip-until.d.mts.map +1 -1
- package/dist/core/operators/skip-until.mjs +23 -72
- package/dist/core/operators/skip-until.mjs.map +1 -1
- package/dist/core/operators/skip-while.d.mts.map +1 -1
- package/dist/core/operators/skip-while.mjs +26 -88
- package/dist/core/operators/skip-while.mjs.map +1 -1
- package/dist/core/operators/switch-map.d.mts.map +1 -1
- package/dist/core/operators/switch-map.mjs +31 -124
- package/dist/core/operators/switch-map.mjs.map +1 -1
- package/dist/core/operators/take-until.d.mts.map +1 -1
- package/dist/core/operators/take-until.mjs +28 -69
- package/dist/core/operators/take-until.mjs.map +1 -1
- package/dist/core/operators/take-while.d.mts.map +1 -1
- package/dist/core/operators/take-while.mjs +23 -83
- package/dist/core/operators/take-while.mjs.map +1 -1
- package/dist/core/operators/throttle.d.mts.map +1 -1
- package/dist/core/operators/throttle.mjs +38 -115
- package/dist/core/operators/throttle.mjs.map +1 -1
- package/dist/core/operators/with-buffered-from.d.mts +1 -1
- package/dist/core/operators/with-buffered-from.d.mts.map +1 -1
- package/dist/core/operators/with-buffered-from.mjs +37 -90
- package/dist/core/operators/with-buffered-from.mjs.map +1 -1
- package/dist/core/operators/with-current-value-from.d.mts +1 -1
- package/dist/core/operators/with-current-value-from.d.mts.map +1 -1
- package/dist/core/operators/with-current-value-from.mjs +23 -84
- package/dist/core/operators/with-current-value-from.mjs.map +1 -1
- package/dist/core/operators/with-initial-value.d.mts.map +1 -1
- package/dist/core/operators/with-initial-value.mjs +13 -58
- package/dist/core/operators/with-initial-value.mjs.map +1 -1
- package/dist/core/predefined/operators/attach-index.d.mts +1 -1
- package/dist/core/predefined/operators/attach-index.d.mts.map +1 -1
- package/dist/core/predefined/operators/attach-index.mjs +0 -53
- package/dist/core/predefined/operators/attach-index.mjs.map +1 -1
- package/dist/core/predefined/operators/map-optional.d.mts.map +1 -1
- package/dist/core/predefined/operators/map-optional.mjs +1 -48
- package/dist/core/predefined/operators/map-optional.mjs.map +1 -1
- package/dist/core/predefined/operators/map-result-err.d.mts.map +1 -1
- package/dist/core/predefined/operators/map-result-err.mjs +1 -48
- package/dist/core/predefined/operators/map-result-err.mjs.map +1 -1
- package/dist/core/predefined/operators/map-result-ok.d.mts.map +1 -1
- package/dist/core/predefined/operators/map-result-ok.mjs +1 -48
- package/dist/core/predefined/operators/map-result-ok.mjs.map +1 -1
- package/dist/core/predefined/operators/map-to.d.mts.map +1 -1
- package/dist/core/predefined/operators/map-to.mjs +0 -40
- package/dist/core/predefined/operators/map-to.mjs.map +1 -1
- package/dist/core/predefined/operators/pluck.d.mts +1 -1
- package/dist/core/predefined/operators/pluck.d.mts.map +1 -1
- package/dist/core/predefined/operators/pluck.mjs +0 -43
- package/dist/core/predefined/operators/pluck.mjs.map +1 -1
- package/dist/core/predefined/operators/skip.d.mts.map +1 -1
- package/dist/core/predefined/operators/skip.mjs +0 -47
- package/dist/core/predefined/operators/skip.mjs.map +1 -1
- package/dist/core/predefined/operators/take.d.mts.map +1 -1
- package/dist/core/predefined/operators/take.mjs +0 -41
- package/dist/core/predefined/operators/take.mjs.map +1 -1
- package/dist/core/predefined/operators/unwrap-optional.mjs +4 -43
- package/dist/core/predefined/operators/unwrap-optional.mjs.map +1 -1
- package/dist/core/predefined/operators/unwrap-result-err.mjs +0 -40
- package/dist/core/predefined/operators/unwrap-result-err.mjs.map +1 -1
- package/dist/core/predefined/operators/unwrap-result-ok.mjs +4 -43
- package/dist/core/predefined/operators/unwrap-result-ok.mjs.map +1 -1
- package/dist/core/types/observable-family.d.mts +10 -10
- package/dist/core/types/observable-family.d.mts.map +1 -1
- package/dist/core/types/observable.d.mts.map +1 -1
- package/dist/core/types/observable.mjs +3 -5
- package/dist/core/types/observable.mjs.map +1 -1
- package/dist/core/types/types.d.mts +2 -1
- package/dist/core/types/types.d.mts.map +1 -1
- package/dist/core/utils/id-maker.mjs +5 -6
- package/dist/core/utils/id-maker.mjs.map +1 -1
- package/dist/core/utils/max-depth.d.mts.map +1 -1
- package/dist/core/utils/max-depth.mjs +1 -3
- package/dist/core/utils/max-depth.mjs.map +1 -1
- package/dist/core/utils/observable-utils.d.mts.map +1 -1
- package/dist/core/utils/observable-utils.mjs +3 -2
- package/dist/core/utils/observable-utils.mjs.map +1 -1
- package/dist/core/utils/utils.d.mts.map +1 -1
- package/dist/core/utils/utils.mjs +23 -30
- package/dist/core/utils/utils.mjs.map +1 -1
- package/dist/utils/collect-to-array.d.mts.map +1 -1
- package/dist/utils/collect-to-array.mjs +9 -6
- package/dist/utils/collect-to-array.mjs.map +1 -1
- package/dist/utils/create-boolean-state.d.mts +1 -1
- package/dist/utils/create-boolean-state.d.mts.map +1 -1
- package/dist/utils/create-boolean-state.mjs +18 -46
- package/dist/utils/create-boolean-state.mjs.map +1 -1
- package/dist/utils/create-event-emitter.mjs +10 -64
- package/dist/utils/create-event-emitter.mjs.map +1 -1
- package/dist/utils/create-reducer.d.mts +1 -1
- package/dist/utils/create-reducer.d.mts.map +1 -1
- package/dist/utils/create-reducer.mjs +8 -52
- package/dist/utils/create-reducer.mjs.map +1 -1
- package/dist/utils/create-state.d.mts +1 -1
- package/dist/utils/create-state.d.mts.map +1 -1
- package/dist/utils/create-state.mjs +23 -53
- package/dist/utils/create-state.mjs.map +1 -1
- package/package.json +42 -29
- package/src/core/class/child-observable-class.mts +1 -1
- package/src/core/class/observable-base-class.mts +16 -16
- package/src/core/combine/combine.mts +38 -16
- package/src/core/combine/merge.mts +3 -3
- package/src/core/combine/zip.mts +24 -13
- package/src/core/create/counter.mts +11 -9
- package/src/core/create/counter.test.mts +11 -0
- package/src/core/create/timer.mts +6 -6
- package/src/core/create/timer.test.mts +11 -0
- package/src/core/operators/audit-throttle-teardown.test.mts +21 -0
- package/src/core/operators/audit.mts +6 -6
- package/src/core/operators/debounce.mts +6 -6
- package/src/core/operators/pairwise.mts +10 -5
- package/src/core/operators/skip-while.mts +1 -5
- package/src/core/operators/skip-while.test.mts +20 -0
- package/src/core/operators/throttle.mts +6 -6
- package/src/core/operators/with-buffered-from.mts +4 -4
- package/src/core/predefined/operators/map-optional.mts +1 -2
- package/src/core/predefined/operators/map-result-err.mts +1 -1
- package/src/core/predefined/operators/map-result-ok.mts +1 -1
- package/src/core/types/observable-family.mts +12 -11
- package/src/core/types/observable.mts +5 -7
- package/src/core/types/types.mts +2 -1
- package/src/core/utils/max-depth.mts +5 -1
- package/src/core/utils/utils.mts +1 -1
- package/src/utils/create-boolean-state.mts +1 -1
- package/src/utils/create-reducer.mts +1 -1
- 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":[
|
|
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,
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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":[
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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":[
|
|
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,
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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":[
|
|
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,
|
|
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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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":[
|
|
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": "
|
|
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/
|
|
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": "^
|
|
32
|
-
"ts-type-forge": "^
|
|
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
|
-
"@
|
|
37
|
-
"@
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
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.
|
|
44
|
-
"zustand": "5.0.
|
|
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
|
}
|