@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.
- package/BehaviorSubject.d.ts +2 -2
- package/Notification.d.ts +4 -4
- package/Observable/api/connect.d.ts +2 -2
- package/Observable/api/connectable.d.ts +2 -2
- package/Observable/api/fromEvent.d.ts +4 -0
- package/Observable/api/race.d.ts +2 -1
- package/Observable/api/raceWith.d.ts +2 -2
- package/Observable/api/repeatWhen.d.ts +5 -2
- package/Observable/api/retryWhen.d.ts +2 -3
- package/Observable/api/share.d.ts +5 -4
- package/Observable/api/window.d.ts +2 -2
- package/Observable/api/windowCount.d.ts +2 -2
- package/Observable/api/windowTime.d.ts +5 -5
- package/Observable/api/windowToggle.d.ts +3 -3
- package/Observable/api/windowWhen.d.ts +3 -3
- package/Observable/api.d.ts +188 -194
- package/Observable/definition.d.ts +8 -6
- package/Operator.d.ts +2 -2
- package/_cjs/Action.cjs.map +1 -1
- package/_cjs/AnimationFrameAction.cjs.map +1 -1
- package/_cjs/AnimationFrameScheduler.cjs +0 -1
- package/_cjs/AnimationFrameScheduler.cjs.map +1 -1
- package/_cjs/BehaviorSubject.cjs +1 -1
- package/_cjs/BehaviorSubject.cjs.map +1 -1
- package/_cjs/Notification.cjs +21 -17
- package/_cjs/Notification.cjs.map +1 -1
- package/_cjs/Observable/api/connect.cjs +12 -10
- package/_cjs/Observable/api/connect.cjs.map +1 -1
- package/_cjs/Observable/api/connectable.cjs +6 -4
- package/_cjs/Observable/api/connectable.cjs.map +1 -1
- package/_cjs/Observable/api/fromCallback.cjs.map +1 -1
- package/_cjs/Observable/api/fromEvent.cjs +3 -0
- package/_cjs/Observable/api/fromEvent.cjs.map +1 -1
- package/_cjs/Observable/api/race.cjs +2 -2
- package/_cjs/Observable/api/race.cjs.map +1 -1
- package/_cjs/Observable/api/raceWith.cjs +8 -6
- package/_cjs/Observable/api/raceWith.cjs.map +1 -1
- package/_cjs/Observable/api/repeatWhen.cjs +46 -46
- package/_cjs/Observable/api/repeatWhen.cjs.map +1 -1
- package/_cjs/Observable/api/retryWhen.cjs +31 -38
- package/_cjs/Observable/api/retryWhen.cjs.map +1 -1
- package/_cjs/Observable/api/share.cjs +66 -64
- package/_cjs/Observable/api/share.cjs.map +1 -1
- package/_cjs/Observable/api/window.cjs +35 -33
- package/_cjs/Observable/api/window.cjs.map +1 -1
- package/_cjs/Observable/api/windowCount.cjs +41 -39
- package/_cjs/Observable/api/windowCount.cjs.map +1 -1
- package/_cjs/Observable/api/windowTime.cjs +66 -64
- package/_cjs/Observable/api/windowTime.cjs.map +1 -1
- package/_cjs/Observable/api/windowToggle.cjs +63 -61
- package/_cjs/Observable/api/windowToggle.cjs.map +1 -1
- package/_cjs/Observable/api/windowWhen.cjs +43 -41
- package/_cjs/Observable/api/windowWhen.cjs.map +1 -1
- package/_cjs/Observable/api.cjs +1270 -1105
- package/_cjs/Observable/api.cjs.map +1 -1
- package/_cjs/Observable/definition.cjs +9 -8
- package/_cjs/Observable/definition.cjs.map +1 -1
- package/_cjs/Observable/dom/animationFrames.cjs.map +1 -1
- package/_cjs/Observable.cjs.map +1 -1
- package/_cjs/Operator.cjs +11 -9
- package/_cjs/Operator.cjs.map +1 -1
- package/_cjs/Scheduler.cjs +0 -5
- package/_cjs/Scheduler.cjs.map +1 -1
- package/_cjs/Subject.cjs +3 -3
- package/_cjs/Subject.cjs.map +1 -1
- package/_cjs/Subscriber.cjs.map +1 -1
- package/_cjs/internal/util.cjs.map +1 -1
- package/_mjs/Action.mjs.map +1 -1
- package/_mjs/AnimationFrameAction.mjs.map +1 -1
- package/_mjs/AnimationFrameScheduler.mjs +0 -2
- package/_mjs/AnimationFrameScheduler.mjs.map +1 -1
- package/_mjs/BehaviorSubject.mjs +1 -1
- package/_mjs/BehaviorSubject.mjs.map +1 -1
- package/_mjs/Notification.mjs +18 -14
- package/_mjs/Notification.mjs.map +1 -1
- package/_mjs/Observable/api/connect.mjs +12 -10
- package/_mjs/Observable/api/connect.mjs.map +1 -1
- package/_mjs/Observable/api/connectable.mjs +6 -4
- package/_mjs/Observable/api/connectable.mjs.map +1 -1
- package/_mjs/Observable/api/fromCallback.mjs.map +1 -1
- package/_mjs/Observable/api/fromEvent.mjs +4 -0
- package/_mjs/Observable/api/fromEvent.mjs.map +1 -1
- package/_mjs/Observable/api/race.mjs +2 -2
- package/_mjs/Observable/api/race.mjs.map +1 -1
- package/_mjs/Observable/api/raceWith.mjs +7 -5
- package/_mjs/Observable/api/raceWith.mjs.map +1 -1
- package/_mjs/Observable/api/repeatWhen.mjs +47 -44
- package/_mjs/Observable/api/repeatWhen.mjs.map +1 -1
- package/_mjs/Observable/api/retryWhen.mjs +30 -33
- package/_mjs/Observable/api/retryWhen.mjs.map +1 -1
- package/_mjs/Observable/api/share.mjs +63 -61
- package/_mjs/Observable/api/share.mjs.map +1 -1
- package/_mjs/Observable/api/window.mjs +32 -30
- package/_mjs/Observable/api/window.mjs.map +1 -1
- package/_mjs/Observable/api/windowCount.mjs +40 -38
- package/_mjs/Observable/api/windowCount.mjs.map +1 -1
- package/_mjs/Observable/api/windowTime.mjs +60 -58
- package/_mjs/Observable/api/windowTime.mjs.map +1 -1
- package/_mjs/Observable/api/windowToggle.mjs +56 -54
- package/_mjs/Observable/api/windowToggle.mjs.map +1 -1
- package/_mjs/Observable/api/windowWhen.mjs +42 -40
- package/_mjs/Observable/api/windowWhen.mjs.map +1 -1
- package/_mjs/Observable/api.mjs +1198 -1031
- package/_mjs/Observable/api.mjs.map +1 -1
- package/_mjs/Observable/definition.mjs +9 -8
- package/_mjs/Observable/definition.mjs.map +1 -1
- package/_mjs/Observable/dom/animationFrames.mjs.map +1 -1
- package/_mjs/Observable.mjs.map +1 -1
- package/_mjs/Operator.mjs +11 -9
- package/_mjs/Operator.mjs.map +1 -1
- package/_mjs/Scheduler.mjs +0 -6
- package/_mjs/Scheduler.mjs.map +1 -1
- package/_mjs/Subject.mjs +3 -3
- package/_mjs/Subject.mjs.map +1 -1
- package/_mjs/Subscriber.mjs.map +1 -1
- package/_mjs/internal/util.mjs.map +1 -1
- package/_src/Action.ts +0 -1
- package/_src/AnimationFrameAction.ts +0 -2
- package/_src/AnimationFrameScheduler.ts +2 -7
- package/_src/BehaviorSubject.ts +3 -3
- package/_src/Notification.ts +21 -23
- package/_src/Observable/api/connect.ts +12 -9
- package/_src/Observable/api/connectable.ts +6 -7
- package/_src/Observable/api/fromCallback.ts +0 -1
- package/_src/Observable/api/fromEvent.ts +3 -0
- package/_src/Observable/api/race.ts +15 -13
- package/_src/Observable/api/raceWith.ts +15 -14
- package/_src/Observable/api/repeatWhen.ts +51 -56
- package/_src/Observable/api/retryWhen.ts +38 -43
- package/_src/Observable/api/share.ts +63 -71
- package/_src/Observable/api/window.ts +36 -41
- package/_src/Observable/api/windowCount.ts +44 -51
- package/_src/Observable/api/windowTime.ts +69 -81
- package/_src/Observable/api/windowToggle.ts +69 -73
- package/_src/Observable/api/windowWhen.ts +49 -55
- package/_src/Observable/api.ts +1489 -1495
- package/_src/Observable/definition.ts +24 -18
- package/_src/Observable/dom/animationFrames.ts +16 -6
- package/_src/Observable/instances.ts +0 -23
- package/_src/Observable.ts +0 -2
- package/_src/Operator.ts +20 -15
- package/_src/Scheduler.ts +0 -6
- package/_src/Subject.ts +1 -1
- package/_src/Subscriber.ts +3 -2
- package/_src/internal/util.ts +8 -4
- package/package.json +2 -2
|
@@ -1,44 +1,39 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @tsplus
|
|
2
|
+
* @tsplus pipeable fncts.observable.Observable window
|
|
3
3
|
*/
|
|
4
|
-
export function
|
|
5
|
-
fa: Observable<R, E, A
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
|
2
|
+
* @tsplus pipeable fncts.observable.Observable windowCount
|
|
3
3
|
*/
|
|
4
|
-
export function
|
|
5
|
-
fa: Observable<R, E, A
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
windows.shift()!.complete();
|
|
40
|
-
}
|
|
41
|
-
subscriber.complete();
|
|
42
|
+
() => {
|
|
43
|
+
windows = null!;
|
|
42
44
|
},
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
|
11
|
+
* @tsplus pipeable fncts.observable.Observable windowTime
|
|
12
12
|
*/
|
|
13
|
-
export function
|
|
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
|
|
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
|
|
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
|
|
32
|
-
fa: Observable<R, E, A
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
)
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|
|
4
|
+
* @tsplus pipeable fncts.observable.Observable windowToggle
|
|
5
5
|
*/
|
|
6
|
-
export function
|
|
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
|
-
)
|
|
11
|
-
return
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
)
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
69
|
-
complete: () => {
|
|
71
|
+
() => {
|
|
70
72
|
while (0 < windows.length) {
|
|
71
|
-
windows.shift()!.
|
|
73
|
+
windows.shift()!.unsubscribe();
|
|
72
74
|
}
|
|
73
|
-
subscriber.complete();
|
|
74
75
|
},
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
},
|
|
81
|
-
),
|
|
82
|
-
);
|
|
83
|
-
});
|
|
76
|
+
),
|
|
77
|
+
);
|
|
78
|
+
});
|
|
79
|
+
};
|
|
84
80
|
}
|
|
@@ -1,59 +1,53 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @tsplus
|
|
2
|
+
* @tsplus pipeable fncts.observable.Observable windowWhen
|
|
3
3
|
*/
|
|
4
|
-
export function
|
|
5
|
-
fa: Observable<R, E, A
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
},
|
|
56
|
-
),
|
|
57
|
-
);
|
|
58
|
-
});
|
|
49
|
+
),
|
|
50
|
+
);
|
|
51
|
+
});
|
|
52
|
+
};
|
|
59
53
|
}
|