@fncts/observable 0.0.9 → 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,23 +1,18 @@
|
|
|
1
|
-
/* eslint-disable no-param-reassign */
|
|
2
1
|
export class AnimationFrameScheduler extends AsyncScheduler {
|
|
3
2
|
public flush(action?: AsyncAction<any>): void {
|
|
4
|
-
this.active
|
|
5
|
-
this.scheduled
|
|
6
|
-
|
|
3
|
+
this.active = true;
|
|
4
|
+
this.scheduled = undefined;
|
|
7
5
|
const { actions } = this;
|
|
8
6
|
let error: any;
|
|
9
7
|
let index = -1;
|
|
10
8
|
action = action || actions.shift()!;
|
|
11
9
|
const count = actions.length;
|
|
12
|
-
|
|
13
10
|
do {
|
|
14
11
|
if ((error = action.execute(action.state, action.delay!))) {
|
|
15
12
|
break;
|
|
16
13
|
}
|
|
17
14
|
} while (++index < count && (action = actions.shift()));
|
|
18
|
-
|
|
19
15
|
this.active = false;
|
|
20
|
-
|
|
21
16
|
if (error) {
|
|
22
17
|
while (++index < count && (action = actions.shift())) {
|
|
23
18
|
action.unsubscribe();
|
package/_src/BehaviorSubject.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export class BehaviorSubject<
|
|
1
|
+
export class BehaviorSubject<A> extends Subject<never, never, A> {
|
|
2
2
|
constructor(private _value: A) {
|
|
3
3
|
super();
|
|
4
4
|
}
|
|
@@ -16,8 +16,8 @@ export class BehaviorSubject<R, E, A> extends Subject<R, E, A> {
|
|
|
16
16
|
return _value;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
protected subscribeInternal(subscriber: Subscriber<
|
|
20
|
-
const subscription = super.
|
|
19
|
+
protected subscribeInternal(subscriber: Subscriber<never, A>) {
|
|
20
|
+
const subscription = super.subscribeInternal(subscriber);
|
|
21
21
|
!subscription.closed && subscriber.next(this._value);
|
|
22
22
|
return subscription;
|
|
23
23
|
}
|
package/_src/Notification.ts
CHANGED
|
@@ -60,32 +60,30 @@ export function complete<E = never, A = never>(): Notification<E, A> {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
/**
|
|
63
|
-
* @tsplus
|
|
63
|
+
* @tsplus pipeable fncts.observable.Notification match
|
|
64
64
|
*/
|
|
65
|
-
export function
|
|
66
|
-
fa: Notification<E, A
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
|
79
|
+
* @tsplus pipeable fncts.observable.Notification observe
|
|
83
80
|
*/
|
|
84
|
-
export function
|
|
85
|
-
return
|
|
86
|
-
notification
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
|
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
|
-
)
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
|
45
|
+
* @tsplus pipeable fncts.observable.Observable connectable
|
|
46
46
|
*/
|
|
47
|
-
export function connectable<
|
|
48
|
-
source: ObservableInput<R, E, A
|
|
49
|
-
|
|
50
|
-
|
|
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
|
}
|
|
@@ -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]!)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
23
|
-
}
|
|
24
|
-
|
|
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
|
|
4
|
+
* @tsplus pipeable fncts.observable.Observablen raceWith
|
|
5
5
|
*/
|
|
6
|
-
export function
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
): Observable<
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
> {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
2
|
-
|
|
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
|
-
)
|
|
5
|
-
return fa
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
28
|
-
checkComplete();
|
|
43
|
+
isMainComplete = true;
|
|
44
|
+
!checkComplete() && getCompletionSubject().next();
|
|
29
45
|
},
|
|
30
46
|
}),
|
|
31
47
|
);
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
|
2
|
+
* @tsplus pipeable fncts.observable.Observable retryWhen
|
|
3
3
|
*/
|
|
4
|
-
export function
|
|
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
|
-
)
|
|
8
|
-
return
|
|
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
|
-
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?: () =>
|
|
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
|
|
9
|
+
* @tsplus pipeable fncts.observable.Observable share
|
|
10
10
|
*/
|
|
11
|
-
export function
|
|
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
|
-
)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
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
|
}
|