synstate 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +878 -0
- package/dist/core/class/child-observable-class.d.mts +37 -0
- package/dist/core/class/child-observable-class.d.mts.map +1 -0
- package/dist/core/class/child-observable-class.mjs +134 -0
- package/dist/core/class/child-observable-class.mjs.map +1 -0
- package/dist/core/class/index.d.mts +4 -0
- package/dist/core/class/index.d.mts.map +1 -0
- package/dist/core/class/index.mjs +4 -0
- package/dist/core/class/index.mjs.map +1 -0
- package/dist/core/class/observable-base-class.d.mts +28 -0
- package/dist/core/class/observable-base-class.d.mts.map +1 -0
- package/dist/core/class/observable-base-class.mjs +116 -0
- package/dist/core/class/observable-base-class.mjs.map +1 -0
- package/dist/core/class/root-observable-class.d.mts +12 -0
- package/dist/core/class/root-observable-class.d.mts.map +1 -0
- package/dist/core/class/root-observable-class.mjs +35 -0
- package/dist/core/class/root-observable-class.mjs.map +1 -0
- package/dist/core/combine/combine.d.mts +35 -0
- package/dist/core/combine/combine.d.mts.map +1 -0
- package/dist/core/combine/combine.mjs +94 -0
- package/dist/core/combine/combine.mjs.map +1 -0
- package/dist/core/combine/index.d.mts +4 -0
- package/dist/core/combine/index.d.mts.map +1 -0
- package/dist/core/combine/index.mjs +4 -0
- package/dist/core/combine/index.mjs.map +1 -0
- package/dist/core/combine/merge.d.mts +28 -0
- package/dist/core/combine/merge.d.mts.map +1 -0
- package/dist/core/combine/merge.mjs +52 -0
- package/dist/core/combine/merge.mjs.map +1 -0
- package/dist/core/combine/zip.d.mts +26 -0
- package/dist/core/combine/zip.d.mts.map +1 -0
- package/dist/core/combine/zip.mjs +63 -0
- package/dist/core/combine/zip.mjs.map +1 -0
- package/dist/core/create/from-array.d.mts +21 -0
- package/dist/core/create/from-array.d.mts.map +1 -0
- package/dist/core/create/from-array.mjs +47 -0
- package/dist/core/create/from-array.mjs.map +1 -0
- package/dist/core/create/from-promise.d.mts +25 -0
- package/dist/core/create/from-promise.d.mts.map +1 -0
- package/dist/core/create/from-promise.mjs +51 -0
- package/dist/core/create/from-promise.mjs.map +1 -0
- package/dist/core/create/from-subscribable.d.mts +3 -0
- package/dist/core/create/from-subscribable.d.mts.map +1 -0
- package/dist/core/create/from-subscribable.mjs +22 -0
- package/dist/core/create/from-subscribable.mjs.map +1 -0
- package/dist/core/create/index.d.mts +8 -0
- package/dist/core/create/index.d.mts.map +1 -0
- package/dist/core/create/index.mjs +8 -0
- package/dist/core/create/index.mjs.map +1 -0
- package/dist/core/create/interval.d.mts +21 -0
- package/dist/core/create/interval.d.mts.map +1 -0
- package/dist/core/create/interval.mjs +74 -0
- package/dist/core/create/interval.mjs.map +1 -0
- package/dist/core/create/of.d.mts +20 -0
- package/dist/core/create/of.d.mts.map +1 -0
- package/dist/core/create/of.mjs +44 -0
- package/dist/core/create/of.mjs.map +1 -0
- package/dist/core/create/source.d.mts +29 -0
- package/dist/core/create/source.d.mts.map +1 -0
- package/dist/core/create/source.mjs +29 -0
- package/dist/core/create/source.mjs.map +1 -0
- package/dist/core/create/timer.d.mts +20 -0
- package/dist/core/create/timer.d.mts.map +1 -0
- package/dist/core/create/timer.mjs +64 -0
- package/dist/core/create/timer.mjs.map +1 -0
- package/dist/core/index.d.mts +7 -0
- package/dist/core/index.d.mts.map +1 -0
- package/dist/core/index.mjs +37 -0
- package/dist/core/index.mjs.map +1 -0
- package/dist/core/operators/audit-time.d.mts +3 -0
- package/dist/core/operators/audit-time.d.mts.map +1 -0
- package/dist/core/operators/audit-time.mjs +50 -0
- package/dist/core/operators/audit-time.mjs.map +1 -0
- package/dist/core/operators/debounce-time.d.mts +31 -0
- package/dist/core/operators/debounce-time.d.mts.map +1 -0
- package/dist/core/operators/debounce-time.mjs +73 -0
- package/dist/core/operators/debounce-time.mjs.map +1 -0
- package/dist/core/operators/filter.d.mts +28 -0
- package/dist/core/operators/filter.d.mts.map +1 -0
- package/dist/core/operators/filter.mjs +38 -0
- package/dist/core/operators/filter.mjs.map +1 -0
- package/dist/core/operators/index.d.mts +18 -0
- package/dist/core/operators/index.d.mts.map +1 -0
- package/dist/core/operators/index.mjs +18 -0
- package/dist/core/operators/index.mjs.map +1 -0
- package/dist/core/operators/map-with-index.d.mts +39 -0
- package/dist/core/operators/map-with-index.d.mts.map +1 -0
- package/dist/core/operators/map-with-index.mjs +73 -0
- package/dist/core/operators/map-with-index.mjs.map +1 -0
- package/dist/core/operators/merge-map.d.mts +34 -0
- package/dist/core/operators/merge-map.d.mts.map +1 -0
- package/dist/core/operators/merge-map.mjs +75 -0
- package/dist/core/operators/merge-map.mjs.map +1 -0
- package/dist/core/operators/pairwise.d.mts +27 -0
- package/dist/core/operators/pairwise.d.mts.map +1 -0
- package/dist/core/operators/pairwise.mjs +59 -0
- package/dist/core/operators/pairwise.mjs.map +1 -0
- package/dist/core/operators/scan.d.mts +30 -0
- package/dist/core/operators/scan.d.mts.map +1 -0
- package/dist/core/operators/scan.mjs +56 -0
- package/dist/core/operators/scan.mjs.map +1 -0
- package/dist/core/operators/skip-if-no-change.d.mts +33 -0
- package/dist/core/operators/skip-if-no-change.d.mts.map +1 -0
- package/dist/core/operators/skip-if-no-change.mjs +68 -0
- package/dist/core/operators/skip-if-no-change.mjs.map +1 -0
- package/dist/core/operators/skip-until.d.mts +3 -0
- package/dist/core/operators/skip-until.d.mts.map +1 -0
- package/dist/core/operators/skip-until.mjs +33 -0
- package/dist/core/operators/skip-until.mjs.map +1 -0
- package/dist/core/operators/skip-while.d.mts +4 -0
- package/dist/core/operators/skip-while.d.mts.map +1 -0
- package/dist/core/operators/skip-while.mjs +40 -0
- package/dist/core/operators/skip-while.mjs.map +1 -0
- package/dist/core/operators/switch-map.d.mts +31 -0
- package/dist/core/operators/switch-map.d.mts.map +1 -0
- package/dist/core/operators/switch-map.mjs +70 -0
- package/dist/core/operators/switch-map.mjs.map +1 -0
- package/dist/core/operators/take-until.d.mts +32 -0
- package/dist/core/operators/take-until.d.mts.map +1 -0
- package/dist/core/operators/take-until.mjs +60 -0
- package/dist/core/operators/take-until.mjs.map +1 -0
- package/dist/core/operators/take-while.d.mts +4 -0
- package/dist/core/operators/take-while.d.mts.map +1 -0
- package/dist/core/operators/take-while.mjs +42 -0
- package/dist/core/operators/take-while.mjs.map +1 -0
- package/dist/core/operators/throttle-time.d.mts +23 -0
- package/dist/core/operators/throttle-time.d.mts.map +1 -0
- package/dist/core/operators/throttle-time.mjs +68 -0
- package/dist/core/operators/throttle-time.mjs.map +1 -0
- package/dist/core/operators/with-buffered-from.d.mts +4 -0
- package/dist/core/operators/with-buffered-from.d.mts.map +1 -0
- package/dist/core/operators/with-buffered-from.mjs +45 -0
- package/dist/core/operators/with-buffered-from.mjs.map +1 -0
- package/dist/core/operators/with-current-value-from.d.mts +4 -0
- package/dist/core/operators/with-current-value-from.d.mts.map +1 -0
- package/dist/core/operators/with-current-value-from.mjs +37 -0
- package/dist/core/operators/with-current-value-from.mjs.map +1 -0
- package/dist/core/operators/with-initial-value.d.mts +26 -0
- package/dist/core/operators/with-initial-value.d.mts.map +1 -0
- package/dist/core/operators/with-initial-value.mjs +47 -0
- package/dist/core/operators/with-initial-value.mjs.map +1 -0
- package/dist/core/types/id.d.mts +4 -0
- package/dist/core/types/id.d.mts.map +1 -0
- package/dist/core/types/id.mjs +2 -0
- package/dist/core/types/id.mjs.map +1 -0
- package/dist/core/types/index.d.mts +6 -0
- package/dist/core/types/index.d.mts.map +1 -0
- package/dist/core/types/index.mjs +3 -0
- package/dist/core/types/index.mjs.map +1 -0
- package/dist/core/types/observable-family.d.mts +68 -0
- package/dist/core/types/observable-family.d.mts.map +1 -0
- package/dist/core/types/observable-family.mjs +2 -0
- package/dist/core/types/observable-family.mjs.map +1 -0
- package/dist/core/types/observable-kind.d.mts +4 -0
- package/dist/core/types/observable-kind.d.mts.map +1 -0
- package/dist/core/types/observable-kind.mjs +2 -0
- package/dist/core/types/observable-kind.mjs.map +1 -0
- package/dist/core/types/observable.d.mts +83 -0
- package/dist/core/types/observable.d.mts.map +1 -0
- package/dist/core/types/observable.mjs +10 -0
- package/dist/core/types/observable.mjs.map +1 -0
- package/dist/core/types/types.d.mts +16 -0
- package/dist/core/types/types.d.mts.map +1 -0
- package/dist/core/types/types.mjs +2 -0
- package/dist/core/types/types.mjs.map +1 -0
- package/dist/core/utils/id-maker.d.mts +5 -0
- package/dist/core/utils/id-maker.d.mts.map +1 -0
- package/dist/core/utils/id-maker.mjs +17 -0
- package/dist/core/utils/id-maker.mjs.map +1 -0
- package/dist/core/utils/index.d.mts +5 -0
- package/dist/core/utils/index.d.mts.map +1 -0
- package/dist/core/utils/index.mjs +5 -0
- package/dist/core/utils/index.mjs.map +1 -0
- package/dist/core/utils/max-depth.d.mts +3 -0
- package/dist/core/utils/max-depth.d.mts.map +1 -0
- package/dist/core/utils/max-depth.mjs +8 -0
- package/dist/core/utils/max-depth.mjs.map +1 -0
- package/dist/core/utils/observable-utils.d.mts +3 -0
- package/dist/core/utils/observable-utils.d.mts.map +1 -0
- package/dist/core/utils/observable-utils.mjs +7 -0
- package/dist/core/utils/observable-utils.mjs.map +1 -0
- package/dist/core/utils/utils.d.mts +4 -0
- package/dist/core/utils/utils.d.mts.map +1 -0
- package/dist/core/utils/utils.mjs +38 -0
- package/dist/core/utils/utils.mjs.map +1 -0
- package/dist/entry-point.d.mts +2 -0
- package/dist/entry-point.d.mts.map +1 -0
- package/dist/entry-point.mjs +40 -0
- package/dist/entry-point.mjs.map +1 -0
- package/dist/globals.d.mts +4 -0
- package/dist/index.d.mts +3 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +40 -0
- package/dist/index.mjs.map +1 -0
- package/dist/tsconfig.json +1 -0
- package/dist/types.d.mts +2 -0
- package/dist/utils/create-event-emitter.d.mts +39 -0
- package/dist/utils/create-event-emitter.d.mts.map +1 -0
- package/dist/utils/create-event-emitter.mjs +57 -0
- package/dist/utils/create-event-emitter.mjs.map +1 -0
- package/dist/utils/create-reducer.d.mts +34 -0
- package/dist/utils/create-reducer.d.mts.map +1 -0
- package/dist/utils/create-reducer.mjs +49 -0
- package/dist/utils/create-reducer.mjs.map +1 -0
- package/dist/utils/create-state.d.mts +61 -0
- package/dist/utils/create-state.d.mts.map +1 -0
- package/dist/utils/create-state.mjs +92 -0
- package/dist/utils/create-state.mjs.map +1 -0
- package/dist/utils/index.d.mts +4 -0
- package/dist/utils/index.d.mts.map +1 -0
- package/dist/utils/index.mjs +4 -0
- package/dist/utils/index.mjs.map +1 -0
- package/package.json +71 -0
- package/src/core/class/child-observable-class.mts +232 -0
- package/src/core/class/index.mts +3 -0
- package/src/core/class/observable-base-class.mts +186 -0
- package/src/core/class/observable.class.test.mts +89 -0
- package/src/core/class/root-observable-class.mts +68 -0
- package/src/core/combine/combine.mts +144 -0
- package/src/core/combine/index.mts +3 -0
- package/src/core/combine/merge.mts +84 -0
- package/src/core/combine/zip.mts +149 -0
- package/src/core/create/from-array.mts +58 -0
- package/src/core/create/from-promise.mts +58 -0
- package/src/core/create/from-subscribable.mts +37 -0
- package/src/core/create/index.mts +7 -0
- package/src/core/create/interval.mts +99 -0
- package/src/core/create/of.mts +54 -0
- package/src/core/create/source.mts +59 -0
- package/src/core/create/timer.mts +84 -0
- package/src/core/index.mts +6 -0
- package/src/core/operators/audit-time.mts +77 -0
- package/src/core/operators/debounce-time.mts +96 -0
- package/src/core/operators/filter.mts +125 -0
- package/src/core/operators/index.mts +17 -0
- package/src/core/operators/map-with-index.mts +168 -0
- package/src/core/operators/merge-map.mts +108 -0
- package/src/core/operators/pairwise.mts +77 -0
- package/src/core/operators/scan.mts +81 -0
- package/src/core/operators/skip-if-no-change.mts +91 -0
- package/src/core/operators/skip-until.mts +54 -0
- package/src/core/operators/skip-while.mts +77 -0
- package/src/core/operators/switch-map.mts +101 -0
- package/src/core/operators/take-until.mts +80 -0
- package/src/core/operators/take-while.mts +103 -0
- package/src/core/operators/throttle-time.mts +95 -0
- package/src/core/operators/with-buffered-from.mts +68 -0
- package/src/core/operators/with-current-value-from.mts +58 -0
- package/src/core/operators/with-initial-value.mts +76 -0
- package/src/core/types/id.mts +5 -0
- package/src/core/types/index.mts +5 -0
- package/src/core/types/observable-family.mts +259 -0
- package/src/core/types/observable-kind.mts +5 -0
- package/src/core/types/observable.mts +218 -0
- package/src/core/types/types.mts +40 -0
- package/src/core/utils/id-maker.mts +31 -0
- package/src/core/utils/index.mts +4 -0
- package/src/core/utils/max-depth.mts +7 -0
- package/src/core/utils/observable-utils.mts +10 -0
- package/src/core/utils/utils.mts +51 -0
- package/src/core/utils/utils.test.mts +88 -0
- package/src/entry-point.mts +1 -0
- package/src/globals.d.mts +4 -0
- package/src/index.mts +2 -0
- package/src/utils/create-event-emitter.mts +62 -0
- package/src/utils/create-reducer.mts +55 -0
- package/src/utils/create-state.mts +138 -0
- package/src/utils/index.mts +3 -0
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { expectType, type Result } from 'ts-data-forge';
|
|
2
|
+
import {
|
|
3
|
+
type AsyncChildObservable,
|
|
4
|
+
type InitializedObservable,
|
|
5
|
+
type InitializedRootObservable,
|
|
6
|
+
type InitializedSyncChildObservable,
|
|
7
|
+
type Observable,
|
|
8
|
+
type RootObservable,
|
|
9
|
+
type SyncChildObservable,
|
|
10
|
+
type Unwrap,
|
|
11
|
+
} from './observable.mjs';
|
|
12
|
+
import { type NonEmptyUnknownList } from './types.mjs';
|
|
13
|
+
|
|
14
|
+
// RootObservable
|
|
15
|
+
|
|
16
|
+
export type InitializedSourceObservable<A> = Readonly<{
|
|
17
|
+
next: (value: A) => void;
|
|
18
|
+
}> &
|
|
19
|
+
InitializedRootObservable<A>;
|
|
20
|
+
|
|
21
|
+
export type SourceObservable<A> = Readonly<{
|
|
22
|
+
next: (value: A) => void;
|
|
23
|
+
}> &
|
|
24
|
+
RootObservable<A>;
|
|
25
|
+
|
|
26
|
+
export type OfObservable<A> = Readonly<{
|
|
27
|
+
emit: () => OfObservable<A>;
|
|
28
|
+
}> &
|
|
29
|
+
RootObservable<A>;
|
|
30
|
+
|
|
31
|
+
export type FromArrayObservable<A> = Readonly<{
|
|
32
|
+
emit: () => FromArrayObservable<A>;
|
|
33
|
+
}> &
|
|
34
|
+
RootObservable<A>;
|
|
35
|
+
|
|
36
|
+
export type FromPromiseObservable<A, E = unknown> = RootObservable<
|
|
37
|
+
Result<A, E>
|
|
38
|
+
>;
|
|
39
|
+
|
|
40
|
+
export type FromSubscribableObservable<A, E = unknown> = RootObservable<
|
|
41
|
+
Result<A, E>
|
|
42
|
+
>;
|
|
43
|
+
|
|
44
|
+
export type IntervalObservable = Readonly<{
|
|
45
|
+
start: () => IntervalObservable;
|
|
46
|
+
}> &
|
|
47
|
+
RootObservable<SafeUint>;
|
|
48
|
+
|
|
49
|
+
export type TimerObservable = Readonly<{
|
|
50
|
+
start: () => TimerObservable;
|
|
51
|
+
}> &
|
|
52
|
+
RootObservable<0>;
|
|
53
|
+
|
|
54
|
+
// InitializedSyncChildObservable
|
|
55
|
+
|
|
56
|
+
export type WithInitialValueOperatorObservable<
|
|
57
|
+
A,
|
|
58
|
+
I = A,
|
|
59
|
+
> = InitializedSyncChildObservable<A | I, readonly [A]>;
|
|
60
|
+
|
|
61
|
+
export type ScanOperatorObservable<A, B> = InitializedSyncChildObservable<
|
|
62
|
+
B,
|
|
63
|
+
readonly [A]
|
|
64
|
+
>;
|
|
65
|
+
|
|
66
|
+
// SyncChildObservable
|
|
67
|
+
|
|
68
|
+
namespace SyncFlowInternals {
|
|
69
|
+
type Cast<A> = A extends NonEmptyUnknownList ? A : never;
|
|
70
|
+
|
|
71
|
+
type EveryInitialized<OS extends NonEmptyArray<Observable<unknown>>> =
|
|
72
|
+
OS extends NonEmptyArray<InitializedObservable<unknown>> ? true : false;
|
|
73
|
+
|
|
74
|
+
type IsInitialized<O> = readonly [O] extends readonly [
|
|
75
|
+
InitializedObservable<unknown>,
|
|
76
|
+
]
|
|
77
|
+
? true
|
|
78
|
+
: false;
|
|
79
|
+
|
|
80
|
+
/** Evaluates True | false as true instead of boolean */
|
|
81
|
+
type LogicalValue<B extends boolean> = readonly [B] extends readonly [true]
|
|
82
|
+
? true
|
|
83
|
+
: readonly [B] extends readonly [false]
|
|
84
|
+
? false
|
|
85
|
+
: true;
|
|
86
|
+
|
|
87
|
+
type SomeInitializedImpl<OS extends Observable<unknown>> =
|
|
88
|
+
// union distribution
|
|
89
|
+
LogicalValue<OS extends OS ? IsInitialized<OS> : never>;
|
|
90
|
+
|
|
91
|
+
type SomeInitialized<OS extends NonEmptyArray<Observable<unknown>>> =
|
|
92
|
+
SomeInitializedImpl<OS[number]>;
|
|
93
|
+
|
|
94
|
+
expectType<EveryInitialized<readonly [Observable<1>]>, false>('=');
|
|
95
|
+
|
|
96
|
+
expectType<EveryInitialized<readonly [InitializedObservable<1>]>, true>('=');
|
|
97
|
+
|
|
98
|
+
expectType<
|
|
99
|
+
EveryInitialized<
|
|
100
|
+
readonly [InitializedObservable<1>, InitializedObservable<2>]
|
|
101
|
+
>,
|
|
102
|
+
true
|
|
103
|
+
>('=');
|
|
104
|
+
|
|
105
|
+
expectType<
|
|
106
|
+
EveryInitialized<readonly [Observable<1>, InitializedObservable<2>]>,
|
|
107
|
+
false
|
|
108
|
+
>('=');
|
|
109
|
+
|
|
110
|
+
expectType<SomeInitialized<readonly [Observable<1>]>, false>('=');
|
|
111
|
+
|
|
112
|
+
expectType<SomeInitialized<readonly [InitializedObservable<1>]>, true>('=');
|
|
113
|
+
|
|
114
|
+
expectType<
|
|
115
|
+
SomeInitialized<
|
|
116
|
+
readonly [InitializedObservable<1>, InitializedObservable<2>]
|
|
117
|
+
>,
|
|
118
|
+
true
|
|
119
|
+
>('=');
|
|
120
|
+
|
|
121
|
+
expectType<
|
|
122
|
+
SomeInitialized<readonly [Observable<1>, InitializedObservable<2>]>,
|
|
123
|
+
true
|
|
124
|
+
>('=');
|
|
125
|
+
|
|
126
|
+
type InitializedCombineObservableImpl<A extends NonEmptyUnknownList> =
|
|
127
|
+
InitializedSyncChildObservable<A, A>;
|
|
128
|
+
|
|
129
|
+
export type CombineObservableImpl<A extends NonEmptyUnknownList> =
|
|
130
|
+
SyncChildObservable<A, A>;
|
|
131
|
+
|
|
132
|
+
export type CombineObservableRefinedImpl<
|
|
133
|
+
OS extends NonEmptyArray<Observable<unknown>>,
|
|
134
|
+
> =
|
|
135
|
+
EveryInitialized<OS> extends true
|
|
136
|
+
? InitializedCombineObservableImpl<Cast<Unwrap<OS>>>
|
|
137
|
+
: CombineObservableImpl<Unwrap<OS>>;
|
|
138
|
+
|
|
139
|
+
type InitializedZipObservableImpl<A extends NonEmptyUnknownList> =
|
|
140
|
+
InitializedSyncChildObservable<A, A>;
|
|
141
|
+
|
|
142
|
+
export type ZipObservableImpl<A extends NonEmptyUnknownList> =
|
|
143
|
+
SyncChildObservable<A, A>;
|
|
144
|
+
|
|
145
|
+
export type ZipObservableRefinedImpl<
|
|
146
|
+
OS extends NonEmptyArray<Observable<unknown>>,
|
|
147
|
+
> =
|
|
148
|
+
EveryInitialized<OS> extends true
|
|
149
|
+
? InitializedZipObservableImpl<Cast<Unwrap<OS>>>
|
|
150
|
+
: ZipObservableImpl<Unwrap<OS>>;
|
|
151
|
+
|
|
152
|
+
type InitializedMergeObservableImpl<P extends NonEmptyUnknownList> =
|
|
153
|
+
InitializedSyncChildObservable<ArrayElement<P>, P>;
|
|
154
|
+
|
|
155
|
+
export type MergeObservableImpl<P extends NonEmptyUnknownList> =
|
|
156
|
+
SyncChildObservable<ArrayElement<P>, P>;
|
|
157
|
+
|
|
158
|
+
export type MergeObservableRefinedImpl<
|
|
159
|
+
OS extends NonEmptyArray<Observable<unknown>>,
|
|
160
|
+
> =
|
|
161
|
+
SomeInitialized<OS> extends true
|
|
162
|
+
? InitializedMergeObservableImpl<Cast<Unwrap<OS>>>
|
|
163
|
+
: MergeObservableImpl<Unwrap<OS>>;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export type CombineObservable<A extends NonEmptyUnknownList> =
|
|
167
|
+
SyncFlowInternals.CombineObservableImpl<A>;
|
|
168
|
+
|
|
169
|
+
export type CombineObservableRefined<
|
|
170
|
+
OS extends NonEmptyArray<Observable<unknown>>,
|
|
171
|
+
> = SyncFlowInternals.CombineObservableRefinedImpl<OS>;
|
|
172
|
+
|
|
173
|
+
export type ZipObservable<A extends NonEmptyUnknownList> =
|
|
174
|
+
SyncFlowInternals.ZipObservableImpl<A>;
|
|
175
|
+
|
|
176
|
+
export type ZipObservableRefined<
|
|
177
|
+
OS extends NonEmptyArray<Observable<unknown>>,
|
|
178
|
+
> = SyncFlowInternals.ZipObservableRefinedImpl<OS>;
|
|
179
|
+
|
|
180
|
+
export type MergeObservable<A extends NonEmptyUnknownList> =
|
|
181
|
+
SyncFlowInternals.MergeObservableImpl<A>;
|
|
182
|
+
|
|
183
|
+
export type MergeObservableRefined<
|
|
184
|
+
OS extends NonEmptyArray<Observable<unknown>>,
|
|
185
|
+
> = SyncFlowInternals.MergeObservableRefinedImpl<OS>;
|
|
186
|
+
|
|
187
|
+
export type MapWithIndexOperatorObservable<A, B> = SyncChildObservable<
|
|
188
|
+
B,
|
|
189
|
+
readonly [A]
|
|
190
|
+
>;
|
|
191
|
+
|
|
192
|
+
export type PairwiseOperatorObservable<A> = SyncChildObservable<
|
|
193
|
+
readonly [A, A],
|
|
194
|
+
readonly [A]
|
|
195
|
+
>;
|
|
196
|
+
|
|
197
|
+
export type TakeWhileOperatorObservable<A> = SyncChildObservable<
|
|
198
|
+
A,
|
|
199
|
+
readonly [A]
|
|
200
|
+
>;
|
|
201
|
+
|
|
202
|
+
export type TakeUntilOperatorObservable<A> = SyncChildObservable<
|
|
203
|
+
A,
|
|
204
|
+
readonly [A]
|
|
205
|
+
>;
|
|
206
|
+
|
|
207
|
+
export type SkipWhileOperatorObservable<A> = SyncChildObservable<
|
|
208
|
+
A,
|
|
209
|
+
readonly [A]
|
|
210
|
+
>;
|
|
211
|
+
|
|
212
|
+
export type SkipUntilOperatorObservable<A> = SyncChildObservable<
|
|
213
|
+
A,
|
|
214
|
+
readonly [A]
|
|
215
|
+
>;
|
|
216
|
+
|
|
217
|
+
export type WithCurrentValueFromOperatorObservable<A, B> = SyncChildObservable<
|
|
218
|
+
readonly [A, B],
|
|
219
|
+
readonly [A]
|
|
220
|
+
>;
|
|
221
|
+
|
|
222
|
+
export type WithBufferedFromOperatorObservable<A, B> = SyncChildObservable<
|
|
223
|
+
readonly [A, readonly B[]],
|
|
224
|
+
readonly [A]
|
|
225
|
+
>;
|
|
226
|
+
|
|
227
|
+
export type FilterOperatorObservable<A> = SyncChildObservable<A, readonly [A]>;
|
|
228
|
+
|
|
229
|
+
export type SkipIfNoChangeOperatorObservable<A> = SyncChildObservable<
|
|
230
|
+
A,
|
|
231
|
+
readonly [A]
|
|
232
|
+
>;
|
|
233
|
+
|
|
234
|
+
export type ThrottleTimeOperatorObservable<A> = SyncChildObservable<
|
|
235
|
+
A,
|
|
236
|
+
readonly [A]
|
|
237
|
+
>;
|
|
238
|
+
|
|
239
|
+
// AsyncChildObservable
|
|
240
|
+
|
|
241
|
+
export type AuditTimeOperatorObservable<A> = AsyncChildObservable<
|
|
242
|
+
A,
|
|
243
|
+
readonly [A]
|
|
244
|
+
>;
|
|
245
|
+
|
|
246
|
+
export type DebounceTimeOperatorObservable<A> = AsyncChildObservable<
|
|
247
|
+
A,
|
|
248
|
+
readonly [A]
|
|
249
|
+
>;
|
|
250
|
+
|
|
251
|
+
export type SwitchMapOperatorObservable<A, B> = AsyncChildObservable<
|
|
252
|
+
B,
|
|
253
|
+
readonly [A]
|
|
254
|
+
>;
|
|
255
|
+
|
|
256
|
+
export type MergeMapOperatorObservable<A, B> = AsyncChildObservable<
|
|
257
|
+
B,
|
|
258
|
+
readonly [A]
|
|
259
|
+
>;
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { expectType, type Optional } from 'ts-data-forge';
|
|
2
|
+
import { type ObservableId, type UpdaterSymbol } from './id.mjs';
|
|
3
|
+
import { type ObservableKind } from './observable-kind.mjs';
|
|
4
|
+
import { type NonEmptyUnknownList, type Subscription } from './types.mjs';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Inheritance
|
|
8
|
+
*
|
|
9
|
+
* ```txt
|
|
10
|
+
* ObservableBase
|
|
11
|
+
* |
|
|
12
|
+
* +- SyncChildObservable \ \
|
|
13
|
+
* | +-- ChildObservable \
|
|
14
|
+
* +- AsyncChildObservable X +-- Observable
|
|
15
|
+
* | +-- ManagerObservable /
|
|
16
|
+
* +- RootObservableType / /
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
type CreateObservableType<A, Kind extends ObservableKind> = Readonly<{
|
|
21
|
+
id: ObservableId;
|
|
22
|
+
kind: Kind;
|
|
23
|
+
|
|
24
|
+
// reactive dependency tree structure
|
|
25
|
+
depth: ObservableKind extends 'root' ? 0 : number;
|
|
26
|
+
addChild: <B>(child: ChildObservable<B>) => void;
|
|
27
|
+
|
|
28
|
+
// state
|
|
29
|
+
getSnapshot: () => Optional<A>;
|
|
30
|
+
isCompleted: boolean;
|
|
31
|
+
updaterSymbol: UpdaterSymbol;
|
|
32
|
+
hasSubscriber: boolean;
|
|
33
|
+
hasChild: boolean;
|
|
34
|
+
hasActiveChild: () => boolean;
|
|
35
|
+
|
|
36
|
+
tryUpdate: (updaterSymbol: UpdaterSymbol) => void;
|
|
37
|
+
tryComplete: () => void;
|
|
38
|
+
complete: () => void;
|
|
39
|
+
subscribe: (onNext: (v: A) => void, onComplete?: () => void) => Subscription;
|
|
40
|
+
|
|
41
|
+
pipe: PipeMethod<A>;
|
|
42
|
+
}>;
|
|
43
|
+
|
|
44
|
+
/** @internal */
|
|
45
|
+
type PipeMethod<A> = (<B>(
|
|
46
|
+
operator: WithInitialValueOperator<A, B>,
|
|
47
|
+
) => InitializedObservable<B>) &
|
|
48
|
+
(<B>(operator: DropInitialValueOperator<A, B>) => Observable<B>) &
|
|
49
|
+
(<B>(operator: KeepInitialValueOperator<A, B>) => Observable<B>);
|
|
50
|
+
|
|
51
|
+
export type ObservableBase<A> = CreateObservableType<A, ObservableKind>;
|
|
52
|
+
|
|
53
|
+
/** @internal */
|
|
54
|
+
namespace ObservableTypeConverter {
|
|
55
|
+
export type ToInitialized<
|
|
56
|
+
A,
|
|
57
|
+
O extends CreateObservableType<A, ObservableKind>,
|
|
58
|
+
> = StrictOmit<O, 'pipe' | 'getSnapshot'> &
|
|
59
|
+
Readonly<{
|
|
60
|
+
getSnapshot: () => Some<A>;
|
|
61
|
+
|
|
62
|
+
pipe: PipeMethodForInitialized<A>;
|
|
63
|
+
}>;
|
|
64
|
+
|
|
65
|
+
type PipeMethodForInitialized<A> = (<B>(
|
|
66
|
+
operator: WithInitialValueOperator<A, B>,
|
|
67
|
+
) => InitializedObservable<B>) &
|
|
68
|
+
(<B>(operator: DropInitialValueOperator<A, B>) => Observable<B>) &
|
|
69
|
+
(<B>(operator: KeepInitialValueOperator<A, B>) => InitializedObservable<B>);
|
|
70
|
+
|
|
71
|
+
export type ToChild<
|
|
72
|
+
A,
|
|
73
|
+
O extends CreateObservableType<A, ObservableKind>,
|
|
74
|
+
P extends NonEmptyUnknownList = NonEmptyUnknownList,
|
|
75
|
+
> = O &
|
|
76
|
+
Readonly<{
|
|
77
|
+
parents: Wrap<P>;
|
|
78
|
+
}>;
|
|
79
|
+
|
|
80
|
+
export type ToManager<
|
|
81
|
+
A,
|
|
82
|
+
O extends CreateObservableType<A, 'async child' | 'root'>,
|
|
83
|
+
> = O &
|
|
84
|
+
Readonly<{
|
|
85
|
+
addDescendant: <B>(child: ChildObservable<B>) => void;
|
|
86
|
+
}>;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export type SyncChildObservable<
|
|
90
|
+
A,
|
|
91
|
+
P extends NonEmptyUnknownList = NonEmptyUnknownList,
|
|
92
|
+
> = ObservableTypeConverter.ToChild<
|
|
93
|
+
A,
|
|
94
|
+
CreateObservableType<A, 'sync child'>,
|
|
95
|
+
P
|
|
96
|
+
>;
|
|
97
|
+
|
|
98
|
+
export type InitializedSyncChildObservable<
|
|
99
|
+
A,
|
|
100
|
+
P extends NonEmptyUnknownList = NonEmptyUnknownList,
|
|
101
|
+
> = ObservableTypeConverter.ToInitialized<A, SyncChildObservable<A, P>>;
|
|
102
|
+
|
|
103
|
+
export type AsyncChildObservable<
|
|
104
|
+
A,
|
|
105
|
+
P extends NonEmptyUnknownList = NonEmptyUnknownList,
|
|
106
|
+
> = ObservableTypeConverter.ToManager<
|
|
107
|
+
A,
|
|
108
|
+
ObservableTypeConverter.ToChild<A, CreateObservableType<A, 'async child'>, P>
|
|
109
|
+
>;
|
|
110
|
+
|
|
111
|
+
export type InitializedAsyncChildObservable<
|
|
112
|
+
A,
|
|
113
|
+
P extends NonEmptyUnknownList = NonEmptyUnknownList,
|
|
114
|
+
> = ObservableTypeConverter.ToInitialized<A, AsyncChildObservable<A, P>>;
|
|
115
|
+
|
|
116
|
+
export type ChildObservable<
|
|
117
|
+
A,
|
|
118
|
+
P extends NonEmptyUnknownList = NonEmptyUnknownList,
|
|
119
|
+
> = AsyncChildObservable<A, P> | SyncChildObservable<A, P>;
|
|
120
|
+
|
|
121
|
+
export type RootObservable<A> = ObservableTypeConverter.ToManager<
|
|
122
|
+
A,
|
|
123
|
+
CreateObservableType<A, 'root'>
|
|
124
|
+
>;
|
|
125
|
+
|
|
126
|
+
export type InitializedRootObservable<A> =
|
|
127
|
+
ObservableTypeConverter.ToInitialized<A, RootObservable<A>>;
|
|
128
|
+
|
|
129
|
+
export type Observable<A> =
|
|
130
|
+
| AsyncChildObservable<A>
|
|
131
|
+
| RootObservable<A>
|
|
132
|
+
| SyncChildObservable<A>;
|
|
133
|
+
|
|
134
|
+
export type InitializedObservable<A> =
|
|
135
|
+
| InitializedAsyncChildObservable<A>
|
|
136
|
+
| InitializedRootObservable<A>
|
|
137
|
+
| InitializedSyncChildObservable<A>;
|
|
138
|
+
|
|
139
|
+
export type ManagerObservable<A> = AsyncChildObservable<A> | RootObservable<A>;
|
|
140
|
+
|
|
141
|
+
/* operator types */
|
|
142
|
+
|
|
143
|
+
/** Type of operator that converts Observable to InitializedObservable */
|
|
144
|
+
export type WithInitialValueOperator<A, B> = (
|
|
145
|
+
src: Observable<A>,
|
|
146
|
+
) => InitializedObservable<B>;
|
|
147
|
+
|
|
148
|
+
/** Type of operator that converts Observable to non-initialized Observable */
|
|
149
|
+
export type DropInitialValueOperator<A, B> = (
|
|
150
|
+
src: InitializedObservable<A> | Observable<A>,
|
|
151
|
+
) => Observable<B>;
|
|
152
|
+
|
|
153
|
+
/** Type of operator that preserves whether Observable has initial value */
|
|
154
|
+
export type KeepInitialValueOperator<A, B> = (
|
|
155
|
+
src: InitializedObservable<A>,
|
|
156
|
+
) => InitializedObservable<B>;
|
|
157
|
+
|
|
158
|
+
export type Operator<A, B> =
|
|
159
|
+
| WithInitialValueOperator<A, B>
|
|
160
|
+
| DropInitialValueOperator<A, B>
|
|
161
|
+
| KeepInitialValueOperator<A, B>;
|
|
162
|
+
|
|
163
|
+
export const isManagerObservable = <A,>(
|
|
164
|
+
obs: Observable<A>,
|
|
165
|
+
): obs is ManagerObservable<A> => obs.kind !== 'sync child';
|
|
166
|
+
|
|
167
|
+
export const isRootObservable = <A,>(
|
|
168
|
+
obs: Observable<A>,
|
|
169
|
+
): obs is RootObservable<A> => obs.kind === 'root';
|
|
170
|
+
|
|
171
|
+
export const isChildObservable = <A,>(
|
|
172
|
+
obs: Observable<A>,
|
|
173
|
+
): obs is ChildObservable<A> =>
|
|
174
|
+
obs.kind === 'sync child' || obs.kind === 'async child';
|
|
175
|
+
|
|
176
|
+
export type ObservableValue<A> = A extends Observable<infer B> ? B : never;
|
|
177
|
+
|
|
178
|
+
export type Unwrap<A extends readonly Observable<unknown>[]> = Readonly<{
|
|
179
|
+
[P in keyof A]: ObservableValue<A[P]>;
|
|
180
|
+
}>;
|
|
181
|
+
|
|
182
|
+
export type Wrap<A extends readonly unknown[]> = Readonly<{
|
|
183
|
+
[P in keyof A]: Observable<A[P]>;
|
|
184
|
+
}>;
|
|
185
|
+
|
|
186
|
+
export type WrapInitialized<A extends readonly unknown[]> = Readonly<{
|
|
187
|
+
[P in keyof A]: InitializedObservable<A[P]>;
|
|
188
|
+
}>;
|
|
189
|
+
|
|
190
|
+
// type GetDestTypeOfOperator<Op extends Operator<unknown, unknown>> =
|
|
191
|
+
// Op extends Operator<unknown, infer B> ? B : never;
|
|
192
|
+
|
|
193
|
+
expectType<keyof AsyncChildObservable<unknown>, 'addDescendant'>('>=');
|
|
194
|
+
|
|
195
|
+
expectType<keyof RootObservable<unknown>, 'addDescendant'>('>=');
|
|
196
|
+
|
|
197
|
+
expectType<Unwrap<Wrap<readonly [1, 2, 3]>>, readonly [1, 2, 3]>('=');
|
|
198
|
+
|
|
199
|
+
expectType<number, ObservableValue<Observable<number>>>('<=');
|
|
200
|
+
|
|
201
|
+
expectType<number, ObservableValue<Observable<string>>>('!<=');
|
|
202
|
+
|
|
203
|
+
expectType<
|
|
204
|
+
readonly [number, string],
|
|
205
|
+
Unwrap<readonly [Observable<number>, Observable<string>]>
|
|
206
|
+
>('<=');
|
|
207
|
+
|
|
208
|
+
expectType<number, ObservableValue<Observable<string>>>('!<=');
|
|
209
|
+
|
|
210
|
+
expectType<
|
|
211
|
+
readonly [Observable<number>, Observable<number>],
|
|
212
|
+
Wrap<readonly [number, number]>
|
|
213
|
+
>('<=');
|
|
214
|
+
|
|
215
|
+
expectType<
|
|
216
|
+
readonly [Observable<number>, Observable<string>],
|
|
217
|
+
Wrap<readonly [number, number]>
|
|
218
|
+
>('!<=');
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { expectType, type Queue } from 'ts-data-forge';
|
|
2
|
+
|
|
3
|
+
export type TupleToQueueTuple<T extends readonly unknown[]> = Readonly<{
|
|
4
|
+
[P in keyof T]: Queue<T[P]>;
|
|
5
|
+
}>;
|
|
6
|
+
|
|
7
|
+
export type NonEmptyUnknownList = readonly [unknown, ...unknown[]];
|
|
8
|
+
|
|
9
|
+
export type Subscriber<A> = Readonly<{
|
|
10
|
+
onNext: (v: A) => void;
|
|
11
|
+
onComplete: () => void;
|
|
12
|
+
}>;
|
|
13
|
+
|
|
14
|
+
export type Subscription = Readonly<{
|
|
15
|
+
unsubscribe: () => void;
|
|
16
|
+
}>;
|
|
17
|
+
|
|
18
|
+
export type Subscribable<A> = Readonly<{
|
|
19
|
+
subscribe: (
|
|
20
|
+
onNext: (nextValue: A) => void,
|
|
21
|
+
onError?: (error?: unknown) => void,
|
|
22
|
+
onComplete?: () => void,
|
|
23
|
+
) => Subscription;
|
|
24
|
+
}>;
|
|
25
|
+
|
|
26
|
+
// type tests
|
|
27
|
+
|
|
28
|
+
expectType<
|
|
29
|
+
TupleToQueueTuple<readonly [number, string, boolean]>,
|
|
30
|
+
readonly [Queue<number>, Queue<string>, Queue<boolean>]
|
|
31
|
+
>('=');
|
|
32
|
+
|
|
33
|
+
// Subscriber is covariant
|
|
34
|
+
expectType<Subscriber<number>, Subscriber<1>>('<=');
|
|
35
|
+
|
|
36
|
+
expectType<Subscriber<1>, Subscriber<number>>('!<=');
|
|
37
|
+
|
|
38
|
+
expectType<Subscriber<number>, Subscriber<'1'>>('!<=');
|
|
39
|
+
|
|
40
|
+
expectType<Subscriber<'1'>, Subscriber<number>>('!<=');
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type ObservableId,
|
|
3
|
+
type SubscriberId,
|
|
4
|
+
type UpdaterSymbol,
|
|
5
|
+
} from '../types/index.mjs';
|
|
6
|
+
|
|
7
|
+
function* idMaker<T extends symbol>(): Generator<T, T, T> {
|
|
8
|
+
let mut_i = 0;
|
|
9
|
+
|
|
10
|
+
while (true) {
|
|
11
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
12
|
+
yield Symbol(mut_i.toString()) as T;
|
|
13
|
+
|
|
14
|
+
mut_i += 1;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const observableIdMaker = idMaker<ObservableId>();
|
|
19
|
+
|
|
20
|
+
const subscriberIdMaker = idMaker<SubscriberId>();
|
|
21
|
+
|
|
22
|
+
const updaterSymbolMaker = idMaker<UpdaterSymbol>();
|
|
23
|
+
|
|
24
|
+
export const issueObservableId = (): ObservableId =>
|
|
25
|
+
observableIdMaker.next().value;
|
|
26
|
+
|
|
27
|
+
export const issueSubscriberId = (): SubscriberId =>
|
|
28
|
+
subscriberIdMaker.next().value;
|
|
29
|
+
|
|
30
|
+
export const issueUpdaterSymbol = (): UpdaterSymbol =>
|
|
31
|
+
updaterSymbolMaker.next().value;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Arr, Optional, pipe } from 'ts-data-forge';
|
|
2
|
+
import { type Observable } from '../types/index.mjs';
|
|
3
|
+
|
|
4
|
+
export const maxDepth = (parents: readonly Observable<unknown>[]): number =>
|
|
5
|
+
pipe(Arr.maxBy(parents, (p) => p.depth))
|
|
6
|
+
.mapOptional((o) => o.depth)
|
|
7
|
+
.map(Optional.unwrapOr(0)).value;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Arr, asSafeInt, asUint32, SafeInt } from 'ts-data-forge';
|
|
2
|
+
|
|
3
|
+
export const halfInt = (x: SafeInt): SafeInt =>
|
|
4
|
+
x % 2 === 0
|
|
5
|
+
? SafeInt.div(x, 2)
|
|
6
|
+
: x > 0
|
|
7
|
+
? SafeInt.div(SafeInt.sub(x, 1), 2) // (x-1) / 2. e.g. 3 -> 1, 5 -> 2
|
|
8
|
+
: SafeInt.div(SafeInt.add(x, 1), 2); // (x+1) / 2. e.g. -3 -> -1, -5 -> -2
|
|
9
|
+
|
|
10
|
+
/** Returns the position where x should be inserted in a sorted array. */
|
|
11
|
+
export const binarySearch = <N extends number>(
|
|
12
|
+
sortedArray: readonly N[],
|
|
13
|
+
x: N,
|
|
14
|
+
): NegativeInt32 | Uint32 => {
|
|
15
|
+
const uint32Result = asUint32(0);
|
|
16
|
+
|
|
17
|
+
if (Arr.isArrayOfLength(sortedArray, 0)) {
|
|
18
|
+
return uint32Result;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const left0 = asSafeInt(0);
|
|
22
|
+
|
|
23
|
+
let mut_left: SafeInt = left0;
|
|
24
|
+
|
|
25
|
+
let mut_right: SafeInt = SafeInt.sub(Arr.length(sortedArray), 1);
|
|
26
|
+
|
|
27
|
+
let mut_mid: SafeInt = SafeInt.add(
|
|
28
|
+
mut_left,
|
|
29
|
+
halfInt(SafeInt.sub(mut_right, mut_left)),
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
// loop while x is in the range of [left, right)
|
|
33
|
+
while (mut_left <= mut_right) {
|
|
34
|
+
const curr = sortedArray[mut_mid];
|
|
35
|
+
|
|
36
|
+
if (x === curr) break;
|
|
37
|
+
|
|
38
|
+
if (curr === undefined) break;
|
|
39
|
+
|
|
40
|
+
if (curr > x) {
|
|
41
|
+
mut_right = SafeInt.sub(mut_mid, 1);
|
|
42
|
+
} else {
|
|
43
|
+
mut_left = SafeInt.add(mut_mid, 1);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
mut_mid = SafeInt.add(mut_left, halfInt(SafeInt.sub(mut_right, mut_left)));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
50
|
+
return mut_mid as NegativeInt32 | Uint32;
|
|
51
|
+
};
|