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.
Files changed (268) hide show
  1. package/README.md +878 -0
  2. package/dist/core/class/child-observable-class.d.mts +37 -0
  3. package/dist/core/class/child-observable-class.d.mts.map +1 -0
  4. package/dist/core/class/child-observable-class.mjs +134 -0
  5. package/dist/core/class/child-observable-class.mjs.map +1 -0
  6. package/dist/core/class/index.d.mts +4 -0
  7. package/dist/core/class/index.d.mts.map +1 -0
  8. package/dist/core/class/index.mjs +4 -0
  9. package/dist/core/class/index.mjs.map +1 -0
  10. package/dist/core/class/observable-base-class.d.mts +28 -0
  11. package/dist/core/class/observable-base-class.d.mts.map +1 -0
  12. package/dist/core/class/observable-base-class.mjs +116 -0
  13. package/dist/core/class/observable-base-class.mjs.map +1 -0
  14. package/dist/core/class/root-observable-class.d.mts +12 -0
  15. package/dist/core/class/root-observable-class.d.mts.map +1 -0
  16. package/dist/core/class/root-observable-class.mjs +35 -0
  17. package/dist/core/class/root-observable-class.mjs.map +1 -0
  18. package/dist/core/combine/combine.d.mts +35 -0
  19. package/dist/core/combine/combine.d.mts.map +1 -0
  20. package/dist/core/combine/combine.mjs +94 -0
  21. package/dist/core/combine/combine.mjs.map +1 -0
  22. package/dist/core/combine/index.d.mts +4 -0
  23. package/dist/core/combine/index.d.mts.map +1 -0
  24. package/dist/core/combine/index.mjs +4 -0
  25. package/dist/core/combine/index.mjs.map +1 -0
  26. package/dist/core/combine/merge.d.mts +28 -0
  27. package/dist/core/combine/merge.d.mts.map +1 -0
  28. package/dist/core/combine/merge.mjs +52 -0
  29. package/dist/core/combine/merge.mjs.map +1 -0
  30. package/dist/core/combine/zip.d.mts +26 -0
  31. package/dist/core/combine/zip.d.mts.map +1 -0
  32. package/dist/core/combine/zip.mjs +63 -0
  33. package/dist/core/combine/zip.mjs.map +1 -0
  34. package/dist/core/create/from-array.d.mts +21 -0
  35. package/dist/core/create/from-array.d.mts.map +1 -0
  36. package/dist/core/create/from-array.mjs +47 -0
  37. package/dist/core/create/from-array.mjs.map +1 -0
  38. package/dist/core/create/from-promise.d.mts +25 -0
  39. package/dist/core/create/from-promise.d.mts.map +1 -0
  40. package/dist/core/create/from-promise.mjs +51 -0
  41. package/dist/core/create/from-promise.mjs.map +1 -0
  42. package/dist/core/create/from-subscribable.d.mts +3 -0
  43. package/dist/core/create/from-subscribable.d.mts.map +1 -0
  44. package/dist/core/create/from-subscribable.mjs +22 -0
  45. package/dist/core/create/from-subscribable.mjs.map +1 -0
  46. package/dist/core/create/index.d.mts +8 -0
  47. package/dist/core/create/index.d.mts.map +1 -0
  48. package/dist/core/create/index.mjs +8 -0
  49. package/dist/core/create/index.mjs.map +1 -0
  50. package/dist/core/create/interval.d.mts +21 -0
  51. package/dist/core/create/interval.d.mts.map +1 -0
  52. package/dist/core/create/interval.mjs +74 -0
  53. package/dist/core/create/interval.mjs.map +1 -0
  54. package/dist/core/create/of.d.mts +20 -0
  55. package/dist/core/create/of.d.mts.map +1 -0
  56. package/dist/core/create/of.mjs +44 -0
  57. package/dist/core/create/of.mjs.map +1 -0
  58. package/dist/core/create/source.d.mts +29 -0
  59. package/dist/core/create/source.d.mts.map +1 -0
  60. package/dist/core/create/source.mjs +29 -0
  61. package/dist/core/create/source.mjs.map +1 -0
  62. package/dist/core/create/timer.d.mts +20 -0
  63. package/dist/core/create/timer.d.mts.map +1 -0
  64. package/dist/core/create/timer.mjs +64 -0
  65. package/dist/core/create/timer.mjs.map +1 -0
  66. package/dist/core/index.d.mts +7 -0
  67. package/dist/core/index.d.mts.map +1 -0
  68. package/dist/core/index.mjs +37 -0
  69. package/dist/core/index.mjs.map +1 -0
  70. package/dist/core/operators/audit-time.d.mts +3 -0
  71. package/dist/core/operators/audit-time.d.mts.map +1 -0
  72. package/dist/core/operators/audit-time.mjs +50 -0
  73. package/dist/core/operators/audit-time.mjs.map +1 -0
  74. package/dist/core/operators/debounce-time.d.mts +31 -0
  75. package/dist/core/operators/debounce-time.d.mts.map +1 -0
  76. package/dist/core/operators/debounce-time.mjs +73 -0
  77. package/dist/core/operators/debounce-time.mjs.map +1 -0
  78. package/dist/core/operators/filter.d.mts +28 -0
  79. package/dist/core/operators/filter.d.mts.map +1 -0
  80. package/dist/core/operators/filter.mjs +38 -0
  81. package/dist/core/operators/filter.mjs.map +1 -0
  82. package/dist/core/operators/index.d.mts +18 -0
  83. package/dist/core/operators/index.d.mts.map +1 -0
  84. package/dist/core/operators/index.mjs +18 -0
  85. package/dist/core/operators/index.mjs.map +1 -0
  86. package/dist/core/operators/map-with-index.d.mts +39 -0
  87. package/dist/core/operators/map-with-index.d.mts.map +1 -0
  88. package/dist/core/operators/map-with-index.mjs +73 -0
  89. package/dist/core/operators/map-with-index.mjs.map +1 -0
  90. package/dist/core/operators/merge-map.d.mts +34 -0
  91. package/dist/core/operators/merge-map.d.mts.map +1 -0
  92. package/dist/core/operators/merge-map.mjs +75 -0
  93. package/dist/core/operators/merge-map.mjs.map +1 -0
  94. package/dist/core/operators/pairwise.d.mts +27 -0
  95. package/dist/core/operators/pairwise.d.mts.map +1 -0
  96. package/dist/core/operators/pairwise.mjs +59 -0
  97. package/dist/core/operators/pairwise.mjs.map +1 -0
  98. package/dist/core/operators/scan.d.mts +30 -0
  99. package/dist/core/operators/scan.d.mts.map +1 -0
  100. package/dist/core/operators/scan.mjs +56 -0
  101. package/dist/core/operators/scan.mjs.map +1 -0
  102. package/dist/core/operators/skip-if-no-change.d.mts +33 -0
  103. package/dist/core/operators/skip-if-no-change.d.mts.map +1 -0
  104. package/dist/core/operators/skip-if-no-change.mjs +68 -0
  105. package/dist/core/operators/skip-if-no-change.mjs.map +1 -0
  106. package/dist/core/operators/skip-until.d.mts +3 -0
  107. package/dist/core/operators/skip-until.d.mts.map +1 -0
  108. package/dist/core/operators/skip-until.mjs +33 -0
  109. package/dist/core/operators/skip-until.mjs.map +1 -0
  110. package/dist/core/operators/skip-while.d.mts +4 -0
  111. package/dist/core/operators/skip-while.d.mts.map +1 -0
  112. package/dist/core/operators/skip-while.mjs +40 -0
  113. package/dist/core/operators/skip-while.mjs.map +1 -0
  114. package/dist/core/operators/switch-map.d.mts +31 -0
  115. package/dist/core/operators/switch-map.d.mts.map +1 -0
  116. package/dist/core/operators/switch-map.mjs +70 -0
  117. package/dist/core/operators/switch-map.mjs.map +1 -0
  118. package/dist/core/operators/take-until.d.mts +32 -0
  119. package/dist/core/operators/take-until.d.mts.map +1 -0
  120. package/dist/core/operators/take-until.mjs +60 -0
  121. package/dist/core/operators/take-until.mjs.map +1 -0
  122. package/dist/core/operators/take-while.d.mts +4 -0
  123. package/dist/core/operators/take-while.d.mts.map +1 -0
  124. package/dist/core/operators/take-while.mjs +42 -0
  125. package/dist/core/operators/take-while.mjs.map +1 -0
  126. package/dist/core/operators/throttle-time.d.mts +23 -0
  127. package/dist/core/operators/throttle-time.d.mts.map +1 -0
  128. package/dist/core/operators/throttle-time.mjs +68 -0
  129. package/dist/core/operators/throttle-time.mjs.map +1 -0
  130. package/dist/core/operators/with-buffered-from.d.mts +4 -0
  131. package/dist/core/operators/with-buffered-from.d.mts.map +1 -0
  132. package/dist/core/operators/with-buffered-from.mjs +45 -0
  133. package/dist/core/operators/with-buffered-from.mjs.map +1 -0
  134. package/dist/core/operators/with-current-value-from.d.mts +4 -0
  135. package/dist/core/operators/with-current-value-from.d.mts.map +1 -0
  136. package/dist/core/operators/with-current-value-from.mjs +37 -0
  137. package/dist/core/operators/with-current-value-from.mjs.map +1 -0
  138. package/dist/core/operators/with-initial-value.d.mts +26 -0
  139. package/dist/core/operators/with-initial-value.d.mts.map +1 -0
  140. package/dist/core/operators/with-initial-value.mjs +47 -0
  141. package/dist/core/operators/with-initial-value.mjs.map +1 -0
  142. package/dist/core/types/id.d.mts +4 -0
  143. package/dist/core/types/id.d.mts.map +1 -0
  144. package/dist/core/types/id.mjs +2 -0
  145. package/dist/core/types/id.mjs.map +1 -0
  146. package/dist/core/types/index.d.mts +6 -0
  147. package/dist/core/types/index.d.mts.map +1 -0
  148. package/dist/core/types/index.mjs +3 -0
  149. package/dist/core/types/index.mjs.map +1 -0
  150. package/dist/core/types/observable-family.d.mts +68 -0
  151. package/dist/core/types/observable-family.d.mts.map +1 -0
  152. package/dist/core/types/observable-family.mjs +2 -0
  153. package/dist/core/types/observable-family.mjs.map +1 -0
  154. package/dist/core/types/observable-kind.d.mts +4 -0
  155. package/dist/core/types/observable-kind.d.mts.map +1 -0
  156. package/dist/core/types/observable-kind.mjs +2 -0
  157. package/dist/core/types/observable-kind.mjs.map +1 -0
  158. package/dist/core/types/observable.d.mts +83 -0
  159. package/dist/core/types/observable.d.mts.map +1 -0
  160. package/dist/core/types/observable.mjs +10 -0
  161. package/dist/core/types/observable.mjs.map +1 -0
  162. package/dist/core/types/types.d.mts +16 -0
  163. package/dist/core/types/types.d.mts.map +1 -0
  164. package/dist/core/types/types.mjs +2 -0
  165. package/dist/core/types/types.mjs.map +1 -0
  166. package/dist/core/utils/id-maker.d.mts +5 -0
  167. package/dist/core/utils/id-maker.d.mts.map +1 -0
  168. package/dist/core/utils/id-maker.mjs +17 -0
  169. package/dist/core/utils/id-maker.mjs.map +1 -0
  170. package/dist/core/utils/index.d.mts +5 -0
  171. package/dist/core/utils/index.d.mts.map +1 -0
  172. package/dist/core/utils/index.mjs +5 -0
  173. package/dist/core/utils/index.mjs.map +1 -0
  174. package/dist/core/utils/max-depth.d.mts +3 -0
  175. package/dist/core/utils/max-depth.d.mts.map +1 -0
  176. package/dist/core/utils/max-depth.mjs +8 -0
  177. package/dist/core/utils/max-depth.mjs.map +1 -0
  178. package/dist/core/utils/observable-utils.d.mts +3 -0
  179. package/dist/core/utils/observable-utils.d.mts.map +1 -0
  180. package/dist/core/utils/observable-utils.mjs +7 -0
  181. package/dist/core/utils/observable-utils.mjs.map +1 -0
  182. package/dist/core/utils/utils.d.mts +4 -0
  183. package/dist/core/utils/utils.d.mts.map +1 -0
  184. package/dist/core/utils/utils.mjs +38 -0
  185. package/dist/core/utils/utils.mjs.map +1 -0
  186. package/dist/entry-point.d.mts +2 -0
  187. package/dist/entry-point.d.mts.map +1 -0
  188. package/dist/entry-point.mjs +40 -0
  189. package/dist/entry-point.mjs.map +1 -0
  190. package/dist/globals.d.mts +4 -0
  191. package/dist/index.d.mts +3 -0
  192. package/dist/index.d.mts.map +1 -0
  193. package/dist/index.mjs +40 -0
  194. package/dist/index.mjs.map +1 -0
  195. package/dist/tsconfig.json +1 -0
  196. package/dist/types.d.mts +2 -0
  197. package/dist/utils/create-event-emitter.d.mts +39 -0
  198. package/dist/utils/create-event-emitter.d.mts.map +1 -0
  199. package/dist/utils/create-event-emitter.mjs +57 -0
  200. package/dist/utils/create-event-emitter.mjs.map +1 -0
  201. package/dist/utils/create-reducer.d.mts +34 -0
  202. package/dist/utils/create-reducer.d.mts.map +1 -0
  203. package/dist/utils/create-reducer.mjs +49 -0
  204. package/dist/utils/create-reducer.mjs.map +1 -0
  205. package/dist/utils/create-state.d.mts +61 -0
  206. package/dist/utils/create-state.d.mts.map +1 -0
  207. package/dist/utils/create-state.mjs +92 -0
  208. package/dist/utils/create-state.mjs.map +1 -0
  209. package/dist/utils/index.d.mts +4 -0
  210. package/dist/utils/index.d.mts.map +1 -0
  211. package/dist/utils/index.mjs +4 -0
  212. package/dist/utils/index.mjs.map +1 -0
  213. package/package.json +71 -0
  214. package/src/core/class/child-observable-class.mts +232 -0
  215. package/src/core/class/index.mts +3 -0
  216. package/src/core/class/observable-base-class.mts +186 -0
  217. package/src/core/class/observable.class.test.mts +89 -0
  218. package/src/core/class/root-observable-class.mts +68 -0
  219. package/src/core/combine/combine.mts +144 -0
  220. package/src/core/combine/index.mts +3 -0
  221. package/src/core/combine/merge.mts +84 -0
  222. package/src/core/combine/zip.mts +149 -0
  223. package/src/core/create/from-array.mts +58 -0
  224. package/src/core/create/from-promise.mts +58 -0
  225. package/src/core/create/from-subscribable.mts +37 -0
  226. package/src/core/create/index.mts +7 -0
  227. package/src/core/create/interval.mts +99 -0
  228. package/src/core/create/of.mts +54 -0
  229. package/src/core/create/source.mts +59 -0
  230. package/src/core/create/timer.mts +84 -0
  231. package/src/core/index.mts +6 -0
  232. package/src/core/operators/audit-time.mts +77 -0
  233. package/src/core/operators/debounce-time.mts +96 -0
  234. package/src/core/operators/filter.mts +125 -0
  235. package/src/core/operators/index.mts +17 -0
  236. package/src/core/operators/map-with-index.mts +168 -0
  237. package/src/core/operators/merge-map.mts +108 -0
  238. package/src/core/operators/pairwise.mts +77 -0
  239. package/src/core/operators/scan.mts +81 -0
  240. package/src/core/operators/skip-if-no-change.mts +91 -0
  241. package/src/core/operators/skip-until.mts +54 -0
  242. package/src/core/operators/skip-while.mts +77 -0
  243. package/src/core/operators/switch-map.mts +101 -0
  244. package/src/core/operators/take-until.mts +80 -0
  245. package/src/core/operators/take-while.mts +103 -0
  246. package/src/core/operators/throttle-time.mts +95 -0
  247. package/src/core/operators/with-buffered-from.mts +68 -0
  248. package/src/core/operators/with-current-value-from.mts +58 -0
  249. package/src/core/operators/with-initial-value.mts +76 -0
  250. package/src/core/types/id.mts +5 -0
  251. package/src/core/types/index.mts +5 -0
  252. package/src/core/types/observable-family.mts +259 -0
  253. package/src/core/types/observable-kind.mts +5 -0
  254. package/src/core/types/observable.mts +218 -0
  255. package/src/core/types/types.mts +40 -0
  256. package/src/core/utils/id-maker.mts +31 -0
  257. package/src/core/utils/index.mts +4 -0
  258. package/src/core/utils/max-depth.mts +7 -0
  259. package/src/core/utils/observable-utils.mts +10 -0
  260. package/src/core/utils/utils.mts +51 -0
  261. package/src/core/utils/utils.test.mts +88 -0
  262. package/src/entry-point.mts +1 -0
  263. package/src/globals.d.mts +4 -0
  264. package/src/index.mts +2 -0
  265. package/src/utils/create-event-emitter.mts +62 -0
  266. package/src/utils/create-reducer.mts +55 -0
  267. package/src/utils/create-state.mts +138 -0
  268. 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,5 @@
1
+ export type ObservableKind = 'root' | 'sync child' | 'async child';
2
+
3
+ export type ManagerObservableKind = StrictExclude<ObservableKind, 'sync child'>;
4
+
5
+ export type ChildObservableKind = StrictExclude<ObservableKind, 'root'>;
@@ -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,4 @@
1
+ export * from './id-maker.mjs';
2
+ export * from './max-depth.mjs';
3
+ export * from './observable-utils.mjs';
4
+ export * from './utils.mjs';
@@ -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,10 @@
1
+ import { type Subscriber } from '../types/index.mjs';
2
+
3
+ export const toSubscriber = <A,>(
4
+ onNext: (v: A) => void,
5
+ onComplete?: () => void,
6
+ ): Subscriber<A> =>
7
+ ({
8
+ onNext,
9
+ onComplete: onComplete ?? (() => {}),
10
+ }) as const;
@@ -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
+ };