@fncts/observable 0.0.8 → 0.0.10

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 (146) 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 +188 -194
  17. package/Observable/definition.d.ts +8 -6
  18. package/Operator.d.ts +2 -2
  19. package/_cjs/Action.cjs.map +1 -1
  20. package/_cjs/AnimationFrameAction.cjs.map +1 -1
  21. package/_cjs/AnimationFrameScheduler.cjs +0 -1
  22. package/_cjs/AnimationFrameScheduler.cjs.map +1 -1
  23. package/_cjs/BehaviorSubject.cjs +1 -1
  24. package/_cjs/BehaviorSubject.cjs.map +1 -1
  25. package/_cjs/Notification.cjs +21 -17
  26. package/_cjs/Notification.cjs.map +1 -1
  27. package/_cjs/Observable/api/connect.cjs +12 -10
  28. package/_cjs/Observable/api/connect.cjs.map +1 -1
  29. package/_cjs/Observable/api/connectable.cjs +6 -4
  30. package/_cjs/Observable/api/connectable.cjs.map +1 -1
  31. package/_cjs/Observable/api/fromCallback.cjs.map +1 -1
  32. package/_cjs/Observable/api/fromEvent.cjs +3 -0
  33. package/_cjs/Observable/api/fromEvent.cjs.map +1 -1
  34. package/_cjs/Observable/api/race.cjs +2 -2
  35. package/_cjs/Observable/api/race.cjs.map +1 -1
  36. package/_cjs/Observable/api/raceWith.cjs +8 -6
  37. package/_cjs/Observable/api/raceWith.cjs.map +1 -1
  38. package/_cjs/Observable/api/repeatWhen.cjs +46 -46
  39. package/_cjs/Observable/api/repeatWhen.cjs.map +1 -1
  40. package/_cjs/Observable/api/retryWhen.cjs +31 -38
  41. package/_cjs/Observable/api/retryWhen.cjs.map +1 -1
  42. package/_cjs/Observable/api/share.cjs +66 -64
  43. package/_cjs/Observable/api/share.cjs.map +1 -1
  44. package/_cjs/Observable/api/window.cjs +35 -33
  45. package/_cjs/Observable/api/window.cjs.map +1 -1
  46. package/_cjs/Observable/api/windowCount.cjs +41 -39
  47. package/_cjs/Observable/api/windowCount.cjs.map +1 -1
  48. package/_cjs/Observable/api/windowTime.cjs +66 -64
  49. package/_cjs/Observable/api/windowTime.cjs.map +1 -1
  50. package/_cjs/Observable/api/windowToggle.cjs +63 -61
  51. package/_cjs/Observable/api/windowToggle.cjs.map +1 -1
  52. package/_cjs/Observable/api/windowWhen.cjs +43 -41
  53. package/_cjs/Observable/api/windowWhen.cjs.map +1 -1
  54. package/_cjs/Observable/api.cjs +1270 -1105
  55. package/_cjs/Observable/api.cjs.map +1 -1
  56. package/_cjs/Observable/definition.cjs +9 -8
  57. package/_cjs/Observable/definition.cjs.map +1 -1
  58. package/_cjs/Observable/dom/animationFrames.cjs.map +1 -1
  59. package/_cjs/Observable.cjs.map +1 -1
  60. package/_cjs/Operator.cjs +11 -9
  61. package/_cjs/Operator.cjs.map +1 -1
  62. package/_cjs/Scheduler.cjs +0 -5
  63. package/_cjs/Scheduler.cjs.map +1 -1
  64. package/_cjs/Subject.cjs +3 -3
  65. package/_cjs/Subject.cjs.map +1 -1
  66. package/_cjs/Subscriber.cjs.map +1 -1
  67. package/_cjs/internal/util.cjs.map +1 -1
  68. package/_mjs/Action.mjs.map +1 -1
  69. package/_mjs/AnimationFrameAction.mjs.map +1 -1
  70. package/_mjs/AnimationFrameScheduler.mjs +0 -2
  71. package/_mjs/AnimationFrameScheduler.mjs.map +1 -1
  72. package/_mjs/BehaviorSubject.mjs +1 -1
  73. package/_mjs/BehaviorSubject.mjs.map +1 -1
  74. package/_mjs/Notification.mjs +18 -14
  75. package/_mjs/Notification.mjs.map +1 -1
  76. package/_mjs/Observable/api/connect.mjs +12 -10
  77. package/_mjs/Observable/api/connect.mjs.map +1 -1
  78. package/_mjs/Observable/api/connectable.mjs +6 -4
  79. package/_mjs/Observable/api/connectable.mjs.map +1 -1
  80. package/_mjs/Observable/api/fromCallback.mjs.map +1 -1
  81. package/_mjs/Observable/api/fromEvent.mjs +4 -0
  82. package/_mjs/Observable/api/fromEvent.mjs.map +1 -1
  83. package/_mjs/Observable/api/race.mjs +2 -2
  84. package/_mjs/Observable/api/race.mjs.map +1 -1
  85. package/_mjs/Observable/api/raceWith.mjs +7 -5
  86. package/_mjs/Observable/api/raceWith.mjs.map +1 -1
  87. package/_mjs/Observable/api/repeatWhen.mjs +47 -44
  88. package/_mjs/Observable/api/repeatWhen.mjs.map +1 -1
  89. package/_mjs/Observable/api/retryWhen.mjs +30 -33
  90. package/_mjs/Observable/api/retryWhen.mjs.map +1 -1
  91. package/_mjs/Observable/api/share.mjs +63 -61
  92. package/_mjs/Observable/api/share.mjs.map +1 -1
  93. package/_mjs/Observable/api/window.mjs +32 -30
  94. package/_mjs/Observable/api/window.mjs.map +1 -1
  95. package/_mjs/Observable/api/windowCount.mjs +40 -38
  96. package/_mjs/Observable/api/windowCount.mjs.map +1 -1
  97. package/_mjs/Observable/api/windowTime.mjs +60 -58
  98. package/_mjs/Observable/api/windowTime.mjs.map +1 -1
  99. package/_mjs/Observable/api/windowToggle.mjs +56 -54
  100. package/_mjs/Observable/api/windowToggle.mjs.map +1 -1
  101. package/_mjs/Observable/api/windowWhen.mjs +42 -40
  102. package/_mjs/Observable/api/windowWhen.mjs.map +1 -1
  103. package/_mjs/Observable/api.mjs +1198 -1031
  104. package/_mjs/Observable/api.mjs.map +1 -1
  105. package/_mjs/Observable/definition.mjs +9 -8
  106. package/_mjs/Observable/definition.mjs.map +1 -1
  107. package/_mjs/Observable/dom/animationFrames.mjs.map +1 -1
  108. package/_mjs/Observable.mjs.map +1 -1
  109. package/_mjs/Operator.mjs +11 -9
  110. package/_mjs/Operator.mjs.map +1 -1
  111. package/_mjs/Scheduler.mjs +0 -6
  112. package/_mjs/Scheduler.mjs.map +1 -1
  113. package/_mjs/Subject.mjs +3 -3
  114. package/_mjs/Subject.mjs.map +1 -1
  115. package/_mjs/Subscriber.mjs.map +1 -1
  116. package/_mjs/internal/util.mjs.map +1 -1
  117. package/_src/Action.ts +0 -1
  118. package/_src/AnimationFrameAction.ts +0 -2
  119. package/_src/AnimationFrameScheduler.ts +2 -7
  120. package/_src/BehaviorSubject.ts +3 -3
  121. package/_src/Notification.ts +21 -23
  122. package/_src/Observable/api/connect.ts +12 -9
  123. package/_src/Observable/api/connectable.ts +6 -7
  124. package/_src/Observable/api/fromCallback.ts +0 -1
  125. package/_src/Observable/api/fromEvent.ts +3 -0
  126. package/_src/Observable/api/race.ts +15 -13
  127. package/_src/Observable/api/raceWith.ts +15 -14
  128. package/_src/Observable/api/repeatWhen.ts +51 -56
  129. package/_src/Observable/api/retryWhen.ts +38 -43
  130. package/_src/Observable/api/share.ts +63 -71
  131. package/_src/Observable/api/window.ts +36 -41
  132. package/_src/Observable/api/windowCount.ts +44 -51
  133. package/_src/Observable/api/windowTime.ts +69 -81
  134. package/_src/Observable/api/windowToggle.ts +69 -73
  135. package/_src/Observable/api/windowWhen.ts +49 -55
  136. package/_src/Observable/api.ts +1489 -1495
  137. package/_src/Observable/definition.ts +24 -18
  138. package/_src/Observable/dom/animationFrames.ts +16 -6
  139. package/_src/Observable/instances.ts +0 -23
  140. package/_src/Observable.ts +0 -2
  141. package/_src/Operator.ts +20 -15
  142. package/_src/Scheduler.ts +0 -6
  143. package/_src/Subject.ts +1 -1
  144. package/_src/Subscriber.ts +3 -2
  145. package/_src/internal/util.ts +8 -4
  146. package/package.json +2 -2
@@ -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
  }
@@ -1,56 +1,49 @@
1
1
  /**
2
- * @tsplus fluent fncts.observable.Observable windowCount
2
+ * @tsplus pipeable fncts.observable.Observable windowCount
3
3
  */
4
- export function windowCount_<R, E, A>(
5
- fa: Observable<R, E, A>,
6
- windowSize: number,
7
- startWindowEvery = 0,
8
- ): Observable<R, E, Observable<never, E, A>> {
9
- const startEvery = startWindowEvery > 0 ? startWindowEvery : windowSize;
10
-
11
- return operate_(fa, (source, subscriber) => {
12
- let windows = [new Subject<never, E, A>()];
13
- let count = 0;
14
-
15
- subscriber.next(windows[0]!.asObservable());
16
-
17
- source.subscribe(
18
- operatorSubscriber(
19
- subscriber,
20
- {
21
- next: (value) => {
22
- for (const window of windows) {
23
- window.next(value);
24
- }
25
-
26
- const c = count - windowSize + 1;
27
- if (c >= 0 && c % startEvery === 0) {
28
- windows.shift()!.complete();
29
- }
30
-
31
- if (++count && startEvery === 0) {
32
- const window = new Subject<never, E, A>();
33
- windows.push(window);
34
- subscriber.next(window.asObservable());
35
- }
4
+ export function windowCount(windowSize: number, startWindowEvery = 0) {
5
+ return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, Observable<never, E, A>> => {
6
+ const startEvery = startWindowEvery > 0 ? startWindowEvery : windowSize;
7
+ return fa.operate((source, subscriber, environment) => {
8
+ let windows = [new Subject<never, E, A>()];
9
+ let count = 0;
10
+ subscriber.next(windows[0]!.asObservable());
11
+ source.provideEnvironment(environment).subscribe(
12
+ operatorSubscriber(
13
+ subscriber,
14
+ {
15
+ next: (value) => {
16
+ for (const window of windows) {
17
+ window.next(value);
18
+ }
19
+ const c = count - windowSize + 1;
20
+ if (c >= 0 && c % startEvery === 0) {
21
+ windows.shift()!.complete();
22
+ }
23
+ if (++count && startEvery === 0) {
24
+ const window = new Subject<never, E, A>();
25
+ windows.push(window);
26
+ subscriber.next(window.asObservable());
27
+ }
28
+ },
29
+ complete: () => {
30
+ while (windows.length > 0) {
31
+ windows.shift()!.complete();
32
+ }
33
+ subscriber.complete();
34
+ },
35
+ error: (err) => {
36
+ while (windows.length > 0) {
37
+ windows.shift()!.error(err);
38
+ }
39
+ subscriber.error(err);
40
+ },
36
41
  },
37
- complete: () => {
38
- while (windows.length > 0) {
39
- windows.shift()!.complete();
40
- }
41
- subscriber.complete();
42
+ () => {
43
+ windows = null!;
42
44
  },
43
- error: (err) => {
44
- while (windows.length > 0) {
45
- windows.shift()!.error(err);
46
- }
47
- subscriber.error(err);
48
- },
49
- },
50
- () => {
51
- windows = null!;
52
- },
53
- ),
54
- );
55
- });
45
+ ),
46
+ );
47
+ });
48
+ };
56
49
  }
@@ -8,95 +8,83 @@ interface WindowRecord<R, E, A> {
8
8
  }
9
9
 
10
10
  /**
11
- * @tsplus fluent fncts.observable.Observable windowTime
11
+ * @tsplus pipeable fncts.observable.Observable windowTime
12
12
  */
13
- export function windowTime_<R, E, A>(
14
- fa: Observable<R, E, A>,
13
+ export function windowTime(
15
14
  windowTimeSpan: number,
16
15
  scheduler?: SchedulerLike,
17
- ): Observable<R, E, Observable<never, E, A>>;
18
- export function windowTime_<R, E, A>(
19
- fa: Observable<R, E, A>,
16
+ ): <R, E, A>(fa: Observable<R, E, A>) => Observable<R, E, Observable<never, E, A>>;
17
+ export function windowTime(
20
18
  windowTimeSpan: number,
21
19
  windowCreationInterval: number,
22
20
  scheduler?: SchedulerLike,
23
- ): Observable<R, E, Observable<never, E, A>>;
24
- export function windowTime_<R, E, A>(
25
- fa: Observable<R, E, A>,
21
+ ): <R, E, A>(fa: Observable<R, E, A>) => Observable<R, E, Observable<never, E, A>>;
22
+ export function windowTime(
26
23
  windowTimeSpan: number,
27
24
  windowCreationInterval: number,
28
25
  maxWindowSize: number,
29
26
  scheduler?: SchedulerLike,
30
- ): Observable<R, E, Observable<never, E, A>>;
31
- export function windowTime_<R, E, A>(
32
- fa: Observable<R, E, A>,
33
- windowTimeSpan: number,
34
- ...args: any[]
35
- ): Observable<R, E, Observable<never, E, A>> {
36
- const scheduler = popScheduler(args) ?? asyncScheduler;
37
- const windowCreationInterval: number | null = args[0] ?? null;
38
- const maxWindowSize: number = args[1] || Infinity;
39
-
40
- return operate_(fa, (source, subscriber) => {
41
- let windowRecords: WindowRecord<never, E, A>[] | null = [];
42
- let restartOnClose = false;
43
- const closeWindow = (record: { window: Subject<never, E, A>; subs: Subscription }) => {
44
- const { window, subs } = record;
45
- window.complete();
46
- subs.unsubscribe();
47
- arrayRemove(windowRecords, record);
48
- restartOnClose && startWindow();
49
- };
50
- const startWindow = () => {
51
- if (windowRecords) {
52
- const subs = new Subscription();
53
- subscriber.add(subs);
54
- const window = new Subject<never, E, A>();
55
- const record = {
56
- window,
57
- subs,
58
- seen: 0,
59
- };
60
- windowRecords.push(record);
61
- subscriber.next(window.asObservable());
62
- subs.add(scheduler.schedule(() => closeWindow(record), windowTimeSpan));
63
- }
64
- };
65
-
66
- windowCreationInterval !== null && windowCreationInterval >= 0
67
- ? subscriber.add(
68
- scheduler.schedule(function () {
69
- startWindow();
70
- !this.closed && subscriber.add(this.schedule(null, windowCreationInterval));
71
- }, windowCreationInterval),
72
- )
73
- : (restartOnClose = true);
74
-
75
- startWindow();
76
-
77
- const loop = (cb: (record: WindowRecord<never, E, A>) => void) => windowRecords!.slice().forEach(cb);
78
-
79
- const terminate = (cb: (consumer: Observer<E, any>) => void) => {
80
- loop(({ window }) => cb(window));
81
- cb(subscriber);
82
- subscriber.unsubscribe();
83
- };
84
-
85
- source.subscribe(
86
- operatorSubscriber(subscriber, {
87
- next: (value) => {
88
- loop((record) => {
89
- record.window.next(value);
90
- maxWindowSize <= ++record.seen && closeWindow(record);
91
- });
92
- },
93
- error: (err) => terminate((consumer) => consumer.error(err)),
94
- complete: () => terminate((consumer) => consumer.complete()),
95
- }),
96
- );
97
-
98
- return () => {
99
- windowRecords = null!;
100
- };
101
- });
27
+ ): <R, E, A>(fa: Observable<R, E, A>) => Observable<R, E, Observable<never, E, A>>;
28
+ export function windowTime(windowTimeSpan: number, ...args: any[]) {
29
+ return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, Observable<never, E, A>> => {
30
+ const scheduler = popScheduler(args) ?? asyncScheduler;
31
+ const windowCreationInterval: number | null = args[0] ?? null;
32
+ const maxWindowSize: number = args[1] || Infinity;
33
+ return fa.operate((source, subscriber, environment) => {
34
+ let windowRecords: WindowRecord<never, E, A>[] | null = [];
35
+ let restartOnClose = false;
36
+ const closeWindow = (record: { window: Subject<never, E, A>; subs: Subscription }) => {
37
+ const { window, subs } = record;
38
+ window.complete();
39
+ subs.unsubscribe();
40
+ arrayRemove(windowRecords, record);
41
+ restartOnClose && startWindow();
42
+ };
43
+ const startWindow = () => {
44
+ if (windowRecords) {
45
+ const subs = new Subscription();
46
+ subscriber.add(subs);
47
+ const window = new Subject<never, E, A>();
48
+ const record = {
49
+ window,
50
+ subs,
51
+ seen: 0,
52
+ };
53
+ windowRecords.push(record);
54
+ subscriber.next(window.asObservable());
55
+ subs.add(scheduler.schedule(() => closeWindow(record), windowTimeSpan));
56
+ }
57
+ };
58
+ windowCreationInterval !== null && windowCreationInterval >= 0
59
+ ? subscriber.add(
60
+ scheduler.schedule(function () {
61
+ startWindow();
62
+ !this.closed && subscriber.add(this.schedule(null, windowCreationInterval));
63
+ }, windowCreationInterval),
64
+ )
65
+ : (restartOnClose = true);
66
+ startWindow();
67
+ const loop = (cb: (record: WindowRecord<never, E, A>) => void) => windowRecords!.slice().forEach(cb);
68
+ const terminate = (cb: (consumer: Observer<E, any>) => void) => {
69
+ loop(({ window }) => cb(window));
70
+ cb(subscriber);
71
+ subscriber.unsubscribe();
72
+ };
73
+ source.provideEnvironment(environment).subscribe(
74
+ operatorSubscriber(subscriber, {
75
+ next: (value) => {
76
+ loop((record) => {
77
+ record.window.next(value);
78
+ maxWindowSize <= ++record.seen && closeWindow(record);
79
+ });
80
+ },
81
+ error: (err) => terminate((consumer) => consumer.error(err)),
82
+ complete: () => terminate((consumer) => consumer.complete()),
83
+ }),
84
+ );
85
+ return () => {
86
+ windowRecords = null!;
87
+ };
88
+ });
89
+ };
102
90
  }
@@ -1,84 +1,80 @@
1
1
  import { arrayRemove } from "@fncts/observable/internal/util";
2
2
 
3
3
  /**
4
- * @tsplus fluent fncts.observable.Observable windowToggle
4
+ * @tsplus pipeable fncts.observable.Observable windowToggle
5
5
  */
6
- export function windowToggle_<R, E, A, R1, E1, B, R2, E2>(
7
- fa: Observable<R, E, A>,
6
+ export function windowToggle<R1, E1, B, R2, E2>(
8
7
  openings: ObservableInput<R1, E1, B>,
9
8
  closingSelector: (openValue: B) => ObservableInput<R2, E2, any>,
10
- ): Observable<R | R1 | R2, E | E1 | E2, Observable<never, E, A>> {
11
- return operate_(fa, (source, subscriber) => {
12
- const windows: Subject<never, E, A>[] = [];
13
-
14
- const handleError = (err: Cause<E>) => {
15
- while (0 < windows.length) {
16
- windows.shift()!.error(err);
17
- }
18
- subscriber.error(err);
19
- };
20
-
21
- Observable.from(openings).subscribe(
22
- operatorSubscriber(subscriber, {
23
- next: (openValue) => {
24
- const window = new Subject<never, E, A>();
25
- windows.push(window);
26
- const closingSubscription = new Subscription();
27
- const closeWindow = () => {
28
- arrayRemove(windows, window);
29
- window.complete();
30
- closingSubscription.unsubscribe();
31
- };
32
-
33
- let closingNotifier: Observable<R2, E2, any>;
34
-
35
- try {
36
- closingNotifier = Observable.from(closingSelector(openValue));
37
- } catch (err) {
38
- handleError(Cause.halt(err));
39
- return;
40
- }
41
-
42
- subscriber.next(window.asObservable());
43
-
44
- closingSubscription.add(
45
- closingNotifier.subscribe(
46
- operatorSubscriber(subscriber, {
47
- next: closeWindow,
48
- complete: noop,
49
- error: closeWindow,
50
- }),
51
- ),
52
- );
53
- },
54
- complete: noop,
55
- }),
56
- );
57
-
58
- source.subscribe(
59
- operatorSubscriber(
60
- subscriber,
61
- {
62
- next: (value) => {
63
- const windowsCopy = windows.slice();
64
- for (const window of windowsCopy) {
65
- window.next(value);
66
- }
9
+ ) {
10
+ return <R, E, A>(fa: Observable<R, E, A>): Observable<R | R1 | R2, E | E1 | E2, Observable<never, E, A>> => {
11
+ return fa.operate((source, subscriber, environment) => {
12
+ const windows: Subject<never, E, A>[] = [];
13
+ const handleError = (err: Cause<E>) => {
14
+ while (0 < windows.length) {
15
+ windows.shift()!.error(err);
16
+ }
17
+ subscriber.error(err);
18
+ };
19
+ Observable.from(openings)
20
+ .provideEnvironment(environment)
21
+ .subscribe(
22
+ operatorSubscriber(subscriber, {
23
+ next: (openValue) => {
24
+ const window = new Subject<never, E, A>();
25
+ windows.push(window);
26
+ const closingSubscription = new Subscription();
27
+ const closeWindow = () => {
28
+ arrayRemove(windows, window);
29
+ window.complete();
30
+ closingSubscription.unsubscribe();
31
+ };
32
+ let closingNotifier: Observable<R2, E2, any>;
33
+ try {
34
+ closingNotifier = Observable.from(closingSelector(openValue));
35
+ } catch (err) {
36
+ handleError(Cause.halt(err));
37
+ return;
38
+ }
39
+ subscriber.next(window.asObservable());
40
+ closingSubscription.add(
41
+ closingNotifier.provideEnvironment(environment).subscribe(
42
+ operatorSubscriber(subscriber, {
43
+ next: closeWindow,
44
+ complete: noop,
45
+ error: closeWindow,
46
+ }),
47
+ ),
48
+ );
49
+ },
50
+ complete: noop,
51
+ }),
52
+ );
53
+ source.provideEnvironment(environment).subscribe(
54
+ operatorSubscriber(
55
+ subscriber,
56
+ {
57
+ next: (value) => {
58
+ const windowsCopy = windows.slice();
59
+ for (const window of windowsCopy) {
60
+ window.next(value);
61
+ }
62
+ },
63
+ error: handleError,
64
+ complete: () => {
65
+ while (0 < windows.length) {
66
+ windows.shift()!.complete();
67
+ }
68
+ subscriber.complete();
69
+ },
67
70
  },
68
- error: handleError,
69
- complete: () => {
71
+ () => {
70
72
  while (0 < windows.length) {
71
- windows.shift()!.complete();
73
+ windows.shift()!.unsubscribe();
72
74
  }
73
- subscriber.complete();
74
75
  },
75
- },
76
- () => {
77
- while (0 < windows.length) {
78
- windows.shift()!.unsubscribe();
79
- }
80
- },
81
- ),
82
- );
83
- });
76
+ ),
77
+ );
78
+ });
79
+ };
84
80
  }
@@ -1,59 +1,53 @@
1
1
  /**
2
- * @tsplus fluent fncts.observable.Observable windowWhen
2
+ * @tsplus pipeable fncts.observable.Observable windowWhen
3
3
  */
4
- export function windowWhen_<R, E, A>(
5
- fa: Observable<R, E, A>,
6
- closingSelector: () => ObservableInput<never, never, any>,
7
- ): Observable<R, E, Observable<never, E, A>> {
8
- return operate_(fa, (source, subscriber) => {
9
- let window: Subject<never, E, A> | null;
10
- let closingSubscriber: Subscriber<E, any> | undefined;
11
-
12
- const handleError = (err: Cause<E>) => {
13
- window!.error(err);
14
- subscriber.error(err);
15
- };
16
-
17
- const openWindow = () => {
18
- closingSubscriber?.unsubscribe();
19
- window?.complete();
20
- window = new Subject();
21
- subscriber.next(window.asObservable());
22
- let closingNotifier: Observable<never, never, any>;
23
- try {
24
- closingNotifier = Observable.from(closingSelector());
25
- } catch (err) {
26
- handleError(Cause.halt(err));
27
- return;
28
- }
29
-
30
- closingNotifier.subscribe(
31
- (closingSubscriber = operatorSubscriber(subscriber, {
32
- next: openWindow,
33
- complete: openWindow,
34
- error: handleError,
35
- })),
36
- );
37
- };
38
-
39
- openWindow();
40
-
41
- source.subscribe(
42
- operatorSubscriber(
43
- subscriber,
44
- {
45
- next: (value) => window!.next(value),
46
- error: handleError,
47
- complete: () => {
48
- window!.complete();
49
- subscriber.complete();
4
+ export function windowWhen(closingSelector: () => ObservableInput<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 window: Subject<never, E, A> | null;
8
+ let closingSubscriber: Subscriber<E, any> | undefined;
9
+ const handleError = (err: Cause<E>) => {
10
+ window!.error(err);
11
+ subscriber.error(err);
12
+ };
13
+ const openWindow = () => {
14
+ closingSubscriber?.unsubscribe();
15
+ window?.complete();
16
+ window = new Subject();
17
+ subscriber.next(window.asObservable());
18
+ let closingNotifier: Observable<never, never, any>;
19
+ try {
20
+ closingNotifier = Observable.from(closingSelector());
21
+ } catch (err) {
22
+ handleError(Cause.halt(err));
23
+ return;
24
+ }
25
+ closingNotifier.subscribe(
26
+ (closingSubscriber = operatorSubscriber(subscriber, {
27
+ next: openWindow,
28
+ complete: openWindow,
29
+ error: handleError,
30
+ })),
31
+ );
32
+ };
33
+ openWindow();
34
+ source.provideEnvironment(environment).subscribe(
35
+ operatorSubscriber(
36
+ subscriber,
37
+ {
38
+ next: (value) => window!.next(value),
39
+ error: handleError,
40
+ complete: () => {
41
+ window!.complete();
42
+ subscriber.complete();
43
+ },
44
+ },
45
+ () => {
46
+ closingSubscriber?.unsubscribe();
47
+ window = null!;
50
48
  },
51
- },
52
- () => {
53
- closingSubscriber?.unsubscribe();
54
- window = null!;
55
- },
56
- ),
57
- );
58
- });
49
+ ),
50
+ );
51
+ });
52
+ };
59
53
  }