@fncts/observable 0.0.9 → 0.0.11

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 (221) hide show
  1. package/BehaviorSubject.d.ts +2 -2
  2. package/Notification.d.ts +4 -4
  3. package/Observable/api/connect.d.ts +2 -2
  4. package/Observable/api/connectable.d.ts +2 -2
  5. package/Observable/api/fromEvent.d.ts +4 -0
  6. package/Observable/api/race.d.ts +2 -1
  7. package/Observable/api/raceWith.d.ts +2 -2
  8. package/Observable/api/repeatWhen.d.ts +5 -2
  9. package/Observable/api/retryWhen.d.ts +2 -3
  10. package/Observable/api/share.d.ts +5 -4
  11. package/Observable/api/window.d.ts +2 -2
  12. package/Observable/api/windowCount.d.ts +2 -2
  13. package/Observable/api/windowTime.d.ts +5 -5
  14. package/Observable/api/windowToggle.d.ts +3 -3
  15. package/Observable/api/windowWhen.d.ts +3 -3
  16. package/Observable/api.d.ts +189 -195
  17. package/Observable/definition.d.ts +8 -6
  18. package/ObservableRef/api.d.ts +63 -0
  19. package/ObservableRef/atomic.d.ts +32 -0
  20. package/ObservableRef/definition.d.ts +52 -0
  21. package/Operator.d.ts +2 -2
  22. package/_cjs/Action.cjs +0 -7
  23. package/_cjs/Action.cjs.map +1 -1
  24. package/_cjs/AnimationFrameAction.cjs +0 -12
  25. package/_cjs/AnimationFrameAction.cjs.map +1 -1
  26. package/_cjs/AnimationFrameScheduler.cjs +0 -12
  27. package/_cjs/AnimationFrameScheduler.cjs.map +1 -1
  28. package/_cjs/AsyncAction.cjs +0 -25
  29. package/_cjs/AsyncAction.cjs.map +1 -1
  30. package/_cjs/AsyncScheduler.cjs +2 -16
  31. package/_cjs/AsyncScheduler.cjs.map +1 -1
  32. package/_cjs/BehaviorSubject.cjs +1 -13
  33. package/_cjs/BehaviorSubject.cjs.map +1 -1
  34. package/_cjs/Notification.cjs +21 -40
  35. package/_cjs/Notification.cjs.map +1 -1
  36. package/_cjs/Observable/api/connect.cjs +12 -17
  37. package/_cjs/Observable/api/connect.cjs.map +1 -1
  38. package/_cjs/Observable/api/connectable.cjs +6 -18
  39. package/_cjs/Observable/api/connectable.cjs.map +1 -1
  40. package/_cjs/Observable/api/fromCallback.cjs +0 -15
  41. package/_cjs/Observable/api/fromCallback.cjs.map +1 -1
  42. package/_cjs/Observable/api/fromEvent.cjs +3 -5
  43. package/_cjs/Observable/api/fromEvent.cjs.map +1 -1
  44. package/_cjs/Observable/api/index.cjs +0 -28
  45. package/_cjs/Observable/api/index.cjs.map +1 -1
  46. package/_cjs/Observable/api/race.cjs +2 -12
  47. package/_cjs/Observable/api/race.cjs.map +1 -1
  48. package/_cjs/Observable/api/raceWith.cjs +8 -11
  49. package/_cjs/Observable/api/raceWith.cjs.map +1 -1
  50. package/_cjs/Observable/api/repeatWhen.cjs +44 -55
  51. package/_cjs/Observable/api/repeatWhen.cjs.map +1 -1
  52. package/_cjs/Observable/api/retryWhen.cjs +29 -45
  53. package/_cjs/Observable/api/retryWhen.cjs.map +1 -1
  54. package/_cjs/Observable/api/share.cjs +61 -77
  55. package/_cjs/Observable/api/share.cjs.map +1 -1
  56. package/_cjs/Observable/api/window.cjs +33 -39
  57. package/_cjs/Observable/api/window.cjs.map +1 -1
  58. package/_cjs/Observable/api/windowCount.cjs +40 -48
  59. package/_cjs/Observable/api/windowCount.cjs.map +1 -1
  60. package/_cjs/Observable/api/windowTime.cjs +60 -73
  61. package/_cjs/Observable/api/windowTime.cjs.map +1 -1
  62. package/_cjs/Observable/api/windowToggle.cjs +55 -71
  63. package/_cjs/Observable/api/windowToggle.cjs.map +1 -1
  64. package/_cjs/Observable/api/windowWhen.cjs +42 -52
  65. package/_cjs/Observable/api/windowWhen.cjs.map +1 -1
  66. package/_cjs/Observable/api.cjs +1260 -1485
  67. package/_cjs/Observable/api.cjs.map +1 -1
  68. package/_cjs/Observable/definition.cjs +9 -37
  69. package/_cjs/Observable/definition.cjs.map +1 -1
  70. package/_cjs/Observable/dom/animationFrames.cjs +0 -12
  71. package/_cjs/Observable/dom/animationFrames.cjs.map +1 -1
  72. package/_cjs/Observable.cjs +0 -38
  73. package/_cjs/Observable.cjs.map +1 -1
  74. package/_cjs/ObservableRef/api.cjs +160 -0
  75. package/_cjs/ObservableRef/api.cjs.map +1 -0
  76. package/_cjs/ObservableRef/atomic.cjs +93 -0
  77. package/_cjs/ObservableRef/atomic.cjs.map +1 -0
  78. package/_cjs/ObservableRef/definition.cjs +24 -0
  79. package/_cjs/ObservableRef/definition.cjs.map +1 -0
  80. package/_cjs/Operator.cjs +11 -21
  81. package/_cjs/Operator.cjs.map +1 -1
  82. package/_cjs/Scheduler.cjs +0 -18
  83. package/_cjs/Scheduler.cjs.map +1 -1
  84. package/_cjs/Subject.cjs +3 -50
  85. package/_cjs/Subject.cjs.map +1 -1
  86. package/_cjs/Subscriber.cjs +0 -32
  87. package/_cjs/Subscriber.cjs.map +1 -1
  88. package/_cjs/Subscription.cjs +0 -37
  89. package/_cjs/Subscription.cjs.map +1 -1
  90. package/_cjs/index.cjs +0 -28
  91. package/_cjs/internal/animationFrameProvider.cjs +0 -9
  92. package/_cjs/internal/animationFrameProvider.cjs.map +1 -1
  93. package/_cjs/internal/args.cjs +0 -6
  94. package/_cjs/internal/args.cjs.map +1 -1
  95. package/_cjs/internal/intervalProvider.cjs +0 -2
  96. package/_cjs/internal/intervalProvider.cjs.map +1 -1
  97. package/_cjs/internal/performanceTimestampProvider.cjs +0 -1
  98. package/_cjs/internal/performanceTimestampProvider.cjs.map +1 -1
  99. package/_cjs/internal/timeoutProvider.cjs +0 -2
  100. package/_cjs/internal/timeoutProvider.cjs.map +1 -1
  101. package/_cjs/internal/timestampProvider.cjs +0 -1
  102. package/_cjs/internal/timestampProvider.cjs.map +1 -1
  103. package/_cjs/internal/util.cjs +2 -21
  104. package/_cjs/internal/util.cjs.map +1 -1
  105. package/_mjs/Action.mjs +0 -3
  106. package/_mjs/Action.mjs.map +1 -1
  107. package/_mjs/AnimationFrameAction.mjs +0 -6
  108. package/_mjs/AnimationFrameAction.mjs.map +1 -1
  109. package/_mjs/AnimationFrameScheduler.mjs +0 -7
  110. package/_mjs/AnimationFrameScheduler.mjs.map +1 -1
  111. package/_mjs/AsyncAction.mjs +0 -17
  112. package/_mjs/AsyncAction.mjs.map +1 -1
  113. package/_mjs/AsyncScheduler.mjs +2 -10
  114. package/_mjs/AsyncScheduler.mjs.map +1 -1
  115. package/_mjs/BehaviorSubject.mjs +1 -8
  116. package/_mjs/BehaviorSubject.mjs.map +1 -1
  117. package/_mjs/Notification.mjs +18 -26
  118. package/_mjs/Notification.mjs.map +1 -1
  119. package/_mjs/Observable/api/connect.mjs +12 -11
  120. package/_mjs/Observable/api/connect.mjs.map +1 -1
  121. package/_mjs/Observable/api/connectable.mjs +6 -9
  122. package/_mjs/Observable/api/connectable.mjs.map +1 -1
  123. package/_mjs/Observable/api/fromCallback.mjs +0 -10
  124. package/_mjs/Observable/api/fromCallback.mjs.map +1 -1
  125. package/_mjs/Observable/api/fromEvent.mjs +3 -1
  126. package/_mjs/Observable/api/fromEvent.mjs.map +1 -1
  127. package/_mjs/Observable/api/index.mjs.map +1 -1
  128. package/_mjs/Observable/api/race.mjs +2 -6
  129. package/_mjs/Observable/api/race.mjs.map +1 -1
  130. package/_mjs/Observable/api/raceWith.mjs +7 -6
  131. package/_mjs/Observable/api/raceWith.mjs.map +1 -1
  132. package/_mjs/Observable/api/repeatWhen.mjs +44 -48
  133. package/_mjs/Observable/api/repeatWhen.mjs.map +1 -1
  134. package/_mjs/Observable/api/retryWhen.mjs +29 -37
  135. package/_mjs/Observable/api/retryWhen.mjs.map +1 -1
  136. package/_mjs/Observable/api/share.mjs +60 -70
  137. package/_mjs/Observable/api/share.mjs.map +1 -1
  138. package/_mjs/Observable/api/window.mjs +32 -33
  139. package/_mjs/Observable/api/window.mjs.map +1 -1
  140. package/_mjs/Observable/api/windowCount.mjs +39 -43
  141. package/_mjs/Observable/api/windowCount.mjs.map +1 -1
  142. package/_mjs/Observable/api/windowTime.mjs +59 -63
  143. package/_mjs/Observable/api/windowTime.mjs.map +1 -1
  144. package/_mjs/Observable/api/windowToggle.mjs +54 -62
  145. package/_mjs/Observable/api/windowToggle.mjs.map +1 -1
  146. package/_mjs/Observable/api/windowWhen.mjs +41 -45
  147. package/_mjs/Observable/api/windowWhen.mjs.map +1 -1
  148. package/_mjs/Observable/api.mjs +1186 -1311
  149. package/_mjs/Observable/api.mjs.map +1 -1
  150. package/_mjs/Observable/definition.mjs +9 -24
  151. package/_mjs/Observable/definition.mjs.map +1 -1
  152. package/_mjs/Observable/dom/animationFrames.mjs +0 -5
  153. package/_mjs/Observable/dom/animationFrames.mjs.map +1 -1
  154. package/_mjs/Observable.mjs +4 -4
  155. package/_mjs/Observable.mjs.map +1 -1
  156. package/_mjs/ObservableRef/api.mjs +141 -0
  157. package/_mjs/ObservableRef/api.mjs.map +1 -0
  158. package/_mjs/ObservableRef/atomic.mjs +82 -0
  159. package/_mjs/ObservableRef/atomic.mjs.map +1 -0
  160. package/_mjs/ObservableRef/definition.mjs +16 -0
  161. package/_mjs/ObservableRef/definition.mjs.map +1 -0
  162. package/_mjs/Operator.mjs +11 -12
  163. package/_mjs/Operator.mjs.map +1 -1
  164. package/_mjs/Scheduler.mjs +0 -9
  165. package/_mjs/Scheduler.mjs.map +1 -1
  166. package/_mjs/Subject.mjs +3 -37
  167. package/_mjs/Subject.mjs.map +1 -1
  168. package/_mjs/Subscriber.mjs +0 -20
  169. package/_mjs/Subscriber.mjs.map +1 -1
  170. package/_mjs/Subscription.mjs +0 -26
  171. package/_mjs/Subscription.mjs.map +1 -1
  172. package/_mjs/index.mjs.map +1 -1
  173. package/_mjs/internal/animationFrameProvider.mjs +0 -5
  174. package/_mjs/internal/animationFrameProvider.mjs.map +1 -1
  175. package/_mjs/internal/args.mjs +0 -2
  176. package/_mjs/internal/args.mjs.map +1 -1
  177. package/_mjs/internal/intervalProvider.mjs +0 -2
  178. package/_mjs/internal/intervalProvider.mjs.map +1 -1
  179. package/_mjs/internal/performanceTimestampProvider.mjs +0 -1
  180. package/_mjs/internal/performanceTimestampProvider.mjs.map +1 -1
  181. package/_mjs/internal/timeoutProvider.mjs +0 -2
  182. package/_mjs/internal/timeoutProvider.mjs.map +1 -1
  183. package/_mjs/internal/timestampProvider.mjs +0 -1
  184. package/_mjs/internal/timestampProvider.mjs.map +1 -1
  185. package/_mjs/internal/util.mjs +2 -7
  186. package/_mjs/internal/util.mjs.map +1 -1
  187. package/_src/Action.ts +0 -1
  188. package/_src/AnimationFrameAction.ts +0 -2
  189. package/_src/AnimationFrameScheduler.ts +2 -7
  190. package/_src/BehaviorSubject.ts +3 -3
  191. package/_src/Notification.ts +21 -23
  192. package/_src/Observable/api/connect.ts +12 -9
  193. package/_src/Observable/api/connectable.ts +6 -7
  194. package/_src/Observable/api/fromCallback.ts +0 -1
  195. package/_src/Observable/api/fromEvent.ts +3 -0
  196. package/_src/Observable/api/race.ts +15 -13
  197. package/_src/Observable/api/raceWith.ts +15 -14
  198. package/_src/Observable/api/repeatWhen.ts +51 -56
  199. package/_src/Observable/api/retryWhen.ts +38 -43
  200. package/_src/Observable/api/share.ts +63 -71
  201. package/_src/Observable/api/window.ts +36 -41
  202. package/_src/Observable/api/windowCount.ts +44 -51
  203. package/_src/Observable/api/windowTime.ts +69 -81
  204. package/_src/Observable/api/windowToggle.ts +69 -73
  205. package/_src/Observable/api/windowWhen.ts +49 -55
  206. package/_src/Observable/api.ts +1493 -1498
  207. package/_src/Observable/definition.ts +24 -18
  208. package/_src/Observable/dom/animationFrames.ts +16 -6
  209. package/_src/Observable/instances.ts +0 -23
  210. package/_src/Observable.ts +0 -2
  211. package/_src/ObservableRef/api.ts +169 -0
  212. package/_src/ObservableRef/atomic.ts +85 -0
  213. package/_src/ObservableRef/definition.ts +57 -0
  214. package/_src/Operator.ts +20 -15
  215. package/_src/Scheduler.ts +0 -6
  216. package/_src/Subject.ts +1 -1
  217. package/_src/Subscriber.ts +3 -2
  218. package/_src/global.ts +5 -1
  219. package/_src/internal/util.ts +8 -4
  220. package/global.d.ts +5 -1
  221. package/package.json +2 -2
@@ -60,32 +60,30 @@ export function complete<E = never, A = never>(): Notification<E, A> {
60
60
  }
61
61
 
62
62
  /**
63
- * @tsplus fluent fncts.observable.Notification match
63
+ * @tsplus pipeable fncts.observable.Notification match
64
64
  */
65
- export function match_<E, A, B, C, D, F>(
66
- fa: Notification<E, A>,
67
- onNext: (a: A) => B,
68
- onFail: (e: Cause<E>) => C,
69
- onComplete: () => F,
70
- ): B | C | D | F {
71
- switch (fa._tag) {
72
- case "Next":
73
- return onNext(fa.value);
74
- case "Fail":
75
- return onFail(fa.error);
76
- case "Complete":
77
- return onComplete();
78
- }
65
+ export function match<E, A, B, C, F>(onNext: (a: A) => B, onFail: (e: Cause<E>) => C, onComplete: () => F) {
66
+ return <D>(fa: Notification<E, A>): B | C | D | F => {
67
+ switch (fa._tag) {
68
+ case "Next":
69
+ return onNext(fa.value);
70
+ case "Fail":
71
+ return onFail(fa.error);
72
+ case "Complete":
73
+ return onComplete();
74
+ }
75
+ };
79
76
  }
80
77
 
81
78
  /**
82
- * @tsplus fluent fncts.observable.Notification observe
79
+ * @tsplus pipeable fncts.observable.Notification observe
83
80
  */
84
- export function observe_<E, A>(notification: Notification<E, A>, observer: Partial<Observer<E, A>>): void {
85
- return match_(
86
- notification,
87
- (a) => observer.next?.(a),
88
- (e) => observer.error?.(e),
89
- () => observer.complete?.(),
90
- );
81
+ export function observe<E, A>(observer: Partial<Observer<E, A>>) {
82
+ return (notification: Notification<E, A>): void => {
83
+ return notification.match(
84
+ (a) => observer.next?.(a),
85
+ (e) => observer.error?.(e),
86
+ () => observer.complete?.(),
87
+ );
88
+ };
91
89
  }
@@ -7,17 +7,20 @@ const DEFAULT_CONNECT_CONFIG: ConnectConfig<any, any> = {
7
7
  };
8
8
 
9
9
  /**
10
- * @tsplus fluent fncts.observable.Observable connect
10
+ * @tsplus pipeable fncts.observable.Observable connect
11
11
  */
12
12
  export function connect<R, E, A, R1, E1, B>(
13
- fa: Observable<R, E, A>,
14
13
  selector: (shared: Observable<R, E, A>) => ObservableInput<R1, E1, B>,
15
14
  config: ConnectConfig<E, A> = DEFAULT_CONNECT_CONFIG,
16
- ): Observable<R | R1, E | E1, B> {
17
- const { connector } = config;
18
- return fa.operate((source, subscriber) => {
19
- const subject = connector();
20
- Observable.from(selector(Observable.fromSubscribable(subject))).subscribe(subscriber);
21
- subscriber.add(source.subscribe(subject));
22
- });
15
+ ) {
16
+ return (fa: Observable<R, E, A>): Observable<R | R1, E | E1, B> => {
17
+ const { connector } = config;
18
+ return fa.operate((source, subscriber, environment) => {
19
+ const subject = connector();
20
+ Observable.from(selector(Observable.fromSubscribable(subject)))
21
+ .provideEnvironment(environment)
22
+ .subscribe(subscriber);
23
+ subscriber.add(source.provideEnvironment(environment).subscribe(subject));
24
+ });
25
+ };
23
26
  }
@@ -32,7 +32,7 @@ export class Connectable<R, E, A> extends Observable<R, E, A> implements Connect
32
32
  }
33
33
  connect() {
34
34
  if (!this.connection || this.connection.closed) {
35
- this.connection = Observable.defer(this.source).subscribe(this.subject);
35
+ this.connection = Observable.defer(this.source).provideEnvironment(this.environment).subscribe(this.subject);
36
36
  if (this.resetOnDisconnect) {
37
37
  this.connection.add(() => (this.subject = this.connector()));
38
38
  }
@@ -42,11 +42,10 @@ export class Connectable<R, E, A> extends Observable<R, E, A> implements Connect
42
42
  }
43
43
 
44
44
  /**
45
- * @tsplus fluent fncts.observable.Observable connectable
45
+ * @tsplus pipeable fncts.observable.Observable connectable
46
46
  */
47
- export function connectable<R, E, A>(
48
- source: ObservableInput<R, E, A>,
49
- config: ConnectableConfig<E, A> = DEFAULT_CONFIG,
50
- ): Connectable<R, E, A> {
51
- return new Connectable(source, config);
47
+ export function connectable<E, A>(config: ConnectableConfig<E, A> = DEFAULT_CONFIG) {
48
+ return <R>(source: ObservableInput<R, E, A>): Connectable<R, E, A> => {
49
+ return new Connectable(source, config);
50
+ };
52
51
  }
@@ -51,7 +51,6 @@ function fromCallbackInternal(
51
51
  if (isComplete) {
52
52
  subject.complete();
53
53
  }
54
-
55
54
  isAsync = true;
56
55
  }
57
56
  return subs;
@@ -1,5 +1,8 @@
1
1
  type EventHandler = (...args: any[]) => void;
2
2
 
3
+ /**
4
+ * @tsplus static fncts.observable.ObservableOps fromEvent
5
+ */
3
6
  export function fromEvent<A extends ReadonlyArray<unknown>>(
4
7
  addHandler: (handler: (...args: A) => void) => any,
5
8
  removeHandler?: (handler: EventHandler, signal?: any) => void,
@@ -8,23 +8,25 @@ export function race<O extends ReadonlyArray<ObservableInput<any, any>>>(
8
8
  }
9
9
 
10
10
  export function raceInit<R, E, A>(sources: ReadonlyArray<ObservableInput<R, E, A>>) {
11
- return (subscriber: Subscriber<E, A>) => {
11
+ return (subscriber: Subscriber<E, A>, environment: Environment<R>) => {
12
12
  let subscriptions: Subscription[] = [];
13
13
  for (let i = 0; subscriptions && !subscriber.closed && i < sources.length; i++) {
14
14
  subscriptions.push(
15
- Observable.from(sources[i]!).subscribe(
16
- operatorSubscriber(subscriber, {
17
- next: (value) => {
18
- if (subscriptions) {
19
- for (let s = 0; s < subscriptions.length; s++) {
20
- s !== i && subscriptions[s]!.unsubscribe();
15
+ Observable.from(sources[i]!)
16
+ .provideEnvironment(environment)
17
+ .subscribe(
18
+ operatorSubscriber(subscriber, {
19
+ next: (value) => {
20
+ if (subscriptions) {
21
+ for (let s = 0; s < subscriptions.length; s++) {
22
+ s !== i && subscriptions[s]!.unsubscribe();
23
+ }
24
+ subscriptions = null!;
21
25
  }
22
- subscriptions = null!;
23
- }
24
- subscriber.next(value);
25
- },
26
- }),
27
- ),
26
+ subscriber.next(value);
27
+ },
28
+ }),
29
+ ),
28
30
  );
29
31
  }
30
32
  };
@@ -1,19 +1,20 @@
1
1
  import { raceInit } from "./race.js";
2
2
 
3
3
  /**
4
- * @tsplus fluent fncts.observable.Observablen raceWith
4
+ * @tsplus pipeable fncts.observable.Observablen raceWith
5
5
  */
6
- export function raceWith_<R, E, A, O extends ReadonlyArray<ObservableInput<any, any>>>(
7
- fa: Observable<R, E, A>,
8
- ...sources: O
9
- ): Observable<
10
- R | Observable.EnvironmentOf<O[number]>,
11
- E | Observable.ErrorOf<O[number]>,
12
- A | Observable.TypeOf<O[number]>
13
- > {
14
- return !sources.length
15
- ? fa
16
- : fa.operate((source, subscriber) => {
17
- raceInit([source, ...sources])(subscriber);
18
- });
6
+ export function raceWith<O extends ReadonlyArray<ObservableInput<any, any>>>(...sources: O) {
7
+ return <R, E, A>(
8
+ fa: Observable<R, E, A>,
9
+ ): Observable<
10
+ R | Observable.EnvironmentOf<O[number]>,
11
+ E | Observable.ErrorOf<O[number]>,
12
+ A | Observable.TypeOf<O[number]>
13
+ > => {
14
+ return !sources.length
15
+ ? fa
16
+ : fa.operate((source, subscriber, environment) => {
17
+ raceInit([source, ...sources])(subscriber, environment);
18
+ });
19
+ };
19
20
  }
@@ -1,63 +1,58 @@
1
- export function repeatWhen_<R, E, A, R1, E1>(
2
- fa: Observable<R, E, A>,
1
+ /**
2
+ * @tsplus pipeable fncts.observable.Observable repeatWhen
3
+ */
4
+ export function repeatWhen<R, E, A, R1, E1>(
3
5
  notifier: (notifications: Observable<never, never, void>) => Observable<R1, E1, any>,
4
- ): Observable<R | R1, E | E1, A> {
5
- return fa.operate((source, subscriber) => {
6
- let innerSub: Subscription | null;
7
- let syncResub = false;
8
- let completions$: Subject<never, never, void>;
9
- let isNotifierComplete = false;
10
- let isMainComplete = false;
11
-
12
- const checkComplete = () => isMainComplete && isNotifierComplete && (subscriber.complete(), true);
13
-
14
- const getCompletionSubject = () => {
15
- if (!completions$) {
16
- completions$ = new Subject();
17
- notifier(completions$).subscribe(
6
+ ) {
7
+ return <R, E, A>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, A> => {
8
+ return fa.operate((source, subscriber, environment) => {
9
+ let innerSub: Subscription | null;
10
+ let syncResub = false;
11
+ let completions$: Subject<never, never, void>;
12
+ let isNotifierComplete = false;
13
+ let isMainComplete = false;
14
+ const checkComplete = () => isMainComplete && isNotifierComplete && (subscriber.complete(), true);
15
+ const getCompletionSubject = () => {
16
+ if (!completions$) {
17
+ completions$ = new Subject();
18
+ notifier(completions$)
19
+ .provideEnvironment(environment)
20
+ .subscribe(
21
+ operatorSubscriber(subscriber, {
22
+ next: () => {
23
+ if (innerSub) {
24
+ loop();
25
+ } else {
26
+ syncResub = true;
27
+ }
28
+ },
29
+ complete: () => {
30
+ isNotifierComplete = true;
31
+ checkComplete();
32
+ },
33
+ }),
34
+ );
35
+ }
36
+ return completions$;
37
+ };
38
+ const loop = () => {
39
+ isMainComplete = false;
40
+ innerSub = source.provideEnvironment(environment).subscribe(
18
41
  operatorSubscriber(subscriber, {
19
- next: () => {
20
- if (innerSub) {
21
- loop();
22
- } else {
23
- syncResub = true;
24
- }
25
- },
26
42
  complete: () => {
27
- isNotifierComplete = true;
28
- checkComplete();
43
+ isMainComplete = true;
44
+ !checkComplete() && getCompletionSubject().next();
29
45
  },
30
46
  }),
31
47
  );
32
- }
33
- return completions$;
34
- };
35
-
36
- const loop = () => {
37
- isMainComplete = false;
38
- innerSub = source.subscribe(
39
- operatorSubscriber(subscriber, {
40
- complete: () => {
41
- isMainComplete = true;
42
- !checkComplete() && getCompletionSubject().next();
43
- },
44
- }),
45
- );
46
-
47
- if (syncResub) {
48
- innerSub.unsubscribe();
49
- innerSub = null;
50
- syncResub = false;
51
- loop();
52
- }
53
- };
54
-
55
- loop();
56
- });
57
- }
58
-
59
- export function repeatWhen<R1, E1>(
60
- notifier: (notifications: Observable<never, never, void>) => Observable<R1, E1, any>,
61
- ): <R, E, A>(fa: Observable<R, E, A>) => Observable<R | R1, E | E1, A> {
62
- return (fa) => repeatWhen_(fa, notifier);
48
+ if (syncResub) {
49
+ innerSub.unsubscribe();
50
+ innerSub = null;
51
+ syncResub = false;
52
+ loop();
53
+ }
54
+ };
55
+ loop();
56
+ });
57
+ };
63
58
  }
@@ -1,47 +1,42 @@
1
1
  /**
2
- * @tsplus fluent fncts.observable.Observable retryWhen
2
+ * @tsplus pipeable fncts.observable.Observable retryWhen
3
3
  */
4
- export function retryWhen_<R, E, A, R1, E1>(
5
- fa: Observable<R, E, A>,
4
+ export function retryWhen<E, R1, E1>(
6
5
  notifier: (errors: Observable<never, never, Cause<E>>) => Observable<R1, E1, any>,
7
- ): Observable<R | R1, E | E1, A> {
8
- return operate_(fa, (source, subscriber) => {
9
- let innerSub: Subscription | null;
10
- let syncResub = false;
11
- let defects$: Subject<never, never, any>;
12
-
13
- const loop = () => {
14
- innerSub = source.subscribe(
15
- operatorSubscriber(subscriber, {
16
- error: (err) => {
17
- if (!defects$) {
18
- defects$ = new Subject();
19
- notifier(defects$).subscribe(
20
- operatorSubscriber(subscriber, {
21
- next: () => (innerSub ? loop() : (syncResub = true)),
22
- }),
23
- );
24
- }
25
- if (defects$) {
26
- defects$.next(err);
27
- }
28
- },
29
- }),
30
- );
31
- if (syncResub) {
32
- innerSub.unsubscribe();
33
- innerSub = null;
34
- syncResub = false;
35
- loop();
36
- }
37
- };
38
-
39
- loop();
40
- });
41
- }
42
-
43
- export function retryWhen<R1, E1>(
44
- notifier: (errors: Observable<never, never, any>) => Observable<R1, E1, any>,
45
- ): <R, E, A>(fa: Observable<R, E, A>) => Observable<R | R1, E | E1, A> {
46
- return (fa) => retryWhen_(fa, notifier);
6
+ ) {
7
+ return <R, A>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, A> => {
8
+ return fa.operate((source, subscriber, environment) => {
9
+ let innerSub: Subscription | null;
10
+ let syncResub = false;
11
+ let defects$: Subject<never, never, any>;
12
+ const loop = () => {
13
+ innerSub = source.provideEnvironment(environment).subscribe(
14
+ operatorSubscriber(subscriber, {
15
+ error: (err) => {
16
+ if (!defects$) {
17
+ defects$ = new Subject();
18
+ notifier(defects$)
19
+ .provideEnvironment(environment)
20
+ .subscribe(
21
+ operatorSubscriber(subscriber, {
22
+ next: () => (innerSub ? loop() : (syncResub = true)),
23
+ }),
24
+ );
25
+ }
26
+ if (defects$) {
27
+ defects$.next(err);
28
+ }
29
+ },
30
+ }),
31
+ );
32
+ if (syncResub) {
33
+ innerSub.unsubscribe();
34
+ innerSub = null;
35
+ syncResub = false;
36
+ loop();
37
+ }
38
+ };
39
+ loop();
40
+ });
41
+ };
47
42
  }
@@ -1,101 +1,93 @@
1
1
  export interface ShareConfig<R, E, A, R1 = never, E1 = never, R2 = never, E2 = never, R3 = never, E3 = never> {
2
- readonly connector?: () => SubjectLike<E, A>;
2
+ readonly connector?: () => Subject<R, E, A>;
3
3
  readonly resetOnDefect?: boolean | ((err: unknown) => Observable<R1, E1, any>);
4
4
  readonly resetOnComplete?: boolean | (() => Observable<R2, E2, any>);
5
5
  readonly resetOnRefCountZero?: boolean | (() => Observable<R3, E3, any>);
6
6
  }
7
7
 
8
8
  /**
9
- * @tsplus fluent fncts.observable.Observable share
9
+ * @tsplus pipeable fncts.observable.Observable share
10
10
  */
11
- export function share_<R, E, A, R1 = never, E1 = never, R2 = never, E2 = never, R3 = never, E3 = never>(
12
- fa: Observable<R, E, A>,
11
+ export function share<R, E, A, R1 = never, E1 = never, R2 = never, E2 = never, R3 = never, E3 = never>(
13
12
  options: ShareConfig<R, E, A, R1, E1, R2, E2, R3, E3> = {},
14
- ): Observable<R | R1 | R2, E | E1 | E2 | E3, A> {
15
- const {
16
- connector = () => new Subject<R, E, A>(),
17
- resetOnDefect = true,
18
- resetOnComplete = true,
19
- resetOnRefCountZero = true,
20
- } = options;
21
-
22
- let connection: SafeSubscriber<E, A> | null = null;
23
- let resetConnection: Subscription | null = null;
24
- let subject: SubjectLike<E, A> | null = null;
25
- let refCount = 0;
26
- let hasCompleted = false;
27
- let hasErrored = false;
28
-
29
- const cancelReset = () => {
30
- resetConnection?.unsubscribe();
31
- resetConnection = null;
32
- };
33
-
34
- const reset = () => {
35
- cancelReset();
36
- connection = subject = null;
37
- hasCompleted = hasErrored = false;
38
- };
39
-
40
- const resetAndUnsubscribe = () => {
41
- const conn = connection;
42
- reset();
43
- conn?.unsubscribe();
44
- };
45
-
46
- return operate_(fa, (source, subscriber) => {
47
- refCount++;
48
- if (!hasErrored && !hasCompleted) {
13
+ ) {
14
+ return (fa: Observable<R, E, A>): Observable<R | R1 | R2, E | E1 | E2 | E3, A> => {
15
+ const {
16
+ connector = () => new Subject<R, E, A>(),
17
+ resetOnDefect = true,
18
+ resetOnComplete = true,
19
+ resetOnRefCountZero = true,
20
+ } = options;
21
+ let connection: SafeSubscriber<E, A> | null = null;
22
+ let resetConnection: Subscription | null = null;
23
+ let subject: Subject<R, E, A> | null = null;
24
+ let refCount = 0;
25
+ let hasCompleted = false;
26
+ let hasErrored = false;
27
+ const cancelReset = () => {
28
+ resetConnection?.unsubscribe();
29
+ resetConnection = null;
30
+ };
31
+ const reset = () => {
49
32
  cancelReset();
50
- }
51
-
52
- const dest = (subject ||= connector());
53
-
54
- subscriber.add(() => {
55
- refCount--;
56
- if (refCount === 0 && !hasErrored && !hasCompleted) {
57
- resetConnection = handleReset(resetAndUnsubscribe, resetOnRefCountZero);
33
+ connection = subject = null;
34
+ hasCompleted = hasErrored = false;
35
+ };
36
+ const resetAndUnsubscribe = () => {
37
+ const conn = connection;
38
+ reset();
39
+ conn?.unsubscribe();
40
+ };
41
+ return fa.operate((source, subscriber, environment) => {
42
+ refCount++;
43
+ if (!hasErrored && !hasCompleted) {
44
+ cancelReset();
58
45
  }
59
- });
60
-
61
- dest.subscribe(subscriber);
62
-
63
- if (!connection) {
64
- connection = new SafeSubscriber({
65
- next: (value) => dest.next(value),
66
- error: (defect) => {
67
- hasErrored = true;
68
- cancelReset();
69
- resetConnection = handleReset(reset, resetOnDefect, defect);
70
- dest.error(defect);
71
- },
72
- complete: () => {
73
- hasCompleted = true;
74
- cancelReset();
75
- resetConnection = handleReset(reset, resetOnComplete);
76
- dest.complete();
77
- },
46
+ const dest = (subject ||= connector());
47
+ subscriber.add(() => {
48
+ refCount--;
49
+ if (refCount === 0 && !hasErrored && !hasCompleted) {
50
+ resetConnection = handleReset(resetAndUnsubscribe, resetOnRefCountZero, environment);
51
+ }
78
52
  });
79
- Observable.from(source).subscribe(connection);
80
- }
81
- });
53
+ dest.provideEnvironment(environment).subscribe(subscriber);
54
+ if (!connection) {
55
+ connection = new SafeSubscriber({
56
+ next: (value) => dest.next(value),
57
+ error: (defect) => {
58
+ hasErrored = true;
59
+ cancelReset();
60
+ resetConnection = handleReset(reset, resetOnDefect, environment, defect);
61
+ dest.error(defect);
62
+ },
63
+ complete: () => {
64
+ hasCompleted = true;
65
+ cancelReset();
66
+ resetConnection = handleReset(reset, resetOnComplete, environment);
67
+ dest.complete();
68
+ },
69
+ });
70
+ Observable.from(source).provideEnvironment(environment).subscribe(connection);
71
+ }
72
+ });
73
+ };
82
74
  }
83
75
 
84
76
  function handleReset<T extends unknown[] = never[]>(
85
77
  reset: () => void,
86
78
  on: boolean | ((...args: T) => Observable<any, any, any>),
79
+ environment: Environment<any>,
87
80
  ...args: T
88
81
  ): Subscription | null {
89
82
  if (on === true) {
90
83
  reset();
91
84
  return null;
92
85
  }
93
-
94
86
  if (on === false) {
95
87
  return null;
96
88
  }
97
-
98
89
  return on(...args)
99
90
  .take(1)
91
+ .provideEnvironment(environment)
100
92
  .subscribe({ next: () => reset() });
101
93
  }
@@ -1,44 +1,39 @@
1
1
  /**
2
- * @tsplus fluent fncts.observable.Observable window
2
+ * @tsplus pipeable fncts.observable.Observable window
3
3
  */
4
- export function window_<R, E, A>(
5
- fa: Observable<R, E, A>,
6
- windowBoundaries: Observable<never, never, any>,
7
- ): Observable<R, E, Observable<never, E, A>> {
8
- return operate_(fa, (source, subscriber) => {
9
- let windowSubject: Subject<never, E, A> = new Subject();
10
- subscriber.next(windowSubject.asObservable());
11
-
12
- const errorHandler = (err: Cause<E>) => {
13
- windowSubject.error(err);
14
- subscriber.error(err);
15
- };
16
-
17
- source.subscribe(
18
- operatorSubscriber(subscriber, {
19
- next: (value) => windowSubject.next(value),
20
- error: errorHandler,
21
- complete: () => {
22
- windowSubject.complete();
23
- subscriber.complete();
24
- },
25
- }),
26
- );
27
-
28
- windowBoundaries.subscribe(
29
- operatorSubscriber(subscriber, {
30
- next: () => {
31
- windowSubject.complete();
32
- subscriber.next((windowSubject = new Subject()));
33
- },
34
- complete: noop,
35
- error: errorHandler,
36
- }),
37
- );
38
-
39
- return () => {
40
- windowSubject.unsubscribe();
41
- windowSubject = null!;
42
- };
43
- });
4
+ export function window(windowBoundaries: Observable<never, never, any>) {
5
+ return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, Observable<never, E, A>> => {
6
+ return fa.operate((source, subscriber, environment) => {
7
+ let windowSubject: Subject<never, E, A> = new Subject();
8
+ subscriber.next(windowSubject.asObservable());
9
+ const errorHandler = (err: Cause<E>) => {
10
+ windowSubject.error(err);
11
+ subscriber.error(err);
12
+ };
13
+ source.provideEnvironment(environment).subscribe(
14
+ operatorSubscriber(subscriber, {
15
+ next: (value) => windowSubject.next(value),
16
+ error: errorHandler,
17
+ complete: () => {
18
+ windowSubject.complete();
19
+ subscriber.complete();
20
+ },
21
+ }),
22
+ );
23
+ windowBoundaries.subscribe(
24
+ operatorSubscriber(subscriber, {
25
+ next: () => {
26
+ windowSubject.complete();
27
+ subscriber.next((windowSubject = new Subject()));
28
+ },
29
+ complete: noop,
30
+ error: errorHandler,
31
+ }),
32
+ );
33
+ return () => {
34
+ windowSubject.unsubscribe();
35
+ windowSubject = null!;
36
+ };
37
+ });
38
+ };
44
39
  }