synstate 0.1.0 → 0.1.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/LICENSE +201 -0
- package/README.md +124 -350
- package/assets/synstate-icon.png +0 -0
- package/dist/core/combine/combine.d.mts +32 -2
- package/dist/core/combine/combine.d.mts.map +1 -1
- package/dist/core/combine/combine.mjs +32 -2
- package/dist/core/combine/combine.mjs.map +1 -1
- package/dist/core/combine/merge.d.mts +30 -4
- package/dist/core/combine/merge.d.mts.map +1 -1
- package/dist/core/combine/merge.mjs +30 -4
- package/dist/core/combine/merge.mjs.map +1 -1
- package/dist/core/combine/zip.d.mts +28 -3
- package/dist/core/combine/zip.d.mts.map +1 -1
- package/dist/core/combine/zip.mjs +28 -3
- package/dist/core/combine/zip.mjs.map +1 -1
- package/dist/core/create/from-array.d.mts +21 -3
- package/dist/core/create/from-array.d.mts.map +1 -1
- package/dist/core/create/from-array.mjs +21 -3
- package/dist/core/create/from-array.mjs.map +1 -1
- package/dist/core/create/from-promise.d.mts +29 -7
- package/dist/core/create/from-promise.d.mts.map +1 -1
- package/dist/core/create/from-promise.mjs +29 -7
- package/dist/core/create/from-promise.mjs.map +1 -1
- package/dist/core/create/from-subscribable.d.mts +58 -0
- package/dist/core/create/from-subscribable.d.mts.map +1 -1
- package/dist/core/create/from-subscribable.mjs +58 -0
- package/dist/core/create/from-subscribable.mjs.map +1 -1
- package/dist/core/create/interval.d.mts +29 -4
- package/dist/core/create/interval.d.mts.map +1 -1
- package/dist/core/create/interval.mjs +29 -4
- package/dist/core/create/interval.mjs.map +1 -1
- package/dist/core/create/of.d.mts +22 -3
- package/dist/core/create/of.d.mts.map +1 -1
- package/dist/core/create/of.mjs +22 -3
- package/dist/core/create/of.mjs.map +1 -1
- package/dist/core/create/source.d.mts +20 -1
- package/dist/core/create/source.d.mts.map +1 -1
- package/dist/core/create/source.mjs.map +1 -1
- package/dist/core/create/timer.d.mts +23 -4
- package/dist/core/create/timer.d.mts.map +1 -1
- package/dist/core/create/timer.mjs +23 -4
- package/dist/core/create/timer.mjs.map +1 -1
- package/dist/core/operators/audit-time.d.mts +59 -0
- package/dist/core/operators/audit-time.d.mts.map +1 -1
- package/dist/core/operators/audit-time.mjs +59 -0
- package/dist/core/operators/audit-time.mjs.map +1 -1
- package/dist/core/operators/debounce-time.d.mts +22 -2
- package/dist/core/operators/debounce-time.d.mts.map +1 -1
- package/dist/core/operators/debounce-time.mjs +22 -2
- package/dist/core/operators/debounce-time.mjs.map +1 -1
- package/dist/core/operators/filter.d.mts +26 -1
- package/dist/core/operators/filter.d.mts.map +1 -1
- package/dist/core/operators/filter.mjs.map +1 -1
- package/dist/core/operators/map-with-index.d.mts +19 -4
- package/dist/core/operators/map-with-index.d.mts.map +1 -1
- package/dist/core/operators/map-with-index.mjs +19 -4
- package/dist/core/operators/map-with-index.mjs.map +1 -1
- package/dist/core/operators/merge-map.d.mts +47 -5
- package/dist/core/operators/merge-map.d.mts.map +1 -1
- package/dist/core/operators/merge-map.mjs +47 -5
- package/dist/core/operators/merge-map.mjs.map +1 -1
- package/dist/core/operators/pairwise.d.mts +30 -1
- package/dist/core/operators/pairwise.d.mts.map +1 -1
- package/dist/core/operators/pairwise.mjs +30 -1
- package/dist/core/operators/pairwise.mjs.map +1 -1
- package/dist/core/operators/scan.d.mts +23 -1
- package/dist/core/operators/scan.d.mts.map +1 -1
- package/dist/core/operators/scan.mjs +23 -1
- package/dist/core/operators/scan.mjs.map +1 -1
- package/dist/core/operators/skip-if-no-change.d.mts +25 -1
- package/dist/core/operators/skip-if-no-change.d.mts.map +1 -1
- package/dist/core/operators/skip-if-no-change.mjs +25 -1
- package/dist/core/operators/skip-if-no-change.mjs.map +1 -1
- package/dist/core/operators/skip-until.d.mts +50 -0
- package/dist/core/operators/skip-until.d.mts.map +1 -1
- package/dist/core/operators/skip-until.mjs +50 -0
- package/dist/core/operators/skip-until.mjs.map +1 -1
- package/dist/core/operators/skip-while.d.mts +48 -0
- package/dist/core/operators/skip-while.d.mts.map +1 -1
- package/dist/core/operators/skip-while.mjs +48 -0
- package/dist/core/operators/skip-while.mjs.map +1 -1
- package/dist/core/operators/switch-map.d.mts +39 -5
- package/dist/core/operators/switch-map.d.mts.map +1 -1
- package/dist/core/operators/switch-map.mjs +39 -5
- package/dist/core/operators/switch-map.mjs.map +1 -1
- package/dist/core/operators/take-until.d.mts +20 -1
- package/dist/core/operators/take-until.d.mts.map +1 -1
- package/dist/core/operators/take-until.mjs +20 -1
- package/dist/core/operators/take-until.mjs.map +1 -1
- package/dist/core/operators/take-while.d.mts +47 -0
- package/dist/core/operators/take-while.d.mts.map +1 -1
- package/dist/core/operators/take-while.mjs +47 -0
- package/dist/core/operators/take-while.mjs.map +1 -1
- package/dist/core/operators/throttle-time.d.mts +44 -5
- package/dist/core/operators/throttle-time.d.mts.map +1 -1
- package/dist/core/operators/throttle-time.mjs +44 -5
- package/dist/core/operators/throttle-time.mjs.map +1 -1
- package/dist/core/operators/with-buffered-from.d.mts +53 -0
- package/dist/core/operators/with-buffered-from.d.mts.map +1 -1
- package/dist/core/operators/with-buffered-from.mjs +53 -0
- package/dist/core/operators/with-buffered-from.mjs.map +1 -1
- package/dist/core/operators/with-current-value-from.d.mts +55 -0
- package/dist/core/operators/with-current-value-from.d.mts.map +1 -1
- package/dist/core/operators/with-current-value-from.mjs +55 -0
- package/dist/core/operators/with-current-value-from.mjs.map +1 -1
- package/dist/core/operators/with-initial-value.d.mts +24 -2
- package/dist/core/operators/with-initial-value.d.mts.map +1 -1
- package/dist/core/operators/with-initial-value.mjs +24 -2
- package/dist/core/operators/with-initial-value.mjs.map +1 -1
- package/dist/core/types/observable-family.d.mts +7 -7
- package/dist/utils/create-event-emitter.d.mts +20 -2
- package/dist/utils/create-event-emitter.d.mts.map +1 -1
- package/dist/utils/create-event-emitter.mjs +20 -2
- package/dist/utils/create-event-emitter.mjs.map +1 -1
- package/dist/utils/create-reducer.d.mts +13 -1
- package/dist/utils/create-reducer.d.mts.map +1 -1
- package/dist/utils/create-reducer.mjs +13 -1
- package/dist/utils/create-reducer.mjs.map +1 -1
- package/dist/utils/create-state.d.mts +24 -4
- package/dist/utils/create-state.d.mts.map +1 -1
- package/dist/utils/create-state.mjs +24 -4
- package/dist/utils/create-state.mjs.map +1 -1
- package/package.json +13 -12
- package/src/core/combine/combine.mts +32 -2
- package/src/core/combine/merge.mts +30 -4
- package/src/core/combine/zip.mts +28 -3
- package/src/core/create/from-array.mts +21 -3
- package/src/core/create/from-promise.mts +29 -7
- package/src/core/create/from-subscribable.mts +58 -0
- package/src/core/create/interval.mts +29 -4
- package/src/core/create/of.mts +22 -3
- package/src/core/create/source.mts +20 -1
- package/src/core/create/timer.mts +23 -4
- package/src/core/operators/audit-time.mts +59 -0
- package/src/core/operators/debounce-time.mts +22 -2
- package/src/core/operators/filter.mts +26 -1
- package/src/core/operators/map-with-index.mts +19 -4
- package/src/core/operators/merge-map.mts +47 -5
- package/src/core/operators/pairwise.mts +30 -1
- package/src/core/operators/scan.mts +23 -1
- package/src/core/operators/skip-if-no-change.mts +25 -1
- package/src/core/operators/skip-until.mts +50 -0
- package/src/core/operators/skip-while.mts +48 -0
- package/src/core/operators/switch-map.mts +39 -5
- package/src/core/operators/take-until.mts +20 -1
- package/src/core/operators/take-while.mts +47 -0
- package/src/core/operators/throttle-time.mts +44 -5
- package/src/core/operators/with-buffered-from.mts +53 -0
- package/src/core/operators/with-current-value-from.mts +55 -0
- package/src/core/operators/with-initial-value.mts +24 -2
- package/src/core/types/observable-family.mts +7 -7
- package/src/utils/create-event-emitter.mts +20 -2
- package/src/utils/create-reducer.mts +13 -1
- package/src/utils/create-state.mts +24 -4
|
@@ -8,6 +8,61 @@ import {
|
|
|
8
8
|
} from '../types/index.mjs';
|
|
9
9
|
import { maxDepth } from '../utils/index.mjs';
|
|
10
10
|
|
|
11
|
+
/**
|
|
12
|
+
* Samples the current value from another observable each time the source emits.
|
|
13
|
+
* Emits a tuple of [sourceValue, sampledValue].
|
|
14
|
+
*
|
|
15
|
+
* @template A - The type of values from the source observable
|
|
16
|
+
* @template B - The type of values from the sampled observable
|
|
17
|
+
* @param observable - The observable to sample from
|
|
18
|
+
* @returns An operator that emits tuples of source and sampled values
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* // Timeline:
|
|
23
|
+
* //
|
|
24
|
+
* // name$ "Alice" "Bob" "Charlie"
|
|
25
|
+
* // age$ 25 30 35 40
|
|
26
|
+
* // result$ ["Alice",25] ["Bob",30] ["Bob",35] ["Charlie",40]
|
|
27
|
+
* //
|
|
28
|
+
* // Explanation:
|
|
29
|
+
* // - withCurrentValueFrom samples the current value from another observable
|
|
30
|
+
* // - Emits a tuple [sourceValue, sampledValue] each time the source emits
|
|
31
|
+
* // - Does not emit until both observables have emitted at least once
|
|
32
|
+
* // - Similar to combine, but only emits when the source (not the sampled) emits
|
|
33
|
+
*
|
|
34
|
+
* const name$ = source<string>();
|
|
35
|
+
*
|
|
36
|
+
* const age$ = source<number>();
|
|
37
|
+
*
|
|
38
|
+
* const result$ = name$.pipe(withCurrentValueFrom(age$));
|
|
39
|
+
*
|
|
40
|
+
* const mut_history: (readonly [string, number])[] = [];
|
|
41
|
+
*
|
|
42
|
+
* result$.subscribe(([name_, currentAge]) => {
|
|
43
|
+
* mut_history.push([name_, currentAge]);
|
|
44
|
+
* });
|
|
45
|
+
*
|
|
46
|
+
* name$.next('Alice'); // nothing logged (age$ hasn't emitted)
|
|
47
|
+
*
|
|
48
|
+
* assert.deepStrictEqual(mut_history, []);
|
|
49
|
+
*
|
|
50
|
+
* age$.next(25);
|
|
51
|
+
*
|
|
52
|
+
* name$.next('Bob'); // logs: Bob is 25 years old
|
|
53
|
+
*
|
|
54
|
+
* assert.deepStrictEqual(mut_history, [['Bob', 25]]);
|
|
55
|
+
*
|
|
56
|
+
* age$.next(30);
|
|
57
|
+
*
|
|
58
|
+
* name$.next('Charlie'); // logs: Charlie is 30 years old
|
|
59
|
+
*
|
|
60
|
+
* assert.deepStrictEqual(mut_history, [
|
|
61
|
+
* ['Bob', 25],
|
|
62
|
+
* ['Charlie', 30],
|
|
63
|
+
* ]);
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
11
66
|
export const withCurrentValueFrom =
|
|
12
67
|
<A, B>(
|
|
13
68
|
observable: Observable<B>,
|
|
@@ -21,15 +21,37 @@ import {
|
|
|
21
21
|
*
|
|
22
22
|
* @example
|
|
23
23
|
* ```ts
|
|
24
|
+
* // Timeline:
|
|
25
|
+
* //
|
|
26
|
+
* // num$ 1 2 3
|
|
27
|
+
* // withInitial$ 0 1 2 3
|
|
28
|
+
* // ^
|
|
29
|
+
* // initial value
|
|
30
|
+
* //
|
|
31
|
+
* // Explanation:
|
|
32
|
+
* // - withInitialValue provides an initial value before the source emits
|
|
33
|
+
* // - Converts an uninitialized observable to an initialized one
|
|
34
|
+
* // - Useful when you need a default value immediately
|
|
35
|
+
*
|
|
24
36
|
* const num$ = source<number>();
|
|
25
37
|
*
|
|
26
38
|
* const initialized$ = num$.pipe(withInitialValue(0));
|
|
27
39
|
*
|
|
40
|
+
* const mut_history: number[] = [];
|
|
41
|
+
*
|
|
28
42
|
* initialized$.subscribe((x) => {
|
|
29
|
-
*
|
|
30
|
-
* });
|
|
43
|
+
* mut_history.push(x);
|
|
44
|
+
* });
|
|
45
|
+
*
|
|
46
|
+
* assert.deepStrictEqual(mut_history, [0]);
|
|
31
47
|
*
|
|
32
48
|
* num$.next(1); // logs: 1
|
|
49
|
+
*
|
|
50
|
+
* assert.deepStrictEqual(mut_history, [0, 1]);
|
|
51
|
+
*
|
|
52
|
+
* num$.next(2); // logs: 2
|
|
53
|
+
*
|
|
54
|
+
* assert.deepStrictEqual(mut_history, [0, 1, 2]);
|
|
33
55
|
* ```
|
|
34
56
|
*/
|
|
35
57
|
export const withInitialValue =
|
|
@@ -65,7 +65,7 @@ export type ScanOperatorObservable<A, B> = InitializedSyncChildObservable<
|
|
|
65
65
|
|
|
66
66
|
// SyncChildObservable
|
|
67
67
|
|
|
68
|
-
namespace
|
|
68
|
+
namespace SynStateInternals {
|
|
69
69
|
type Cast<A> = A extends NonEmptyUnknownList ? A : never;
|
|
70
70
|
|
|
71
71
|
type EveryInitialized<OS extends NonEmptyArray<Observable<unknown>>> =
|
|
@@ -164,25 +164,25 @@ namespace SyncFlowInternals {
|
|
|
164
164
|
}
|
|
165
165
|
|
|
166
166
|
export type CombineObservable<A extends NonEmptyUnknownList> =
|
|
167
|
-
|
|
167
|
+
SynStateInternals.CombineObservableImpl<A>;
|
|
168
168
|
|
|
169
169
|
export type CombineObservableRefined<
|
|
170
170
|
OS extends NonEmptyArray<Observable<unknown>>,
|
|
171
|
-
> =
|
|
171
|
+
> = SynStateInternals.CombineObservableRefinedImpl<OS>;
|
|
172
172
|
|
|
173
173
|
export type ZipObservable<A extends NonEmptyUnknownList> =
|
|
174
|
-
|
|
174
|
+
SynStateInternals.ZipObservableImpl<A>;
|
|
175
175
|
|
|
176
176
|
export type ZipObservableRefined<
|
|
177
177
|
OS extends NonEmptyArray<Observable<unknown>>,
|
|
178
|
-
> =
|
|
178
|
+
> = SynStateInternals.ZipObservableRefinedImpl<OS>;
|
|
179
179
|
|
|
180
180
|
export type MergeObservable<A extends NonEmptyUnknownList> =
|
|
181
|
-
|
|
181
|
+
SynStateInternals.MergeObservableImpl<A>;
|
|
182
182
|
|
|
183
183
|
export type MergeObservableRefined<
|
|
184
184
|
OS extends NonEmptyArray<Observable<unknown>>,
|
|
185
|
-
> =
|
|
185
|
+
> = SynStateInternals.MergeObservableRefinedImpl<OS>;
|
|
186
186
|
|
|
187
187
|
export type MapWithIndexOperatorObservable<A, B> = SyncChildObservable<
|
|
188
188
|
B,
|
|
@@ -10,11 +10,21 @@ import { source, type Observable } from '../core/index.mjs';
|
|
|
10
10
|
* ```ts
|
|
11
11
|
* const [click$, emitClick] = createEventEmitter();
|
|
12
12
|
*
|
|
13
|
+
* const mut_clickCount = { value: 0 };
|
|
14
|
+
*
|
|
13
15
|
* click$.subscribe(() => {
|
|
14
|
-
*
|
|
16
|
+
* mut_clickCount.value += 1;
|
|
15
17
|
* });
|
|
16
18
|
*
|
|
17
19
|
* emitClick(); // logs: Clicked!
|
|
20
|
+
*
|
|
21
|
+
* assert.deepStrictEqual(mut_clickCount.value, 1);
|
|
22
|
+
*
|
|
23
|
+
* emitClick();
|
|
24
|
+
*
|
|
25
|
+
* emitClick();
|
|
26
|
+
*
|
|
27
|
+
* assert.deepStrictEqual(mut_clickCount.value, 3);
|
|
18
28
|
* ```
|
|
19
29
|
*/
|
|
20
30
|
export const createEventEmitter = (): readonly [
|
|
@@ -41,11 +51,19 @@ export const createEventEmitter = (): readonly [
|
|
|
41
51
|
* ```ts
|
|
42
52
|
* const [message$, emitMessage] = createValueEmitter<string>();
|
|
43
53
|
*
|
|
54
|
+
* const mut_history: string[] = [];
|
|
55
|
+
*
|
|
44
56
|
* message$.subscribe((msg) => {
|
|
45
|
-
*
|
|
57
|
+
* mut_history.push(msg);
|
|
46
58
|
* });
|
|
47
59
|
*
|
|
48
60
|
* emitMessage('Hello'); // logs: Hello
|
|
61
|
+
*
|
|
62
|
+
* assert.deepStrictEqual(mut_history, ['Hello']);
|
|
63
|
+
*
|
|
64
|
+
* emitMessage('World');
|
|
65
|
+
*
|
|
66
|
+
* assert.deepStrictEqual(mut_history, ['Hello', 'World']);
|
|
49
67
|
* ```
|
|
50
68
|
*/
|
|
51
69
|
export const createValueEmitter = <A,>(): readonly [
|
|
@@ -24,11 +24,23 @@ import { source, type InitializedObservable } from '../core/index.mjs';
|
|
|
24
24
|
* 0,
|
|
25
25
|
* );
|
|
26
26
|
*
|
|
27
|
+
* const mut_history: number[] = [];
|
|
28
|
+
*
|
|
27
29
|
* state.subscribe((value: number) => {
|
|
28
|
-
*
|
|
30
|
+
* mut_history.push(value);
|
|
29
31
|
* });
|
|
30
32
|
*
|
|
33
|
+
* assert.deepStrictEqual(mut_history, [0]);
|
|
34
|
+
*
|
|
31
35
|
* dispatch({ type: 'increment' }); // logs: 1
|
|
36
|
+
*
|
|
37
|
+
* assert.deepStrictEqual(mut_history, [0, 1]);
|
|
38
|
+
*
|
|
39
|
+
* dispatch({ type: 'increment' });
|
|
40
|
+
*
|
|
41
|
+
* dispatch({ type: 'decrement' });
|
|
42
|
+
*
|
|
43
|
+
* assert.deepStrictEqual(mut_history, [0, 1, 2, 1]);
|
|
32
44
|
* ```
|
|
33
45
|
*/
|
|
34
46
|
export const createReducer = <S, A>(
|
|
@@ -34,15 +34,25 @@ const reducer = <S,>(state: S, action: Action<S>): S => {
|
|
|
34
34
|
* ```ts
|
|
35
35
|
* const [state, setState, { updateState, resetState }] = createState(0);
|
|
36
36
|
*
|
|
37
|
+
* const mut_history: number[] = [];
|
|
38
|
+
*
|
|
37
39
|
* state.subscribe((value: number) => {
|
|
38
|
-
*
|
|
39
|
-
* });
|
|
40
|
+
* mut_history.push(value);
|
|
41
|
+
* });
|
|
42
|
+
*
|
|
43
|
+
* assert.deepStrictEqual(mut_history, [0]);
|
|
40
44
|
*
|
|
41
45
|
* setState(10); // logs: 10
|
|
42
46
|
*
|
|
47
|
+
* assert.deepStrictEqual(mut_history, [0, 10]);
|
|
48
|
+
*
|
|
43
49
|
* updateState((prev: number) => prev + 1); // logs: 11
|
|
44
50
|
*
|
|
51
|
+
* assert.deepStrictEqual(mut_history, [0, 10, 11]);
|
|
52
|
+
*
|
|
45
53
|
* resetState(); // logs: 0
|
|
54
|
+
*
|
|
55
|
+
* assert.deepStrictEqual(mut_history, [0, 10, 11, 0]);
|
|
46
56
|
* ```
|
|
47
57
|
*/
|
|
48
58
|
export const createState = <S,>(
|
|
@@ -91,15 +101,25 @@ export const createState = <S,>(
|
|
|
91
101
|
* ```ts
|
|
92
102
|
* const [state, { setTrue, toggle }] = createBooleanState(false);
|
|
93
103
|
*
|
|
104
|
+
* const mut_history: boolean[] = [];
|
|
105
|
+
*
|
|
94
106
|
* state.subscribe((value: boolean) => {
|
|
95
|
-
*
|
|
96
|
-
* });
|
|
107
|
+
* mut_history.push(value);
|
|
108
|
+
* });
|
|
109
|
+
*
|
|
110
|
+
* assert.deepStrictEqual(mut_history, [false]);
|
|
97
111
|
*
|
|
98
112
|
* setTrue(); // logs: true
|
|
99
113
|
*
|
|
114
|
+
* assert.deepStrictEqual(mut_history, [false, true]);
|
|
115
|
+
*
|
|
100
116
|
* toggle(); // logs: false
|
|
101
117
|
*
|
|
118
|
+
* assert.deepStrictEqual(mut_history, [false, true, false]);
|
|
119
|
+
*
|
|
102
120
|
* toggle(); // logs: true
|
|
121
|
+
*
|
|
122
|
+
* assert.deepStrictEqual(mut_history, [false, true, false, true]);
|
|
103
123
|
* ```
|
|
104
124
|
*/
|
|
105
125
|
export const createBooleanState = (
|