@fncts/observable 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (259) hide show
  1. package/Action.d.ts +6 -0
  2. package/AnimationFrameAction.d.ts +11 -0
  3. package/AnimationFrameScheduler.d.ts +6 -0
  4. package/AsyncAction.d.ts +19 -0
  5. package/AsyncScheduler.d.ts +11 -0
  6. package/BehaviorSubject.d.ts +10 -0
  7. package/Notification.d.ts +59 -0
  8. package/Observable/api/connect.d.ts +10 -0
  9. package/Observable/api/connectable.d.ts +24 -0
  10. package/Observable/api/fromCallback.d.ts +11 -0
  11. package/Observable/api/fromEvent.d.ts +4 -0
  12. package/Observable/api/index.d.ts +14 -0
  13. package/Observable/api/race.d.ts +9 -0
  14. package/Observable/api/raceWith.d.ts +6 -0
  15. package/Observable/api/repeatWhen.d.ts +5 -0
  16. package/Observable/api/retryWhen.d.ts +10 -0
  17. package/Observable/api/share.d.ts +16 -0
  18. package/Observable/api/window.d.ts +8 -0
  19. package/Observable/api/windowCount.d.ts +6 -0
  20. package/Observable/api/windowTime.d.ts +12 -0
  21. package/Observable/api/windowToggle.d.ts +8 -0
  22. package/Observable/api/windowWhen.d.ts +9 -0
  23. package/Observable/api.d.ts +668 -0
  24. package/Observable/definition.d.ts +32 -0
  25. package/Observable/dom/animationFrames.d.ts +6 -0
  26. package/Observable/instances.d.ts +1 -0
  27. package/Observable.d.ts +19 -0
  28. package/Observer.d.ts +6 -0
  29. package/Operator.d.ts +19 -0
  30. package/Scheduler.d.ts +22 -0
  31. package/Subject.d.ts +48 -0
  32. package/Subscriber.d.ts +27 -0
  33. package/Subscription.d.ts +41 -0
  34. package/_cjs/Action.cjs +27 -0
  35. package/_cjs/Action.cjs.map +1 -0
  36. package/_cjs/AnimationFrameAction.cjs +48 -0
  37. package/_cjs/AnimationFrameAction.cjs.map +1 -0
  38. package/_cjs/AnimationFrameScheduler.cjs +51 -0
  39. package/_cjs/AnimationFrameScheduler.cjs.map +1 -0
  40. package/_cjs/AsyncAction.cjs +116 -0
  41. package/_cjs/AsyncAction.cjs.map +1 -0
  42. package/_cjs/AsyncScheduler.cjs +61 -0
  43. package/_cjs/AsyncScheduler.cjs.map +1 -0
  44. package/_cjs/BehaviorSubject.cjs +52 -0
  45. package/_cjs/BehaviorSubject.cjs.map +1 -0
  46. package/_cjs/Notification.cjs +110 -0
  47. package/_cjs/Notification.cjs.map +1 -0
  48. package/_cjs/Observable/api/connect.cjs +35 -0
  49. package/_cjs/Observable/api/connect.cjs.map +1 -0
  50. package/_cjs/Observable/api/connectable.cjs +64 -0
  51. package/_cjs/Observable/api/connectable.cjs.map +1 -0
  52. package/_cjs/Observable/api/fromCallback.cjs +74 -0
  53. package/_cjs/Observable/api/fromCallback.cjs.map +1 -0
  54. package/_cjs/Observable/api/fromEvent.cjs +22 -0
  55. package/_cjs/Observable/api/fromEvent.cjs.map +1 -0
  56. package/_cjs/Observable/api/index.cjs +188 -0
  57. package/_cjs/Observable/api/index.cjs.map +1 -0
  58. package/_cjs/Observable/api/race.cjs +47 -0
  59. package/_cjs/Observable/api/race.cjs.map +1 -0
  60. package/_cjs/Observable/api/raceWith.cjs +24 -0
  61. package/_cjs/Observable/api/raceWith.cjs.map +1 -0
  62. package/_cjs/Observable/api/repeatWhen.cjs +72 -0
  63. package/_cjs/Observable/api/repeatWhen.cjs.map +1 -0
  64. package/_cjs/Observable/api/retryWhen.cjs +61 -0
  65. package/_cjs/Observable/api/retryWhen.cjs.map +1 -0
  66. package/_cjs/Observable/api/share.cjs +115 -0
  67. package/_cjs/Observable/api/share.cjs.map +1 -0
  68. package/_cjs/Observable/api/window.cjs +53 -0
  69. package/_cjs/Observable/api/window.cjs.map +1 -0
  70. package/_cjs/Observable/api/windowCount.cjs +62 -0
  71. package/_cjs/Observable/api/windowCount.cjs.map +1 -0
  72. package/_cjs/Observable/api/windowTime.cjs +90 -0
  73. package/_cjs/Observable/api/windowTime.cjs.map +1 -0
  74. package/_cjs/Observable/api/windowToggle.cjs +92 -0
  75. package/_cjs/Observable/api/windowToggle.cjs.map +1 -0
  76. package/_cjs/Observable/api/windowWhen.cjs +68 -0
  77. package/_cjs/Observable/api/windowWhen.cjs.map +1 -0
  78. package/_cjs/Observable/api.cjs +2558 -0
  79. package/_cjs/Observable/api.cjs.map +1 -0
  80. package/_cjs/Observable/definition.cjs +76 -0
  81. package/_cjs/Observable/definition.cjs.map +1 -0
  82. package/_cjs/Observable/dom/animationFrames.cjs +51 -0
  83. package/_cjs/Observable/dom/animationFrames.cjs.map +1 -0
  84. package/_cjs/Observable/instances.cjs +6 -0
  85. package/_cjs/Observable/instances.cjs.map +1 -0
  86. package/_cjs/Observable.cjs +253 -0
  87. package/_cjs/Observable.cjs.map +1 -0
  88. package/_cjs/Observer.cjs +6 -0
  89. package/_cjs/Observer.cjs.map +1 -0
  90. package/_cjs/Operator.cjs +83 -0
  91. package/_cjs/Operator.cjs.map +1 -0
  92. package/_cjs/Scheduler.cjs +62 -0
  93. package/_cjs/Scheduler.cjs.map +1 -0
  94. package/_cjs/Subject.cjs +228 -0
  95. package/_cjs/Subject.cjs.map +1 -0
  96. package/_cjs/Subscriber.cjs +172 -0
  97. package/_cjs/Subscriber.cjs.map +1 -0
  98. package/_cjs/Subscription.cjs +174 -0
  99. package/_cjs/Subscription.cjs.map +1 -0
  100. package/_cjs/demo.cjs +40 -0
  101. package/_cjs/demo.cjs.map +1 -0
  102. package/_cjs/global.cjs +4 -0
  103. package/_cjs/global.cjs.map +1 -0
  104. package/_cjs/index.cjs +65 -0
  105. package/_cjs/index.cjs.map +1 -0
  106. package/_cjs/internal/animationFrameProvider.cjs +51 -0
  107. package/_cjs/internal/animationFrameProvider.cjs.map +1 -0
  108. package/_cjs/internal/args.cjs +26 -0
  109. package/_cjs/internal/args.cjs.map +1 -0
  110. package/_cjs/internal/intervalProvider.cjs +27 -0
  111. package/_cjs/internal/intervalProvider.cjs.map +1 -0
  112. package/_cjs/internal/performanceTimestampProvider.cjs +15 -0
  113. package/_cjs/internal/performanceTimestampProvider.cjs.map +1 -0
  114. package/_cjs/internal/timeoutProvider.cjs +27 -0
  115. package/_cjs/internal/timeoutProvider.cjs.map +1 -0
  116. package/_cjs/internal/timestampProvider.cjs +15 -0
  117. package/_cjs/internal/timestampProvider.cjs.map +1 -0
  118. package/_cjs/internal/util.cjs +107 -0
  119. package/_cjs/internal/util.cjs.map +1 -0
  120. package/_mjs/Action.mjs +14 -0
  121. package/_mjs/Action.mjs.map +1 -0
  122. package/_mjs/AnimationFrameAction.mjs +33 -0
  123. package/_mjs/AnimationFrameAction.mjs.map +1 -0
  124. package/_mjs/AnimationFrameScheduler.mjs +36 -0
  125. package/_mjs/AnimationFrameScheduler.mjs.map +1 -0
  126. package/_mjs/AsyncAction.mjs +99 -0
  127. package/_mjs/AsyncAction.mjs.map +1 -0
  128. package/_mjs/AsyncScheduler.mjs +45 -0
  129. package/_mjs/AsyncScheduler.mjs.map +1 -0
  130. package/_mjs/BehaviorSubject.mjs +38 -0
  131. package/_mjs/BehaviorSubject.mjs.map +1 -0
  132. package/_mjs/Notification.mjs +80 -0
  133. package/_mjs/Notification.mjs.map +1 -0
  134. package/_mjs/Observable/api/connect.mjs +21 -0
  135. package/_mjs/Observable/api/connect.mjs.map +1 -0
  136. package/_mjs/Observable/api/connectable.mjs +45 -0
  137. package/_mjs/Observable/api/connectable.mjs.map +1 -0
  138. package/_mjs/Observable/api/fromCallback.mjs +60 -0
  139. package/_mjs/Observable/api/fromCallback.mjs.map +1 -0
  140. package/_mjs/Observable/api/fromEvent.mjs +10 -0
  141. package/_mjs/Observable/api/fromEvent.mjs.map +1 -0
  142. package/_mjs/Observable/api/index.mjs +15 -0
  143. package/_mjs/Observable/api/index.mjs.map +1 -0
  144. package/_mjs/Observable/api/race.mjs +32 -0
  145. package/_mjs/Observable/api/race.mjs.map +1 -0
  146. package/_mjs/Observable/api/raceWith.mjs +12 -0
  147. package/_mjs/Observable/api/raceWith.mjs.map +1 -0
  148. package/_mjs/Observable/api/repeatWhen.mjs +57 -0
  149. package/_mjs/Observable/api/repeatWhen.mjs.map +1 -0
  150. package/_mjs/Observable/api/retryWhen.mjs +45 -0
  151. package/_mjs/Observable/api/retryWhen.mjs.map +1 -0
  152. package/_mjs/Observable/api/share.mjs +97 -0
  153. package/_mjs/Observable/api/share.mjs.map +1 -0
  154. package/_mjs/Observable/api/window.mjs +40 -0
  155. package/_mjs/Observable/api/window.mjs.map +1 -0
  156. package/_mjs/Observable/api/windowCount.mjs +50 -0
  157. package/_mjs/Observable/api/windowCount.mjs.map +1 -0
  158. package/_mjs/Observable/api/windowTime.mjs +73 -0
  159. package/_mjs/Observable/api/windowTime.mjs.map +1 -0
  160. package/_mjs/Observable/api/windowToggle.mjs +77 -0
  161. package/_mjs/Observable/api/windowToggle.mjs.map +1 -0
  162. package/_mjs/Observable/api/windowWhen.mjs +54 -0
  163. package/_mjs/Observable/api/windowWhen.mjs.map +1 -0
  164. package/_mjs/Observable/api.mjs +2291 -0
  165. package/_mjs/Observable/api.mjs.map +1 -0
  166. package/_mjs/Observable/definition.mjs +54 -0
  167. package/_mjs/Observable/definition.mjs.map +1 -0
  168. package/_mjs/Observable/dom/animationFrames.mjs +36 -0
  169. package/_mjs/Observable/dom/animationFrames.mjs.map +1 -0
  170. package/_mjs/Observable/instances.mjs +2 -0
  171. package/_mjs/Observable/instances.mjs.map +1 -0
  172. package/_mjs/Observable.mjs +25 -0
  173. package/_mjs/Observable.mjs.map +1 -0
  174. package/_mjs/Observer.mjs +2 -0
  175. package/_mjs/Observer.mjs.map +1 -0
  176. package/_mjs/Operator.mjs +63 -0
  177. package/_mjs/Operator.mjs.map +1 -0
  178. package/_mjs/Scheduler.mjs +41 -0
  179. package/_mjs/Scheduler.mjs.map +1 -0
  180. package/_mjs/Subject.mjs +204 -0
  181. package/_mjs/Subject.mjs.map +1 -0
  182. package/_mjs/Subscriber.mjs +147 -0
  183. package/_mjs/Subscriber.mjs.map +1 -0
  184. package/_mjs/Subscription.mjs +148 -0
  185. package/_mjs/Subscription.mjs.map +1 -0
  186. package/_mjs/demo.mjs +30 -0
  187. package/_mjs/demo.mjs.map +1 -0
  188. package/_mjs/global.mjs +2 -0
  189. package/_mjs/global.mjs.map +1 -0
  190. package/_mjs/index.mjs +15 -0
  191. package/_mjs/index.mjs.map +1 -0
  192. package/_mjs/internal/animationFrameProvider.mjs +38 -0
  193. package/_mjs/internal/animationFrameProvider.mjs.map +1 -0
  194. package/_mjs/internal/args.mjs +13 -0
  195. package/_mjs/internal/args.mjs.map +1 -0
  196. package/_mjs/internal/intervalProvider.mjs +20 -0
  197. package/_mjs/internal/intervalProvider.mjs.map +1 -0
  198. package/_mjs/internal/performanceTimestampProvider.mjs +8 -0
  199. package/_mjs/internal/performanceTimestampProvider.mjs.map +1 -0
  200. package/_mjs/internal/timeoutProvider.mjs +20 -0
  201. package/_mjs/internal/timeoutProvider.mjs.map +1 -0
  202. package/_mjs/internal/timestampProvider.mjs +8 -0
  203. package/_mjs/internal/timestampProvider.mjs.map +1 -0
  204. package/_mjs/internal/util.mjs +76 -0
  205. package/_mjs/internal/util.mjs.map +1 -0
  206. package/_src/Action.ts +10 -0
  207. package/_src/AnimationFrameAction.ts +27 -0
  208. package/_src/AnimationFrameScheduler.ts +30 -0
  209. package/_src/AsyncAction.ts +93 -0
  210. package/_src/AsyncScheduler.ts +41 -0
  211. package/_src/BehaviorSubject.ts +28 -0
  212. package/_src/Notification.ts +91 -0
  213. package/_src/Observable/api/connect.ts +23 -0
  214. package/_src/Observable/api/connectable.ts +52 -0
  215. package/_src/Observable/api/fromCallback.ts +57 -0
  216. package/_src/Observable/api/fromEvent.ts +12 -0
  217. package/_src/Observable/api/index.ts +14 -0
  218. package/_src/Observable/api/race.ts +31 -0
  219. package/_src/Observable/api/raceWith.ts +15 -0
  220. package/_src/Observable/api/repeatWhen.ts +63 -0
  221. package/_src/Observable/api/retryWhen.ts +47 -0
  222. package/_src/Observable/api/share.ts +107 -0
  223. package/_src/Observable/api/window.ts +44 -0
  224. package/_src/Observable/api/windowCount.ts +56 -0
  225. package/_src/Observable/api/windowTime.ts +102 -0
  226. package/_src/Observable/api/windowToggle.ts +84 -0
  227. package/_src/Observable/api/windowWhen.ts +59 -0
  228. package/_src/Observable/api.ts +2749 -0
  229. package/_src/Observable/definition.ts +69 -0
  230. package/_src/Observable/dom/animationFrames.ts +33 -0
  231. package/_src/Observable/instances.ts +106 -0
  232. package/_src/Observable.ts +27 -0
  233. package/_src/Observer.ts +5 -0
  234. package/_src/Operator.ts +73 -0
  235. package/_src/Scheduler.ts +52 -0
  236. package/_src/Subject.ts +171 -0
  237. package/_src/Subscriber.ts +130 -0
  238. package/_src/Subscription.ts +143 -0
  239. package/_src/demo.ts +29 -0
  240. package/_src/global.ts +141 -0
  241. package/_src/index.ts +14 -0
  242. package/_src/internal/animationFrameProvider.ts +37 -0
  243. package/_src/internal/args.ts +11 -0
  244. package/_src/internal/intervalProvider.ts +27 -0
  245. package/_src/internal/performanceTimestampProvider.ts +12 -0
  246. package/_src/internal/timeoutProvider.ts +27 -0
  247. package/_src/internal/timestampProvider.ts +14 -0
  248. package/_src/internal/util.ts +94 -0
  249. package/demo.d.ts +1 -0
  250. package/global.d.ts +125 -0
  251. package/index.d.ts +14 -0
  252. package/internal/animationFrameProvider.d.ts +12 -0
  253. package/internal/args.d.ts +3 -0
  254. package/internal/intervalProvider.d.ts +12 -0
  255. package/internal/performanceTimestampProvider.d.ts +6 -0
  256. package/internal/timeoutProvider.d.ts +12 -0
  257. package/internal/timestampProvider.d.ts +7 -0
  258. package/internal/util.d.ts +28 -0
  259. package/package.json +16 -0
@@ -0,0 +1,69 @@
1
+ export declare namespace Observable {
2
+ export type TypeOf<X> = X extends ObservableInput<any, infer A> ? A : never;
3
+ export type ErrorOf<X> = X extends ObservableInput<infer E, any> ? E : never;
4
+ }
5
+
6
+ export const ObservableTypeId = Symbol.for("@principia/observable/Observable");
7
+ export type ObservableTypeId = typeof ObservableTypeId;
8
+
9
+ /**
10
+ * @tsplus type fncts.observable.Observable
11
+ * @tsplus companion fncts.observable.ObservableOps
12
+ */
13
+ export class Observable<E, A> implements Subscribable<E, A> {
14
+ readonly _E!: () => E;
15
+ readonly _A!: () => A;
16
+
17
+ readonly [ObservableTypeId]: ObservableTypeId = ObservableTypeId;
18
+
19
+ protected source: Observable<any, any> | undefined;
20
+ protected operator: Operator<E, A> | undefined;
21
+
22
+ constructor(subscribe?: (this: Observable<E, A>, subscriber: Subscriber<E, A>) => Finalizer) {
23
+ if (subscribe) {
24
+ this.subscribeInternal = subscribe;
25
+ }
26
+ }
27
+
28
+ lift<E1, A1>(operator: Operator<E1, A1>): Observable<E1, A1> {
29
+ const observable = new Observable<E1, A1>();
30
+ observable.source = this;
31
+ observable.operator = operator;
32
+ return observable;
33
+ }
34
+
35
+ subscribe(observer?: Partial<Observer<E, A>>): Subscription;
36
+ subscribe(observer?: (value: A) => void): Subscription;
37
+ subscribe(observer?: Partial<Observer<E, A>> | ((value: A) => void)): Subscription {
38
+ const subscriber: Subscriber<E, A> = isSubscriber(observer) ? observer : new SafeSubscriber(observer);
39
+
40
+ subscriber.add(
41
+ this.operator
42
+ ? this.operator.call(subscriber, this.source)
43
+ : this.source
44
+ ? this.subscribeInternal(subscriber)
45
+ : this.trySubscribe(subscriber),
46
+ );
47
+
48
+ return subscriber;
49
+ }
50
+
51
+ protected trySubscribe(subscriber: Subscriber<E, A>): Finalizer {
52
+ try {
53
+ return this.subscribeInternal(subscriber);
54
+ } catch (err) {
55
+ subscriber.error(Cause.halt(err));
56
+ return noop;
57
+ }
58
+ }
59
+
60
+ protected subscribeInternal(subscriber: Subscriber<E, A>): Finalizer {
61
+ this.source?.subscribe(subscriber);
62
+ }
63
+ }
64
+
65
+ export const EMPTY: Observable<never, never> = new Observable((subscriber) => subscriber.complete());
66
+
67
+ export function isObservable(u: unknown): u is Observable<unknown, unknown> {
68
+ return isObject(u) && ObservableTypeId in u;
69
+ }
@@ -0,0 +1,33 @@
1
+ import { animationFrameProvider } from "@fncts/observable/internal/animationFrameProvider";
2
+ import { performanceTimestampProvider } from "@fncts/observable/internal/performanceTimestampProvider";
3
+
4
+ export function animationFrames(
5
+ timestampProvider?: TimestampProvider,
6
+ ): Observable<never, { timestamp: number; elapsed: number }> {
7
+ return timestampProvider ? animationFramesInternal(timestampProvider) : DEFAULT_ANIMATION_FRAMES;
8
+ }
9
+
10
+ function animationFramesInternal(
11
+ timestampProvider?: TimestampProvider,
12
+ ): Observable<never, { timestamp: number; elapsed: number }> {
13
+ const { schedule } = animationFrameProvider;
14
+ return new Observable((subscriber) => {
15
+ const subscription = new Subscription();
16
+ const provider = timestampProvider || performanceTimestampProvider;
17
+ const start = provider.now();
18
+ const run = (timestamp: number) => {
19
+ const now = provider.now();
20
+ subscriber.next({
21
+ timestamp: timestampProvider ? now : timestamp,
22
+ elapsed: now - start,
23
+ });
24
+ if (!subscriber.closed) {
25
+ subscription.add(schedule(run));
26
+ }
27
+ };
28
+ subscription.add(schedule(run));
29
+ return subscription;
30
+ });
31
+ }
32
+
33
+ const DEFAULT_ANIMATION_FRAMES = animationFramesInternal();
@@ -0,0 +1,106 @@
1
+ // import type * as HKT from "@principia/base/HKT";
2
+
3
+ // import * as P from "@principia/base/prelude";
4
+
5
+ // import * as O from "./core.js";
6
+
7
+ // export interface ObservableF extends HKT.HKT {
8
+ // readonly type: O.Observable<this["E"], this["A"]>;
9
+ // readonly index: number;
10
+ // readonly variance: {
11
+ // E: "+";
12
+ // A: "+";
13
+ // };
14
+ // }
15
+
16
+ // export const Functor: P.Functor<ObservableF> = P.Functor({
17
+ // map_: O.map_,
18
+ // });
19
+
20
+ // export const FunctorWithIndex: P.FunctorWithIndex<ObservableF> = P.FunctorWithIndex({
21
+ // imap_: O.mapWithIndex,
22
+ // });
23
+
24
+ // export const SemimonoidalFunctor: P.SemimonoidalFunctor<ObservableF> = P.SemimonoidalFunctor({
25
+ // map_: O.map_,
26
+ // cross_: O.cross_,
27
+ // crossWith_: O.crossWith_,
28
+ // });
29
+
30
+ // export const Apply: P.Apply<ObservableF> = P.Apply({
31
+ // map_: O.map_,
32
+ // cross_: O.cross_,
33
+ // crossWith_: O.crossWith_,
34
+ // ap_: O.ap_,
35
+ // });
36
+
37
+ // export const apS = P.apSF(Apply);
38
+
39
+ // export const apT = P.apTF(Apply);
40
+
41
+ // export const sequenceS = P.sequenceSF(Apply);
42
+
43
+ // export const sequenceT = P.sequenceTF(Apply);
44
+
45
+ // export const MonoidalFunctor: P.MonoidalFunctor<ObservableF> = P.MonoidalFunctor({
46
+ // map_: O.map_,
47
+ // cross_: O.cross_,
48
+ // crossWith_: O.crossWith_,
49
+ // unit: O.unit,
50
+ // });
51
+
52
+ // export const Applicative: P.Applicative<ObservableF> = P.Applicative({
53
+ // map_: O.map_,
54
+ // cross_: O.cross_,
55
+ // crossWith_: O.crossWith_,
56
+ // unit: O.unit,
57
+ // pure: O.pure,
58
+ // });
59
+
60
+ // export const Monad: P.Monad<ObservableF> = P.Monad({
61
+ // map_: O.map_,
62
+ // cross_: O.cross_,
63
+ // crossWith_: O.crossWith_,
64
+ // unit: O.unit,
65
+ // pure: O.pure,
66
+ // chain_: O.concatMap_,
67
+ // flatten: O.flatten,
68
+ // });
69
+
70
+ // const _do = O.pure({});
71
+
72
+ // export { _do as do };
73
+
74
+ // export const chainS_ = P.chainSF_(Monad);
75
+
76
+ // export const chainS = P.chainSF(Monad);
77
+
78
+ // export const pureS_ = P.pureSF_(Monad);
79
+
80
+ // export const pureS = P.pureSF(Monad);
81
+
82
+ // export const MonadSwitch: P.Monad<ObservableF> = P.Monad({
83
+ // map_: O.map_,
84
+ // cross_: O.cross_,
85
+ // crossWith_: O.crossWith_,
86
+ // unit: O.unit,
87
+ // pure: O.pure,
88
+ // chain_: O.switchMap_,
89
+ // flatten: O.switchFlatten,
90
+ // });
91
+
92
+ // export const Filterable: P.Filterable<ObservableF> = P.Filterable({
93
+ // map_: O.map_,
94
+ // filter_: O.filter_,
95
+ // filterMap_: O.filterMap_,
96
+ // partition_: O.partition_,
97
+ // partitionMap_: O.partitionMap_,
98
+ // });
99
+
100
+ // export const FilterableWithIndex: P.FilterableWithIndex<ObservableF> = P.FilterableWithIndex({
101
+ // imap_: O.mapWithIndex,
102
+ // ifilter_: O.ifilter_,
103
+ // ifilterMap_: O.filterMapWithIndex,
104
+ // ipartition_: O.partitionWithIndex,
105
+ // ipartitionMap_: O.partitionMapWithIndex_,
106
+ // });
@@ -0,0 +1,27 @@
1
+ // codegen:start { preset: barrel, include: Observable/*.ts }
2
+ export * from "./Observable/api.js";
3
+ export * from "./Observable/definition.js";
4
+ export * from "./Observable/instances.js";
5
+ // codegen:end
6
+
7
+ // codegen:start { preset: barrel, include: Observable/api/*.ts }
8
+ export * from "./Observable/api/connect.js";
9
+ export * from "./Observable/api/connectable.js";
10
+ export * from "./Observable/api/fromCallback.js";
11
+ export * from "./Observable/api/fromEvent.js";
12
+ export * from "./Observable/api/index.js";
13
+ export * from "./Observable/api/race.js";
14
+ export * from "./Observable/api/raceWith.js";
15
+ export * from "./Observable/api/repeatWhen.js";
16
+ export * from "./Observable/api/retryWhen.js";
17
+ export * from "./Observable/api/share.js";
18
+ export * from "./Observable/api/window.js";
19
+ export * from "./Observable/api/windowCount.js";
20
+ export * from "./Observable/api/windowTime.js";
21
+ export * from "./Observable/api/windowToggle.js";
22
+ export * from "./Observable/api/windowWhen.js";
23
+ // codegen:end
24
+
25
+ // codegen:start { preset: barrel, include: Observable/dom/*.ts }
26
+ export * from "./Observable/dom/animationFrames.js";
27
+ // codegen:end
@@ -0,0 +1,5 @@
1
+ export interface Observer<E, A> {
2
+ next: (value: A) => void;
3
+ error: (err: Cause<E>) => void;
4
+ complete: () => void;
5
+ }
@@ -0,0 +1,73 @@
1
+ export interface Operator<E, A> {
2
+ call(subscriber: Subscriber<E, A>, source: any): Finalizer;
3
+ }
4
+
5
+ export class OperatorSubscriber<E, A> extends Subscriber<E, A> {
6
+ constructor(destination: Subscriber<any, any>, observer: Partial<Observer<E, A>>, private onFinalize?: () => void) {
7
+ super(destination);
8
+ this.next = observer.next
9
+ ? function (this: OperatorSubscriber<E, A>, value: A) {
10
+ try {
11
+ observer.next!(value);
12
+ } catch (err) {
13
+ destination.error(Cause.halt(err));
14
+ }
15
+ }
16
+ : super.next;
17
+ this.error = observer.error
18
+ ? function (this: OperatorSubscriber<E, A>, error: Cause<E>) {
19
+ try {
20
+ observer.error!(error);
21
+ } catch (err) {
22
+ destination.error(Cause.halt(err));
23
+ this.unsubscribe();
24
+ } finally {
25
+ if (error.failureOrCause.isRight()) {
26
+ this.unsubscribe();
27
+ }
28
+ }
29
+ }
30
+ : super.error;
31
+ this.complete = observer.complete
32
+ ? function (this: OperatorSubscriber<E, A>) {
33
+ try {
34
+ observer.complete!();
35
+ } catch (err) {
36
+ destination.error(Cause.halt(err));
37
+ } finally {
38
+ this.unsubscribe();
39
+ }
40
+ }
41
+ : super.complete;
42
+ }
43
+
44
+ unsubscribe() {
45
+ const { closed } = this;
46
+ super.unsubscribe();
47
+ !closed && this.onFinalize?.();
48
+ }
49
+ }
50
+
51
+ export function operatorSubscriber<E, A, E1, A1>(
52
+ destination: Subscriber<E1, A1>,
53
+ observer: Partial<Observer<E, A>>,
54
+ onFinalize?: () => void,
55
+ ): OperatorSubscriber<E, A> {
56
+ return new OperatorSubscriber(destination, observer, onFinalize);
57
+ }
58
+
59
+ /**
60
+ * @tsplus fluent fncts.observable.Observable operate
61
+ */
62
+ export function operate_<E, A, E1, A1>(
63
+ source: Observable<E, A>,
64
+ f: (source: Observable<E, A>, subscriber: Subscriber<E1, A1>) => (() => void) | void,
65
+ ): Observable<E1, A1> {
66
+ return source.lift(function (this: Subscriber<E1, A1>, liftedSource: Observable<E, A>) {
67
+ try {
68
+ f(liftedSource, this);
69
+ } catch (err) {
70
+ this.error(Cause.halt(err));
71
+ }
72
+ });
73
+ }
@@ -0,0 +1,52 @@
1
+ import { dateTimestampProvider } from "@fncts/observable/internal/timestampProvider";
2
+
3
+ export interface SchedulerLike extends TimestampProvider {
4
+ schedule<T>(work: (this: SchedulerAction<T>, state?: T) => void, delay?: number, state?: T): Subscription;
5
+ }
6
+
7
+ export interface SchedulerAction<T> extends Subscription {
8
+ schedule(state?: T, delay?: number): Subscription;
9
+ }
10
+
11
+ /*
12
+ * -------------------------------------------------------------------------------------------------
13
+ * Scheduler
14
+ * -------------------------------------------------------------------------------------------------
15
+ */
16
+
17
+ export const SchedulerTypeId = Symbol.for("fncts.observable.Scheduler");
18
+ export type SchedulerTypeId = typeof SchedulerTypeId;
19
+
20
+ export class Scheduler implements SchedulerLike {
21
+ readonly [SchedulerTypeId]: SchedulerTypeId = SchedulerTypeId;
22
+
23
+ public now: () => number;
24
+ constructor(private actionConstructor: typeof Action, now: () => number = Scheduler.now) {
25
+ this.now = now;
26
+ }
27
+ schedule<T>(work: (this: SchedulerAction<T>, state?: T) => void, delay?: number, state?: T): Subscription {
28
+ return new this.actionConstructor(this, work).schedule(state, delay);
29
+ }
30
+ public static now: () => number = dateTimestampProvider.now;
31
+ }
32
+
33
+ export function isScheduler(u: unknown): u is Scheduler {
34
+ return isObject(u) && SchedulerTypeId in u;
35
+ }
36
+
37
+ export function caughtSchedule<E, A>(
38
+ subscriber: Subscriber<E, A>,
39
+ scheduler: SchedulerLike,
40
+ execute: (this: SchedulerAction<any>) => void,
41
+ delay = 0,
42
+ ): Subscription {
43
+ const subscription = scheduler.schedule(function () {
44
+ try {
45
+ execute.call(this);
46
+ } catch (err) {
47
+ subscriber.error(Cause.halt(err));
48
+ }
49
+ }, delay);
50
+ subscriber.add(subscription);
51
+ return subscription;
52
+ }
@@ -0,0 +1,171 @@
1
+ import { arrayRemove } from "@fncts/observable/internal/util";
2
+
3
+ export interface SubjectLike<E, A> extends Observer<E, A>, Subscribable<E, A> {}
4
+
5
+ export class Subject<E, A> extends Observable<E, A> implements SubscriptionLike {
6
+ closed = false;
7
+ protected observers: Array<Observer<E, A>> = [];
8
+ protected isStopped = false;
9
+ protected hasError = false;
10
+ protected thrownError: Cause<E> = null!;
11
+
12
+ constructor() {
13
+ super();
14
+ }
15
+
16
+ lift<E1, B>(operator: Operator<E1, B>): Observable<E1, B> {
17
+ const subject = new AnonymousSubject(this, this);
18
+ subject.operator = operator as any;
19
+ return subject as any;
20
+ }
21
+
22
+ next(value: A) {
23
+ this.throwIfClosed();
24
+ if (!this.isStopped) {
25
+ const copy = this.observers.slice();
26
+ for (const observer of copy) {
27
+ observer.next(value);
28
+ }
29
+ }
30
+ }
31
+
32
+ error(err: Cause<E>) {
33
+ this.throwIfClosed();
34
+ if (!this.isStopped) {
35
+ this.hasError = this.isStopped = true;
36
+ this.thrownError = err;
37
+ const { observers } = this;
38
+ while (observers.length) {
39
+ observers.shift()!.error(err);
40
+ }
41
+ }
42
+ }
43
+
44
+ complete() {
45
+ this.throwIfClosed();
46
+ if (!this.isStopped) {
47
+ this.isStopped = true;
48
+ const { observers } = this;
49
+ while (observers.length) {
50
+ observers.shift()!.complete();
51
+ }
52
+ }
53
+ }
54
+
55
+ unsubscribe() {
56
+ this.isStopped = this.closed = true;
57
+ this.observers = null!;
58
+ }
59
+
60
+ get observed() {
61
+ return this.observers?.length > 0;
62
+ }
63
+
64
+ protected throwIfClosed() {
65
+ if (this.closed) {
66
+ throw new Error("Object Unsubscribed");
67
+ }
68
+ }
69
+
70
+ protected trySubscribe(subscriber: Subscriber<E, A>): Finalizer {
71
+ this.throwIfClosed();
72
+ return super.trySubscribe(subscriber);
73
+ }
74
+
75
+ protected subscribeInternal(subscriber: Subscriber<E, A>): Subscription {
76
+ this.throwIfClosed();
77
+ this.checkFinalizedStatuses(subscriber);
78
+ return this.innerSubscribe(subscriber);
79
+ }
80
+
81
+ protected innerSubscribe(subscriber: Subscriber<E, A>): Subscription {
82
+ const { hasError, isStopped, observers } = this;
83
+ return hasError || isStopped
84
+ ? Subscription.empty
85
+ : (observers.push(subscriber), new Subscription(() => arrayRemove(observers, subscriber)));
86
+ }
87
+
88
+ protected checkFinalizedStatuses(subscriber: Subscriber<any, any>) {
89
+ const { hasError, thrownError, isStopped } = this;
90
+ if (hasError) {
91
+ subscriber.error(thrownError);
92
+ } else if (isStopped) {
93
+ subscriber.complete();
94
+ }
95
+ }
96
+
97
+ asObservable(): Observable<E, A> {
98
+ const observable: any = new Observable<E, A>();
99
+ observable.source = this;
100
+ return observable;
101
+ }
102
+ }
103
+
104
+ export class AnonymousSubject<E, A> extends Subject<E, A> {
105
+ constructor(protected destination?: Observer<E, A>, source?: Observable<E, A>) {
106
+ super();
107
+ this.source = source;
108
+ }
109
+ next(value: A) {
110
+ this.destination?.next?.(value);
111
+ }
112
+ error(err: Cause<E>) {
113
+ this.destination?.error?.(err);
114
+ }
115
+ complete() {
116
+ this.destination?.complete?.();
117
+ }
118
+
119
+ /** @internal */
120
+ protected subscribeInternal<E, A>(subscriber: Subscriber<E, A>) {
121
+ return this.source?.subscribe(subscriber) ?? Subscription.empty;
122
+ }
123
+ }
124
+
125
+ export class AsyncSubject<E, A> extends Subject<E, A> {
126
+ private value: Either<Cause<E>, A> | null = null;
127
+ private hasValue = false;
128
+ private isComplete = false;
129
+
130
+ /** @internal */
131
+ protected checkFinalizedStatuses(subscriber: Subscriber<E, A>) {
132
+ const { hasError, hasValue, value, thrownError, isStopped, isComplete } = this;
133
+ if (hasError) {
134
+ subscriber.error(thrownError);
135
+ } else if (isStopped || isComplete) {
136
+ hasValue &&
137
+ value!.match(
138
+ (e) => subscriber.error(e),
139
+ (a) => subscriber.next(a),
140
+ );
141
+ subscriber.complete();
142
+ }
143
+ }
144
+
145
+ next(value: A) {
146
+ if (!this.isStopped) {
147
+ this.value = Either.right(value);
148
+ this.hasValue = true;
149
+ }
150
+ }
151
+
152
+ error(err: Cause<E>) {
153
+ if (!this.isStopped) {
154
+ this.value = Either.left(err);
155
+ this.hasValue = true;
156
+ }
157
+ }
158
+
159
+ complete() {
160
+ const { hasValue, value, isComplete } = this;
161
+ if (!isComplete) {
162
+ this.isComplete = true;
163
+ hasValue &&
164
+ value!.match(
165
+ (e) => super.error(e),
166
+ (a) => super.next(a),
167
+ );
168
+ super.complete();
169
+ }
170
+ }
171
+ }
@@ -0,0 +1,130 @@
1
+ export const SubscriberTypeId = Symbol.for("fncts.observable.Subscriber");
2
+ export type SubscriberTypeId = typeof SubscriberTypeId;
3
+
4
+ export class Subscriber<E, A> extends Subscription implements Observer<E, A> {
5
+ readonly [SubscriberTypeId]: SubscriberTypeId = SubscriberTypeId;
6
+
7
+ private isStopped = false;
8
+ protected observer: Subscriber<E, A> | Observer<E, A> | null;
9
+
10
+ constructor(observer?: Subscriber<E, A> | Observer<E, A>) {
11
+ super();
12
+ if (observer) {
13
+ this.observer = observer;
14
+ if (isSubscription(observer)) {
15
+ observer.add(this);
16
+ }
17
+ } else {
18
+ this.observer = EMPTY_OBSERVER;
19
+ }
20
+ }
21
+ next(value: A) {
22
+ if (!this.isStopped) {
23
+ this._next(value);
24
+ }
25
+ }
26
+ error(err: Cause<E>) {
27
+ if (!this.isStopped) {
28
+ this.isStopped = true;
29
+ this._error(err);
30
+ }
31
+ }
32
+ complete() {
33
+ if (!this.isStopped) {
34
+ this.isStopped = true;
35
+ this._complete();
36
+ }
37
+ }
38
+ unsubscribe(): void {
39
+ if (!this.closed) {
40
+ this.isStopped = true;
41
+ super.unsubscribe();
42
+ this.observer = null;
43
+ }
44
+ }
45
+
46
+ _next(value: A) {
47
+ this.observer!.next(value);
48
+ }
49
+
50
+ _error(err: Cause<E>) {
51
+ try {
52
+ this.observer!.error(err);
53
+ } finally {
54
+ this.unsubscribe();
55
+ }
56
+ }
57
+
58
+ _complete() {
59
+ try {
60
+ this.observer!.complete();
61
+ } finally {
62
+ this.unsubscribe();
63
+ }
64
+ }
65
+ }
66
+
67
+ export class SafeSubscriber<E, A> extends Subscriber<E, A> {
68
+ constructor(observer?: Partial<Observer<E, A>> | ((value: A) => void)) {
69
+ super();
70
+ let next: ((value: A) => void) | undefined = undefined;
71
+ let error: ((err: Cause<E>) => void) | undefined = undefined;
72
+ let complete: (() => void) | undefined = undefined;
73
+ if (isFunction(observer)) {
74
+ next = observer;
75
+ } else if (observer) {
76
+ ({ next, error, complete } = observer);
77
+ next = next?.bind(observer);
78
+ error = error?.bind(observer);
79
+ complete = complete?.bind(observer);
80
+ }
81
+ if (error) {
82
+ this.observer = {
83
+ next: next ? wrapDefectHandler(next, error) : noop,
84
+ error: error ? wrapDefectHandler(error, error) : noop,
85
+ complete: complete ? wrapDefectHandler(complete, error) : noop,
86
+ };
87
+ } else {
88
+ this.observer = {
89
+ next: next ? wrapThrowHandler(next) : noop,
90
+ error: wrapThrowHandler(error ?? defaultErrorHandler),
91
+ complete: complete ? wrapThrowHandler(complete) : noop,
92
+ };
93
+ }
94
+ }
95
+ }
96
+
97
+ function wrapDefectHandler<E>(handler: (arg?: any) => void, onDefect: (err: Cause<E>) => void) {
98
+ return (...args: any[]) => {
99
+ try {
100
+ handler(...args);
101
+ } catch (err) {
102
+ onDefect(Cause.halt(err));
103
+ }
104
+ };
105
+ }
106
+
107
+ function wrapThrowHandler(handler: (arg?: any) => void) {
108
+ return (...args: any[]) => {
109
+ try {
110
+ handler(...args);
111
+ } catch (err) {
112
+ reportUnhandledError(err);
113
+ }
114
+ };
115
+ }
116
+
117
+ function defaultErrorHandler(error: any) {
118
+ throw error;
119
+ }
120
+
121
+ export const EMPTY_OBSERVER: Readonly<Observer<any, any>> & { closed: true } = {
122
+ closed: true,
123
+ next: noop,
124
+ error: defaultErrorHandler,
125
+ complete: noop,
126
+ };
127
+
128
+ export function isSubscriber(u: unknown): u is Subscriber<any, any> {
129
+ return isObject(u) && SubscriberTypeId in u;
130
+ }