@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.
- 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 +189 -195
- package/Observable/definition.d.ts +8 -6
- package/ObservableRef/api.d.ts +63 -0
- package/ObservableRef/atomic.d.ts +32 -0
- package/ObservableRef/definition.d.ts +52 -0
- package/Operator.d.ts +2 -2
- package/_cjs/Action.cjs +0 -7
- package/_cjs/Action.cjs.map +1 -1
- package/_cjs/AnimationFrameAction.cjs +0 -12
- package/_cjs/AnimationFrameAction.cjs.map +1 -1
- package/_cjs/AnimationFrameScheduler.cjs +0 -12
- package/_cjs/AnimationFrameScheduler.cjs.map +1 -1
- package/_cjs/AsyncAction.cjs +0 -25
- package/_cjs/AsyncAction.cjs.map +1 -1
- package/_cjs/AsyncScheduler.cjs +2 -16
- package/_cjs/AsyncScheduler.cjs.map +1 -1
- package/_cjs/BehaviorSubject.cjs +1 -13
- package/_cjs/BehaviorSubject.cjs.map +1 -1
- package/_cjs/Notification.cjs +21 -40
- package/_cjs/Notification.cjs.map +1 -1
- package/_cjs/Observable/api/connect.cjs +12 -17
- package/_cjs/Observable/api/connect.cjs.map +1 -1
- package/_cjs/Observable/api/connectable.cjs +6 -18
- package/_cjs/Observable/api/connectable.cjs.map +1 -1
- package/_cjs/Observable/api/fromCallback.cjs +0 -15
- package/_cjs/Observable/api/fromCallback.cjs.map +1 -1
- package/_cjs/Observable/api/fromEvent.cjs +3 -5
- package/_cjs/Observable/api/fromEvent.cjs.map +1 -1
- package/_cjs/Observable/api/index.cjs +0 -28
- package/_cjs/Observable/api/index.cjs.map +1 -1
- package/_cjs/Observable/api/race.cjs +2 -12
- package/_cjs/Observable/api/race.cjs.map +1 -1
- package/_cjs/Observable/api/raceWith.cjs +8 -11
- package/_cjs/Observable/api/raceWith.cjs.map +1 -1
- package/_cjs/Observable/api/repeatWhen.cjs +44 -55
- package/_cjs/Observable/api/repeatWhen.cjs.map +1 -1
- package/_cjs/Observable/api/retryWhen.cjs +29 -45
- package/_cjs/Observable/api/retryWhen.cjs.map +1 -1
- package/_cjs/Observable/api/share.cjs +61 -77
- package/_cjs/Observable/api/share.cjs.map +1 -1
- package/_cjs/Observable/api/window.cjs +33 -39
- package/_cjs/Observable/api/window.cjs.map +1 -1
- package/_cjs/Observable/api/windowCount.cjs +40 -48
- package/_cjs/Observable/api/windowCount.cjs.map +1 -1
- package/_cjs/Observable/api/windowTime.cjs +60 -73
- package/_cjs/Observable/api/windowTime.cjs.map +1 -1
- package/_cjs/Observable/api/windowToggle.cjs +55 -71
- package/_cjs/Observable/api/windowToggle.cjs.map +1 -1
- package/_cjs/Observable/api/windowWhen.cjs +42 -52
- package/_cjs/Observable/api/windowWhen.cjs.map +1 -1
- package/_cjs/Observable/api.cjs +1260 -1485
- package/_cjs/Observable/api.cjs.map +1 -1
- package/_cjs/Observable/definition.cjs +9 -37
- package/_cjs/Observable/definition.cjs.map +1 -1
- package/_cjs/Observable/dom/animationFrames.cjs +0 -12
- package/_cjs/Observable/dom/animationFrames.cjs.map +1 -1
- package/_cjs/Observable.cjs +0 -38
- package/_cjs/Observable.cjs.map +1 -1
- package/_cjs/ObservableRef/api.cjs +160 -0
- package/_cjs/ObservableRef/api.cjs.map +1 -0
- package/_cjs/ObservableRef/atomic.cjs +93 -0
- package/_cjs/ObservableRef/atomic.cjs.map +1 -0
- package/_cjs/ObservableRef/definition.cjs +24 -0
- package/_cjs/ObservableRef/definition.cjs.map +1 -0
- package/_cjs/Operator.cjs +11 -21
- package/_cjs/Operator.cjs.map +1 -1
- package/_cjs/Scheduler.cjs +0 -18
- package/_cjs/Scheduler.cjs.map +1 -1
- package/_cjs/Subject.cjs +3 -50
- package/_cjs/Subject.cjs.map +1 -1
- package/_cjs/Subscriber.cjs +0 -32
- package/_cjs/Subscriber.cjs.map +1 -1
- package/_cjs/Subscription.cjs +0 -37
- package/_cjs/Subscription.cjs.map +1 -1
- package/_cjs/index.cjs +0 -28
- package/_cjs/internal/animationFrameProvider.cjs +0 -9
- package/_cjs/internal/animationFrameProvider.cjs.map +1 -1
- package/_cjs/internal/args.cjs +0 -6
- package/_cjs/internal/args.cjs.map +1 -1
- package/_cjs/internal/intervalProvider.cjs +0 -2
- package/_cjs/internal/intervalProvider.cjs.map +1 -1
- package/_cjs/internal/performanceTimestampProvider.cjs +0 -1
- package/_cjs/internal/performanceTimestampProvider.cjs.map +1 -1
- package/_cjs/internal/timeoutProvider.cjs +0 -2
- package/_cjs/internal/timeoutProvider.cjs.map +1 -1
- package/_cjs/internal/timestampProvider.cjs +0 -1
- package/_cjs/internal/timestampProvider.cjs.map +1 -1
- package/_cjs/internal/util.cjs +2 -21
- package/_cjs/internal/util.cjs.map +1 -1
- package/_mjs/Action.mjs +0 -3
- package/_mjs/Action.mjs.map +1 -1
- package/_mjs/AnimationFrameAction.mjs +0 -6
- package/_mjs/AnimationFrameAction.mjs.map +1 -1
- package/_mjs/AnimationFrameScheduler.mjs +0 -7
- package/_mjs/AnimationFrameScheduler.mjs.map +1 -1
- package/_mjs/AsyncAction.mjs +0 -17
- package/_mjs/AsyncAction.mjs.map +1 -1
- package/_mjs/AsyncScheduler.mjs +2 -10
- package/_mjs/AsyncScheduler.mjs.map +1 -1
- package/_mjs/BehaviorSubject.mjs +1 -8
- package/_mjs/BehaviorSubject.mjs.map +1 -1
- package/_mjs/Notification.mjs +18 -26
- package/_mjs/Notification.mjs.map +1 -1
- package/_mjs/Observable/api/connect.mjs +12 -11
- package/_mjs/Observable/api/connect.mjs.map +1 -1
- package/_mjs/Observable/api/connectable.mjs +6 -9
- package/_mjs/Observable/api/connectable.mjs.map +1 -1
- package/_mjs/Observable/api/fromCallback.mjs +0 -10
- package/_mjs/Observable/api/fromCallback.mjs.map +1 -1
- package/_mjs/Observable/api/fromEvent.mjs +3 -1
- package/_mjs/Observable/api/fromEvent.mjs.map +1 -1
- package/_mjs/Observable/api/index.mjs.map +1 -1
- package/_mjs/Observable/api/race.mjs +2 -6
- package/_mjs/Observable/api/race.mjs.map +1 -1
- package/_mjs/Observable/api/raceWith.mjs +7 -6
- package/_mjs/Observable/api/raceWith.mjs.map +1 -1
- package/_mjs/Observable/api/repeatWhen.mjs +44 -48
- package/_mjs/Observable/api/repeatWhen.mjs.map +1 -1
- package/_mjs/Observable/api/retryWhen.mjs +29 -37
- package/_mjs/Observable/api/retryWhen.mjs.map +1 -1
- package/_mjs/Observable/api/share.mjs +60 -70
- package/_mjs/Observable/api/share.mjs.map +1 -1
- package/_mjs/Observable/api/window.mjs +32 -33
- package/_mjs/Observable/api/window.mjs.map +1 -1
- package/_mjs/Observable/api/windowCount.mjs +39 -43
- package/_mjs/Observable/api/windowCount.mjs.map +1 -1
- package/_mjs/Observable/api/windowTime.mjs +59 -63
- package/_mjs/Observable/api/windowTime.mjs.map +1 -1
- package/_mjs/Observable/api/windowToggle.mjs +54 -62
- package/_mjs/Observable/api/windowToggle.mjs.map +1 -1
- package/_mjs/Observable/api/windowWhen.mjs +41 -45
- package/_mjs/Observable/api/windowWhen.mjs.map +1 -1
- package/_mjs/Observable/api.mjs +1186 -1311
- package/_mjs/Observable/api.mjs.map +1 -1
- package/_mjs/Observable/definition.mjs +9 -24
- package/_mjs/Observable/definition.mjs.map +1 -1
- package/_mjs/Observable/dom/animationFrames.mjs +0 -5
- package/_mjs/Observable/dom/animationFrames.mjs.map +1 -1
- package/_mjs/Observable.mjs +4 -4
- package/_mjs/Observable.mjs.map +1 -1
- package/_mjs/ObservableRef/api.mjs +141 -0
- package/_mjs/ObservableRef/api.mjs.map +1 -0
- package/_mjs/ObservableRef/atomic.mjs +82 -0
- package/_mjs/ObservableRef/atomic.mjs.map +1 -0
- package/_mjs/ObservableRef/definition.mjs +16 -0
- package/_mjs/ObservableRef/definition.mjs.map +1 -0
- package/_mjs/Operator.mjs +11 -12
- package/_mjs/Operator.mjs.map +1 -1
- package/_mjs/Scheduler.mjs +0 -9
- package/_mjs/Scheduler.mjs.map +1 -1
- package/_mjs/Subject.mjs +3 -37
- package/_mjs/Subject.mjs.map +1 -1
- package/_mjs/Subscriber.mjs +0 -20
- package/_mjs/Subscriber.mjs.map +1 -1
- package/_mjs/Subscription.mjs +0 -26
- package/_mjs/Subscription.mjs.map +1 -1
- package/_mjs/index.mjs.map +1 -1
- package/_mjs/internal/animationFrameProvider.mjs +0 -5
- package/_mjs/internal/animationFrameProvider.mjs.map +1 -1
- package/_mjs/internal/args.mjs +0 -2
- package/_mjs/internal/args.mjs.map +1 -1
- package/_mjs/internal/intervalProvider.mjs +0 -2
- package/_mjs/internal/intervalProvider.mjs.map +1 -1
- package/_mjs/internal/performanceTimestampProvider.mjs +0 -1
- package/_mjs/internal/performanceTimestampProvider.mjs.map +1 -1
- package/_mjs/internal/timeoutProvider.mjs +0 -2
- package/_mjs/internal/timeoutProvider.mjs.map +1 -1
- package/_mjs/internal/timestampProvider.mjs +0 -1
- package/_mjs/internal/timestampProvider.mjs.map +1 -1
- package/_mjs/internal/util.mjs +2 -7
- 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 +1493 -1498
- 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/ObservableRef/api.ts +169 -0
- package/_src/ObservableRef/atomic.ts +85 -0
- package/_src/ObservableRef/definition.ts +57 -0
- 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/global.ts +5 -1
- package/_src/internal/util.ts +8 -4
- package/global.d.ts +5 -1
- package/package.json +2 -2
package/_src/Observable/api.ts
CHANGED
|
@@ -29,8 +29,8 @@ export function halt(defect: unknown): Observable<never, never, never> {
|
|
|
29
29
|
* @tsplus static fncts.observable.ObservableOps defer
|
|
30
30
|
*/
|
|
31
31
|
export function defer<R, E, A>(observable: Lazy<ObservableInput<R, E, A>>): Observable<R, E, A> {
|
|
32
|
-
return new Observable((s) => {
|
|
33
|
-
from(observable()).subscribe(s);
|
|
32
|
+
return new Observable((s, environment) => {
|
|
33
|
+
from(observable()).provideEnvironment(environment).subscribe(s);
|
|
34
34
|
});
|
|
35
35
|
}
|
|
36
36
|
|
|
@@ -184,13 +184,11 @@ export interface IterateOptions<S> {
|
|
|
184
184
|
|
|
185
185
|
export function iterate<S>(options: IterateOptions<S>): Observable<never, never, S> {
|
|
186
186
|
const { initialState, cont, iterate, scheduler } = options;
|
|
187
|
-
|
|
188
187
|
function* gen() {
|
|
189
188
|
for (let state = initialState; !cont || cont(state); state = iterate(state)) {
|
|
190
189
|
yield state;
|
|
191
190
|
}
|
|
192
191
|
}
|
|
193
|
-
|
|
194
192
|
return defer(scheduler ? () => scheduleIterable(gen(), scheduler!) : gen);
|
|
195
193
|
}
|
|
196
194
|
|
|
@@ -212,7 +210,6 @@ export function interval(period = 0, scheduler: SchedulerLike = asyncScheduler):
|
|
|
212
210
|
// eslint-disable-next-line no-param-reassign
|
|
213
211
|
period = 0;
|
|
214
212
|
}
|
|
215
|
-
|
|
216
213
|
return timer(period, period, scheduler);
|
|
217
214
|
}
|
|
218
215
|
|
|
@@ -233,7 +230,7 @@ export function merge<O extends ReadonlyArray<ObservableInput<any, any>>>(
|
|
|
233
230
|
? empty()
|
|
234
231
|
: sources.length === 1
|
|
235
232
|
? from(sources[0] as ObservableInput<any, any>)
|
|
236
|
-
:
|
|
233
|
+
: fromArrayLike(sources as ReadonlyArray<ObservableInput<any, any>>).mergeAll(concurrency);
|
|
237
234
|
}
|
|
238
235
|
|
|
239
236
|
/**
|
|
@@ -254,26 +251,28 @@ export function single<A>(a: A): Observable<never, never, A> {
|
|
|
254
251
|
}
|
|
255
252
|
|
|
256
253
|
/**
|
|
257
|
-
* @tsplus
|
|
254
|
+
* @tsplus pipeable fncts.observable.Observable scheduled
|
|
258
255
|
* @tsplus static fncts.observable.ObservableOps scheduled
|
|
259
256
|
*/
|
|
260
|
-
export function scheduled
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
257
|
+
export function scheduled(scheduler: SchedulerLike) {
|
|
258
|
+
return <R, E, A>(input: ObservableInput<R, E, A>): Observable<R, E, A> => {
|
|
259
|
+
if (isArrayLike(input)) {
|
|
260
|
+
return scheduleArray(input, scheduler);
|
|
261
|
+
}
|
|
262
|
+
if (isPromiseLike(input)) {
|
|
263
|
+
return schedulePromise(input, scheduler);
|
|
264
|
+
}
|
|
265
|
+
if (isIterable(input)) {
|
|
266
|
+
return scheduleIterable(input, scheduler);
|
|
267
|
+
}
|
|
268
|
+
if (isAsyncIterable(input)) {
|
|
269
|
+
return scheduleAsyncIterable(input, scheduler);
|
|
270
|
+
}
|
|
271
|
+
if (isReadableStream(input)) {
|
|
272
|
+
return scheduleReadableStreamLike(input, scheduler);
|
|
273
|
+
}
|
|
274
|
+
return scheduleObservable(from(input), scheduler);
|
|
275
|
+
};
|
|
277
276
|
}
|
|
278
277
|
|
|
279
278
|
export function scheduleArray<A>(input: ArrayLike<A>, scheduler: SchedulerLike): Observable<never, never, A> {
|
|
@@ -336,18 +335,17 @@ export function scheduleIterable<A>(input: Iterable<A>, scheduler: SchedulerLike
|
|
|
336
335
|
});
|
|
337
336
|
}),
|
|
338
337
|
);
|
|
339
|
-
|
|
340
338
|
return () => isFunction(iterator?.return) && iterator.return();
|
|
341
339
|
});
|
|
342
340
|
}
|
|
343
341
|
|
|
344
342
|
export function scheduleObservable<R, E, A>(input: Observable<R, E, A>, scheduler: SchedulerLike): Observable<R, E, A> {
|
|
345
|
-
return new Observable((subscriber) => {
|
|
343
|
+
return new Observable((subscriber, environment) => {
|
|
346
344
|
const sub = new Subscription();
|
|
347
345
|
sub.add(
|
|
348
346
|
scheduler.schedule(() => {
|
|
349
347
|
sub.add(
|
|
350
|
-
input.subscribe({
|
|
348
|
+
input.provideEnvironment(environment).subscribe({
|
|
351
349
|
next: (value) => {
|
|
352
350
|
sub.add(scheduler.schedule(() => subscriber.next(value)));
|
|
353
351
|
},
|
|
@@ -441,34 +439,38 @@ export function makeZip<O extends ReadonlyArray<ObservableInput<any, any>>>(
|
|
|
441
439
|
): Observable<
|
|
442
440
|
Observable.EnvironmentOf<O[number]>,
|
|
443
441
|
Observable.ErrorOf<O[number]>,
|
|
444
|
-
{
|
|
442
|
+
{
|
|
443
|
+
[K in keyof O]: Observable.TypeOf<O[K]>;
|
|
444
|
+
}
|
|
445
445
|
> {
|
|
446
446
|
return sources.length
|
|
447
|
-
? new Observable((subscriber) => {
|
|
447
|
+
? new Observable((subscriber, environment) => {
|
|
448
448
|
let buffers: unknown[][] = sources.map(() => []);
|
|
449
449
|
let completed = sources.map(() => false);
|
|
450
450
|
subscriber.add(() => {
|
|
451
451
|
buffers = completed = null!;
|
|
452
452
|
});
|
|
453
453
|
for (let sourceIndex = 0; !subscriber.closed && sourceIndex < sources.length; sourceIndex++) {
|
|
454
|
-
from(sources[sourceIndex]!)
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
subscriber.
|
|
454
|
+
from(sources[sourceIndex]!)
|
|
455
|
+
.provideEnvironment(environment)
|
|
456
|
+
.subscribe(
|
|
457
|
+
operatorSubscriber(subscriber, {
|
|
458
|
+
next: (value) => {
|
|
459
|
+
buffers[sourceIndex]!.push(value);
|
|
460
|
+
if (buffers.every((buffer) => buffer.length)) {
|
|
461
|
+
const result: any = buffers.map((buffer) => buffer.shift()!);
|
|
462
|
+
subscriber.next(result);
|
|
463
|
+
if (buffers.some((buffer, i) => !buffer.length && completed[i])) {
|
|
464
|
+
subscriber.complete();
|
|
465
|
+
}
|
|
463
466
|
}
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
},
|
|
470
|
-
|
|
471
|
-
);
|
|
467
|
+
},
|
|
468
|
+
complete: () => {
|
|
469
|
+
completed[sourceIndex] = true;
|
|
470
|
+
!buffers[sourceIndex]!.length && subscriber.complete();
|
|
471
|
+
},
|
|
472
|
+
}),
|
|
473
|
+
);
|
|
472
474
|
}
|
|
473
475
|
return () => {
|
|
474
476
|
buffers = completed = null!;
|
|
@@ -482,12 +484,12 @@ export function makeZip<O extends ReadonlyArray<ObservableInput<any, any>>>(
|
|
|
482
484
|
*/
|
|
483
485
|
export function fromIO<R, E, A>(io: IO<R, E, A>, scheduler: SchedulerLike = asyncScheduler): Observable<R, E, A> {
|
|
484
486
|
return new Observable((s, env) => {
|
|
485
|
-
let fiber:
|
|
487
|
+
let fiber: FiberRuntime<E, A>;
|
|
486
488
|
const scheduled = scheduler.schedule(() => {
|
|
487
489
|
fiber = io.provideEnvironment(env).unsafeRunFiber();
|
|
488
|
-
fiber.
|
|
490
|
+
fiber.addObserver((exit) => {
|
|
489
491
|
if (!s.closed) {
|
|
490
|
-
exit.
|
|
492
|
+
exit.match(
|
|
491
493
|
(cause) => s.error(cause),
|
|
492
494
|
(a) => s.next(a),
|
|
493
495
|
);
|
|
@@ -508,87 +510,91 @@ export function fromIO<R, E, A>(io: IO<R, E, A>, scheduler: SchedulerLike = asyn
|
|
|
508
510
|
export const unit: Observable<never, never, void> = Observable.single(undefined);
|
|
509
511
|
|
|
510
512
|
/**
|
|
511
|
-
* @tsplus
|
|
513
|
+
* @tsplus pipeable fncts.observable.Observable zipWith
|
|
512
514
|
*/
|
|
513
|
-
export function zipWith<
|
|
514
|
-
fa: Observable<R, E, A
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
): Observable<R | R1, E | E1, C> {
|
|
518
|
-
return fa.mergeMap((a) => fb.map((b) => f(a, b)));
|
|
515
|
+
export function zipWith<A, R1, E1, B, C>(fb: Observable<R1, E1, B>, f: (a: A, b: B) => C) {
|
|
516
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, C> => {
|
|
517
|
+
return fa.mergeMap((a) => fb.map((b) => f(a, b)));
|
|
518
|
+
};
|
|
519
519
|
}
|
|
520
520
|
|
|
521
521
|
/**
|
|
522
|
-
* @tsplus
|
|
522
|
+
* @tsplus pipeable fncts.observable.Observable zip
|
|
523
523
|
*/
|
|
524
|
-
export function zip<
|
|
525
|
-
fa: Observable<R, E, A
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
return zipWith(fa, fb, Function.tuple);
|
|
524
|
+
export function zip<R1, E1, B>(fb: Observable<R1, E1, B>) {
|
|
525
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, readonly [A, B]> => {
|
|
526
|
+
return fa.zipWith(fb, Function.tuple);
|
|
527
|
+
};
|
|
529
528
|
}
|
|
530
529
|
|
|
531
530
|
/**
|
|
532
|
-
* @tsplus
|
|
531
|
+
* @tsplus pipeable fncts.observable.Observable ap
|
|
533
532
|
*/
|
|
534
|
-
export function ap<
|
|
535
|
-
fab: Observable<R, E, (a: A) => B
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
return zipWith(fab, fa, (f, a) => f(a));
|
|
533
|
+
export function ap<A, R1, E1>(fa: Observable<R1, E1, A>) {
|
|
534
|
+
return <R, E, B>(fab: Observable<R, E, (a: A) => B>): Observable<R | R1, E | E1, B> => {
|
|
535
|
+
return fab.zipWith(fa, (f, a) => f(a));
|
|
536
|
+
};
|
|
539
537
|
}
|
|
540
538
|
|
|
541
539
|
/**
|
|
542
|
-
* @tsplus
|
|
540
|
+
* @tsplus pipeable fncts.observable.Observable mapWithIndex
|
|
543
541
|
*/
|
|
544
|
-
export function mapWithIndex<
|
|
545
|
-
return fa
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
542
|
+
export function mapWithIndex<A, B>(f: (i: number, a: A) => B) {
|
|
543
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R, E, B> => {
|
|
544
|
+
return fa.operate((source, subscriber, environment) => {
|
|
545
|
+
let i = 0;
|
|
546
|
+
source.provideEnvironment(environment).subscribe(
|
|
547
|
+
new OperatorSubscriber(subscriber, {
|
|
548
|
+
next: (value) => {
|
|
549
|
+
subscriber.next(f(i++, value));
|
|
550
|
+
},
|
|
551
|
+
}),
|
|
552
|
+
);
|
|
553
|
+
});
|
|
554
|
+
};
|
|
555
555
|
}
|
|
556
556
|
|
|
557
557
|
/**
|
|
558
|
-
* @tsplus
|
|
558
|
+
* @tsplus pipeable fncts.observable.Observable map
|
|
559
559
|
*/
|
|
560
|
-
export function map_<
|
|
561
|
-
return fa
|
|
560
|
+
export function map_<A, B>(f: (a: A) => B) {
|
|
561
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R, E, B> => {
|
|
562
|
+
return fa.mapWithIndex((_, a) => f(a));
|
|
563
|
+
};
|
|
562
564
|
}
|
|
563
565
|
|
|
564
566
|
/**
|
|
565
|
-
* @tsplus
|
|
567
|
+
* @tsplus pipeable fncts.observable.Observable as
|
|
566
568
|
*/
|
|
567
|
-
export function
|
|
568
|
-
return
|
|
569
|
+
export function as<B>(b: Lazy<B>) {
|
|
570
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, B> => {
|
|
571
|
+
return fa.map(b);
|
|
572
|
+
};
|
|
569
573
|
}
|
|
570
574
|
|
|
571
575
|
/**
|
|
572
|
-
* @tsplus
|
|
576
|
+
* @tsplus pipeable fncts.observable.Observable mapError
|
|
573
577
|
*/
|
|
574
|
-
export function
|
|
575
|
-
return fa
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
578
|
+
export function mapError<E, E1>(f: (e: E) => E1) {
|
|
579
|
+
return <R, A>(fa: Observable<R, E, A>): Observable<R, E1, A> => {
|
|
580
|
+
return fa.operate((source, subscriber, environment) => {
|
|
581
|
+
source.provideEnvironment(environment).subscribe(
|
|
582
|
+
new OperatorSubscriber(subscriber, {
|
|
583
|
+
error: (err) => {
|
|
584
|
+
subscriber.error(err.map(f));
|
|
585
|
+
},
|
|
586
|
+
}),
|
|
587
|
+
);
|
|
588
|
+
});
|
|
589
|
+
};
|
|
584
590
|
}
|
|
585
591
|
|
|
586
592
|
/**
|
|
587
593
|
* @tsplus getter fncts.observable.Observable swap
|
|
588
594
|
*/
|
|
589
595
|
export function swap<R, E, A>(fa: Observable<R, E, A>): Observable<R, A, E> {
|
|
590
|
-
return
|
|
591
|
-
source.subscribe(
|
|
596
|
+
return fa.operate((source, subscriber, environment) => {
|
|
597
|
+
source.provideEnvironment(environment).subscribe(
|
|
592
598
|
new OperatorSubscriber(subscriber, {
|
|
593
599
|
next: (value) => {
|
|
594
600
|
subscriber.error(Cause.fail(value));
|
|
@@ -609,216 +615,193 @@ export function swap<R, E, A>(fa: Observable<R, E, A>): Observable<R, A, E> {
|
|
|
609
615
|
}
|
|
610
616
|
|
|
611
617
|
/**
|
|
612
|
-
* @tsplus
|
|
618
|
+
* @tsplus pipeable fncts.observable.Observable filterWithIndex
|
|
613
619
|
*/
|
|
614
|
-
export function
|
|
615
|
-
fa: Observable<R, E, A>,
|
|
620
|
+
export function filterWithIndex<A, B extends A>(
|
|
616
621
|
refinement: RefinementWithIndex<number, A, B>,
|
|
617
|
-
): Observable<R, E, B>;
|
|
618
|
-
export function
|
|
619
|
-
fa: Observable<R, E, A>,
|
|
620
|
-
predicate: PredicateWithIndex<number, A>,
|
|
621
|
-
): Observable<R, E, A>;
|
|
622
|
-
export function filterWithIndex_<R, E, A>(
|
|
623
|
-
fa: Observable<R, E, A>,
|
|
622
|
+
): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, B>;
|
|
623
|
+
export function filterWithIndex<A>(
|
|
624
624
|
predicate: PredicateWithIndex<number, A>,
|
|
625
|
-
): Observable<R, E, A>
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
625
|
+
): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, A>;
|
|
626
|
+
export function filterWithIndex<A>(predicate: PredicateWithIndex<number, A>) {
|
|
627
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R, E, A> => {
|
|
628
|
+
return fa.operate((source, subscriber, environment) => {
|
|
629
|
+
let index = 0;
|
|
630
|
+
source
|
|
631
|
+
.provideEnvironment(environment)
|
|
632
|
+
.subscribe(
|
|
633
|
+
operatorSubscriber(subscriber, { next: (value) => predicate(index++, value) && subscriber.next(value) }),
|
|
634
|
+
);
|
|
635
|
+
});
|
|
636
|
+
};
|
|
632
637
|
}
|
|
633
638
|
|
|
634
639
|
/**
|
|
635
|
-
* @tsplus
|
|
640
|
+
* @tsplus pipeable fncts.observable.Observable filter
|
|
636
641
|
*/
|
|
637
|
-
export function
|
|
638
|
-
fa: Observable<R, E, A>,
|
|
642
|
+
export function filter<A, B extends A>(
|
|
639
643
|
refinement: Refinement<A, B>,
|
|
640
|
-
): Observable<R, E, B>;
|
|
641
|
-
export function
|
|
642
|
-
export function
|
|
643
|
-
return fa
|
|
644
|
+
): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, B>;
|
|
645
|
+
export function filter<A>(predicate: Predicate<A>): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, A>;
|
|
646
|
+
export function filter<A>(predicate: Predicate<A>) {
|
|
647
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R, E, A> => {
|
|
648
|
+
return fa.filterWithIndex((_, a) => predicate(a));
|
|
649
|
+
};
|
|
644
650
|
}
|
|
645
651
|
|
|
646
652
|
/**
|
|
647
|
-
* @tsplus
|
|
653
|
+
* @tsplus pipeable fncts.observable.Observable filterMapWithIndex
|
|
648
654
|
*/
|
|
649
|
-
export function filterMapWithIndex<
|
|
650
|
-
fa: Observable<R, E, A
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
});
|
|
655
|
+
export function filterMapWithIndex<A, B>(f: (i: number, a: A) => Maybe<B>) {
|
|
656
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R, E, B> => {
|
|
657
|
+
return fa.operate((source, subscriber, environment) => {
|
|
658
|
+
let index = 0;
|
|
659
|
+
source.provideEnvironment(environment).subscribe(
|
|
660
|
+
operatorSubscriber(subscriber, {
|
|
661
|
+
next: (value) =>
|
|
662
|
+
f(index++, value).match(
|
|
663
|
+
() => noop,
|
|
664
|
+
(b) => subscriber.next(b),
|
|
665
|
+
),
|
|
666
|
+
}),
|
|
667
|
+
);
|
|
668
|
+
});
|
|
669
|
+
};
|
|
665
670
|
}
|
|
666
671
|
|
|
667
672
|
/**
|
|
668
|
-
* @tsplus
|
|
673
|
+
* @tsplus pipeable fncts.observable.Observable filterMap
|
|
669
674
|
*/
|
|
670
|
-
export function
|
|
671
|
-
return fa
|
|
675
|
+
export function filterMap<A, B>(f: (a: A) => Maybe<B>) {
|
|
676
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R, E, B> => {
|
|
677
|
+
return fa.filterMapWithIndex((_, a) => f(a));
|
|
678
|
+
};
|
|
672
679
|
}
|
|
673
680
|
|
|
674
681
|
/**
|
|
675
|
-
* @tsplus
|
|
682
|
+
* @tsplus pipeable fncts.observable.Observable partitionWithIndex
|
|
676
683
|
*/
|
|
677
|
-
export function partitionWithIndex<
|
|
678
|
-
fa: Observable<R, E, A>,
|
|
684
|
+
export function partitionWithIndex<A, B extends A>(
|
|
679
685
|
refinement: RefinementWithIndex<number, A, B>,
|
|
680
|
-
): readonly [Observable<R, E, Exclude<A, B>>, Observable<R, E, B>];
|
|
681
|
-
export function partitionWithIndex<
|
|
682
|
-
fa: Observable<R, E, A>,
|
|
686
|
+
): <R, E>(fa: Observable<R, E, A>) => readonly [Observable<R, E, Exclude<A, B>>, Observable<R, E, B>];
|
|
687
|
+
export function partitionWithIndex<A>(
|
|
683
688
|
predicate: PredicateWithIndex<number, A>,
|
|
684
|
-
): readonly [Observable<R, E, A>, Observable<R, E, A>];
|
|
685
|
-
export function partitionWithIndex<
|
|
686
|
-
fa: Observable<R, E, A>,
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
return [fa.filterWithIndex((i, a) => !predicate(i, a)), fa.filterWithIndex(predicate)];
|
|
689
|
+
): <R, E>(fa: Observable<R, E, A>) => readonly [Observable<R, E, A>, Observable<R, E, A>];
|
|
690
|
+
export function partitionWithIndex<A>(predicate: PredicateWithIndex<number, A>) {
|
|
691
|
+
return <R, E>(fa: Observable<R, E, A>): readonly [Observable<R, E, A>, Observable<R, E, A>] => {
|
|
692
|
+
return [fa.filterWithIndex((i, a) => !predicate(i, a)), fa.filterWithIndex(predicate)];
|
|
693
|
+
};
|
|
690
694
|
}
|
|
691
695
|
|
|
692
696
|
/**
|
|
693
|
-
* @tsplus
|
|
697
|
+
* @tsplus pipeable fncts.observable.Observable partition
|
|
694
698
|
*/
|
|
695
|
-
export function
|
|
696
|
-
fa: Observable<R, E, A>,
|
|
699
|
+
export function partition<A, B extends A>(
|
|
697
700
|
refinement: Refinement<A, B>,
|
|
698
|
-
): readonly [Observable<R, E, Exclude<A, B>>, Observable<R, E, B>];
|
|
699
|
-
export function
|
|
700
|
-
fa: Observable<R, E, A>,
|
|
701
|
-
predicate: Predicate<A>,
|
|
702
|
-
): readonly [Observable<R, E, A>, Observable<R, E, A>];
|
|
703
|
-
export function partition_<R, E, A>(
|
|
704
|
-
fa: Observable<R, E, A>,
|
|
701
|
+
): <R, E>(fa: Observable<R, E, A>) => readonly [Observable<R, E, Exclude<A, B>>, Observable<R, E, B>];
|
|
702
|
+
export function partition<A>(
|
|
705
703
|
predicate: Predicate<A>,
|
|
706
|
-
): readonly [Observable<R, E, A>, Observable<R, E, A>]
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
* @tsplus fluent fncts.observable.Observable partitionMapWithIndex
|
|
712
|
-
*/
|
|
713
|
-
export function partitionMapWithIndex_<R, E, A, B, C>(
|
|
714
|
-
fa: Observable<R, E, A>,
|
|
715
|
-
f: (i: number, a: A) => Either<B, C>,
|
|
716
|
-
): readonly [Observable<R, E, B>, Observable<R, E, C>] {
|
|
717
|
-
return [
|
|
718
|
-
operate_(fa, (source, subscriber) => {
|
|
719
|
-
let index = 0;
|
|
720
|
-
source.subscribe(
|
|
721
|
-
operatorSubscriber(subscriber, {
|
|
722
|
-
next: (value) => {
|
|
723
|
-
f(index++, value).match((b) => subscriber.next(b), noop);
|
|
724
|
-
},
|
|
725
|
-
}),
|
|
726
|
-
);
|
|
727
|
-
}),
|
|
728
|
-
operate_(fa, (source, subscriber) => {
|
|
729
|
-
let index = 0;
|
|
730
|
-
source.subscribe(
|
|
731
|
-
operatorSubscriber(subscriber, {
|
|
732
|
-
next: (value) => {
|
|
733
|
-
f(index++, value).match(noop, (c) => subscriber.next(c));
|
|
734
|
-
},
|
|
735
|
-
}),
|
|
736
|
-
);
|
|
737
|
-
}),
|
|
738
|
-
];
|
|
704
|
+
): <R, E>(fa: Observable<R, E, A>) => readonly [Observable<R, E, A>, Observable<R, E, A>];
|
|
705
|
+
export function partition<A>(predicate: Predicate<A>) {
|
|
706
|
+
return <R, E>(fa: Observable<R, E, A>): readonly [Observable<R, E, A>, Observable<R, E, A>] => {
|
|
707
|
+
return fa.partitionWithIndex((_, a) => predicate(a));
|
|
708
|
+
};
|
|
739
709
|
}
|
|
740
710
|
|
|
741
711
|
/**
|
|
742
|
-
* @tsplus
|
|
712
|
+
* @tsplus pipeable fncts.observable.Observable partitionMapWithIndex
|
|
743
713
|
*/
|
|
744
|
-
export function
|
|
745
|
-
fa: Observable<R, E, A>,
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
714
|
+
export function partitionMapWithIndex<A, B, C>(f: (i: number, a: A) => Either<B, C>) {
|
|
715
|
+
return <R, E>(fa: Observable<R, E, A>): readonly [Observable<R, E, B>, Observable<R, E, C>] => {
|
|
716
|
+
return [
|
|
717
|
+
fa.operate((source, subscriber, environment) => {
|
|
718
|
+
let index = 0;
|
|
719
|
+
source.provideEnvironment(environment).subscribe(
|
|
720
|
+
operatorSubscriber(subscriber, {
|
|
721
|
+
next: (value) => {
|
|
722
|
+
f(index++, value).match((b) => subscriber.next(b), noop);
|
|
723
|
+
},
|
|
724
|
+
}),
|
|
725
|
+
);
|
|
726
|
+
}),
|
|
727
|
+
fa.operate((source, subscriber, environment) => {
|
|
728
|
+
let index = 0;
|
|
729
|
+
source.provideEnvironment(environment).subscribe(
|
|
730
|
+
operatorSubscriber(subscriber, {
|
|
731
|
+
next: (value) => {
|
|
732
|
+
f(index++, value).match(noop, (c) => subscriber.next(c));
|
|
733
|
+
},
|
|
734
|
+
}),
|
|
735
|
+
);
|
|
736
|
+
}),
|
|
737
|
+
];
|
|
738
|
+
};
|
|
749
739
|
}
|
|
750
740
|
|
|
751
741
|
/**
|
|
752
|
-
* @tsplus
|
|
742
|
+
* @tsplus pipeable fncts.observable.Observable partitionMap
|
|
753
743
|
*/
|
|
754
|
-
export function
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
return self.provide(environment);
|
|
744
|
+
export function partitionMap<A, B, C>(f: (a: A) => Either<B, C>) {
|
|
745
|
+
return <R, E>(fa: Observable<R, E, A>): readonly [Observable<R, E, B>, Observable<R, E, C>] => {
|
|
746
|
+
return fa.partitionMapWithIndex((_, a) => f(a));
|
|
747
|
+
};
|
|
759
748
|
}
|
|
760
749
|
|
|
761
750
|
/**
|
|
762
|
-
* @tsplus
|
|
751
|
+
* @tsplus pipeable fncts.observable.Observable provideService
|
|
763
752
|
*/
|
|
764
|
-
export function provideService<
|
|
765
|
-
self: Observable<R, E, A>,
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
): Observable<Exclude<R, S>, E, A> {
|
|
769
|
-
return self.contramapEnvironment((environment) => environment.add(service, tag) as Environment<R>);
|
|
753
|
+
export function provideService<S>(service: S, /** @tsplus auto */ tag: Tag<S>) {
|
|
754
|
+
return <R, E, A>(self: Observable<R, E, A>): Observable<Exclude<R, S>, E, A> => {
|
|
755
|
+
return self.contramapEnvironment((environment) => environment.add(service, tag) as Environment<R>);
|
|
756
|
+
};
|
|
770
757
|
}
|
|
771
758
|
|
|
772
759
|
/**
|
|
773
|
-
* @tsplus
|
|
760
|
+
* @tsplus pipeable fncts.observable.Observable mergeMapWithIndex
|
|
774
761
|
*/
|
|
775
|
-
export function mergeMapWithIndex<
|
|
776
|
-
ma: Observable<R, E, A>,
|
|
762
|
+
export function mergeMapWithIndex<A, R1, E1, B>(
|
|
777
763
|
f: (i: number, a: A) => ObservableInput<R1, E1, B>,
|
|
778
764
|
concurrent = Infinity,
|
|
779
|
-
)
|
|
780
|
-
return
|
|
765
|
+
) {
|
|
766
|
+
return <R, E>(ma: Observable<R, E, A>): Observable<R | R1, E | E1, B> => {
|
|
767
|
+
return ma.operate((source, sub, environment) => mergeInternal(source, sub, environment, f, concurrent));
|
|
768
|
+
};
|
|
781
769
|
}
|
|
782
770
|
|
|
783
771
|
/**
|
|
784
|
-
* @tsplus
|
|
772
|
+
* @tsplus pipeable fncts.observable.Observable mergeMap
|
|
785
773
|
*/
|
|
786
|
-
export function
|
|
787
|
-
ma: Observable<R, E, A
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
): Observable<R | R1, E | E1, B> {
|
|
791
|
-
return ma.mergeMapWithIndex((_, a) => f(a), concurrent);
|
|
774
|
+
export function mergeMap<A, R1, E1, B>(f: (a: A) => ObservableInput<R1, E1, B>, concurrent = Infinity) {
|
|
775
|
+
return <R, E>(ma: Observable<R, E, A>): Observable<R | R1, E | E1, B> => {
|
|
776
|
+
return ma.mergeMapWithIndex((_, a) => f(a), concurrent);
|
|
777
|
+
};
|
|
792
778
|
}
|
|
793
779
|
|
|
794
780
|
/**
|
|
795
|
-
* @tsplus
|
|
781
|
+
* @tsplus pipeable fncts.observable.Observable concatMapWithIndex
|
|
796
782
|
*/
|
|
797
|
-
export function concatMapWithIndex<
|
|
798
|
-
ma: Observable<R, E, A
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
return ma.mergeMapWithIndex(f, 1);
|
|
783
|
+
export function concatMapWithIndex<A, R1, E1, B>(f: (i: number, a: A) => ObservableInput<R1, E1, B>) {
|
|
784
|
+
return <R, E>(ma: Observable<R, E, A>): Observable<R | R1, E | E1, B> => {
|
|
785
|
+
return ma.mergeMapWithIndex(f, 1);
|
|
786
|
+
};
|
|
802
787
|
}
|
|
803
788
|
|
|
804
789
|
/**
|
|
805
|
-
* @tsplus
|
|
790
|
+
* @tsplus pipeable fncts.observable.Observable concatMap
|
|
806
791
|
*/
|
|
807
|
-
export function
|
|
808
|
-
ma: Observable<R, E, A
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
return ma.mergeMapWithIndex((_, a) => f(a), 1);
|
|
792
|
+
export function concatMap<A, R1, E1, B>(f: (a: A) => ObservableInput<R1, E1, B>) {
|
|
793
|
+
return <R, E>(ma: Observable<R, E, A>): Observable<R | R1, E | E1, B> => {
|
|
794
|
+
return ma.mergeMapWithIndex((_, a) => f(a), 1);
|
|
795
|
+
};
|
|
812
796
|
}
|
|
813
797
|
|
|
814
798
|
/**
|
|
815
|
-
* @tsplus
|
|
799
|
+
* @tsplus pipeable fncts.observable.Observable contramapEnvironment
|
|
816
800
|
*/
|
|
817
|
-
export function contramapEnvironment<R,
|
|
818
|
-
self: Observable<R, E, A
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
return Observable.environmentWithObservable((environment) => self.provide(f(environment)));
|
|
801
|
+
export function contramapEnvironment<R, R0>(f: (r0: Environment<R0>) => Environment<R>) {
|
|
802
|
+
return <E, A>(self: Observable<R, E, A>): Observable<R0, E, A> => {
|
|
803
|
+
return Observable.environmentWithObservable((environment) => self.provideEnvironment(f(environment)));
|
|
804
|
+
};
|
|
822
805
|
}
|
|
823
806
|
|
|
824
807
|
/**
|
|
@@ -829,178 +812,173 @@ export function flatten<R, E, R1, E1, A>(mma: Observable<R, E, Observable<R1, E1
|
|
|
829
812
|
}
|
|
830
813
|
|
|
831
814
|
/**
|
|
832
|
-
* @tsplus
|
|
815
|
+
* @tsplus pipeable fncts.observable.Observable foldLeftWithIndex
|
|
833
816
|
*/
|
|
834
|
-
export function foldLeftWithIndex<
|
|
835
|
-
fa: Observable<R, E, A
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
): Observable<R, E, B> {
|
|
839
|
-
return fa.operate(scanInternal(f, initial, true, false, true));
|
|
817
|
+
export function foldLeftWithIndex<A, B>(initial: B, f: (index: number, acc: B, value: A) => B) {
|
|
818
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R, E, B> => {
|
|
819
|
+
return fa.operate(scanInternal(f, initial, true, false, true));
|
|
820
|
+
};
|
|
840
821
|
}
|
|
841
822
|
|
|
842
823
|
/**
|
|
843
|
-
* @tsplus
|
|
824
|
+
* @tsplus pipeable fncts.observable.Observable foldLeft
|
|
844
825
|
*/
|
|
845
|
-
export function foldLeft<
|
|
846
|
-
fa: Observable<R, E, A
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
): Observable<R, E, B> {
|
|
850
|
-
return fa.foldLeftWithIndex(initial, (_, b, a) => f(b, a));
|
|
826
|
+
export function foldLeft<A, B>(initial: B, f: (acc: B, value: A) => B) {
|
|
827
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R, E, B> => {
|
|
828
|
+
return fa.foldLeftWithIndex(initial, (_, b, a) => f(b, a));
|
|
829
|
+
};
|
|
851
830
|
}
|
|
852
831
|
|
|
853
832
|
/**
|
|
854
|
-
* @tsplus
|
|
833
|
+
* @tsplus pipeable fncts.observable.Observable at
|
|
855
834
|
*/
|
|
856
|
-
export function
|
|
857
|
-
return fa
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
835
|
+
export function at(index: number) {
|
|
836
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, Maybe<A>> => {
|
|
837
|
+
return fa
|
|
838
|
+
.filterWithIndex((i) => i === index)
|
|
839
|
+
.take(1)
|
|
840
|
+
.map(Maybe.just)
|
|
841
|
+
.onEmpty(() => Nothing());
|
|
842
|
+
};
|
|
862
843
|
}
|
|
863
844
|
|
|
864
845
|
/**
|
|
865
|
-
* @tsplus
|
|
846
|
+
* @tsplus pipeable fncts.observable.Observable audit
|
|
866
847
|
*/
|
|
867
|
-
export function
|
|
868
|
-
fa: Observable<R, E, A
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
subscriber.
|
|
882
|
-
}
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
848
|
+
export function audit<A, R1, E1>(durationSelector: (value: A) => ObservableInput<R1, E1, any>) {
|
|
849
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, A> => {
|
|
850
|
+
return fa.operate((source, subscriber, environment) => {
|
|
851
|
+
let lastValue: Maybe<A> = Nothing();
|
|
852
|
+
let durationSubscriber: Subscriber<any, any> | null = null;
|
|
853
|
+
let isComplete = false;
|
|
854
|
+
const endDuration = () => {
|
|
855
|
+
durationSubscriber?.unsubscribe();
|
|
856
|
+
durationSubscriber = null;
|
|
857
|
+
if (lastValue.isJust()) {
|
|
858
|
+
const { value } = lastValue;
|
|
859
|
+
lastValue = Nothing();
|
|
860
|
+
subscriber.next(value);
|
|
861
|
+
}
|
|
862
|
+
isComplete && subscriber.complete();
|
|
863
|
+
};
|
|
864
|
+
const cleanupDuration = () => {
|
|
865
|
+
durationSubscriber = null;
|
|
866
|
+
isComplete && subscriber.complete();
|
|
867
|
+
};
|
|
868
|
+
source.provideEnvironment(environment).subscribe(
|
|
869
|
+
operatorSubscriber(subscriber, {
|
|
870
|
+
next: (value) => {
|
|
871
|
+
lastValue = Just(value);
|
|
872
|
+
if (!durationSubscriber) {
|
|
873
|
+
from(durationSelector(value))
|
|
874
|
+
.provideEnvironment(environment)
|
|
875
|
+
.subscribe(
|
|
876
|
+
(durationSubscriber = operatorSubscriber(subscriber, {
|
|
877
|
+
next: endDuration,
|
|
878
|
+
complete: cleanupDuration,
|
|
879
|
+
})),
|
|
880
|
+
);
|
|
881
|
+
}
|
|
882
|
+
},
|
|
883
|
+
complete: () => {
|
|
884
|
+
isComplete = true;
|
|
885
|
+
(lastValue.isNothing() || !durationSubscriber || durationSubscriber.closed) && subscriber.complete();
|
|
886
|
+
},
|
|
887
|
+
}),
|
|
888
|
+
);
|
|
889
|
+
});
|
|
890
|
+
};
|
|
908
891
|
}
|
|
909
892
|
|
|
910
893
|
/**
|
|
911
|
-
* @tsplus
|
|
894
|
+
* @tsplus pipeable fncts.observable.Observable auditTime
|
|
912
895
|
*/
|
|
913
|
-
export function
|
|
914
|
-
fa: Observable<R, E, A
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
): Observable<R, E, A> {
|
|
918
|
-
return fa.audit(() => timer(duration, scheduler));
|
|
896
|
+
export function auditTime(duration: number, scheduler: SchedulerLike = asyncScheduler) {
|
|
897
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A> => {
|
|
898
|
+
return fa.audit(() => timer(duration, scheduler));
|
|
899
|
+
};
|
|
919
900
|
}
|
|
920
901
|
|
|
921
902
|
/**
|
|
922
|
-
* @tsplus
|
|
903
|
+
* @tsplus pipeable fncts.observable.Observable buffer
|
|
923
904
|
*/
|
|
924
|
-
export function
|
|
925
|
-
fa: Observable<R, E, A
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
},
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
});
|
|
905
|
+
export function buffer<R1, E1>(closingNotifier: Observable<R1, E1, any>) {
|
|
906
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, ReadonlyArray<A>> => {
|
|
907
|
+
return fa.operate((source, subscriber, environment) => {
|
|
908
|
+
let buffer: A[] = [];
|
|
909
|
+
source.provideEnvironment(environment).subscribe(
|
|
910
|
+
operatorSubscriber(subscriber, {
|
|
911
|
+
next: (value) => buffer.push(value),
|
|
912
|
+
complete: () => {
|
|
913
|
+
subscriber.next(buffer);
|
|
914
|
+
subscriber.complete();
|
|
915
|
+
},
|
|
916
|
+
}),
|
|
917
|
+
);
|
|
918
|
+
closingNotifier.provideEnvironment(environment).subscribe(
|
|
919
|
+
operatorSubscriber(subscriber, {
|
|
920
|
+
next: () => {
|
|
921
|
+
const b = buffer;
|
|
922
|
+
buffer = [];
|
|
923
|
+
subscriber.next(b);
|
|
924
|
+
},
|
|
925
|
+
complete: noop,
|
|
926
|
+
}),
|
|
927
|
+
);
|
|
928
|
+
return () => {
|
|
929
|
+
buffer = null!;
|
|
930
|
+
};
|
|
931
|
+
});
|
|
932
|
+
};
|
|
953
933
|
}
|
|
954
934
|
|
|
955
935
|
/**
|
|
956
|
-
* @tsplus
|
|
936
|
+
* @tsplus pipeable fncts.observable.Observable bufferCount
|
|
957
937
|
*/
|
|
958
|
-
export function
|
|
959
|
-
fa: Observable<R, E, A
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
let toEmit: A[][] | null = null;
|
|
974
|
-
if (count++ % startBufferEvery! === 0) {
|
|
975
|
-
buffers.push([]);
|
|
976
|
-
}
|
|
977
|
-
for (const buffer of buffers) {
|
|
978
|
-
buffer.push(value);
|
|
979
|
-
if (bufferSize <= buffer.length) {
|
|
980
|
-
toEmit = toEmit ?? [];
|
|
981
|
-
toEmit.push(buffer);
|
|
938
|
+
export function bufferCount(bufferSize: number, startBufferEvery?: number) {
|
|
939
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, ReadonlyArray<A>> => {
|
|
940
|
+
// eslint-disable-next-line no-param-reassign
|
|
941
|
+
startBufferEvery = startBufferEvery ?? bufferSize;
|
|
942
|
+
return fa.operate((source, subscriber, environment) => {
|
|
943
|
+
let buffers: A[][] = [];
|
|
944
|
+
let count = 0;
|
|
945
|
+
source.provideEnvironment(environment).subscribe(
|
|
946
|
+
operatorSubscriber(
|
|
947
|
+
subscriber,
|
|
948
|
+
{
|
|
949
|
+
next: (value) => {
|
|
950
|
+
let toEmit: A[][] | null = null;
|
|
951
|
+
if (count++ % startBufferEvery! === 0) {
|
|
952
|
+
buffers.push([]);
|
|
982
953
|
}
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
954
|
+
for (const buffer of buffers) {
|
|
955
|
+
buffer.push(value);
|
|
956
|
+
if (bufferSize <= buffer.length) {
|
|
957
|
+
toEmit = toEmit ?? [];
|
|
958
|
+
toEmit.push(buffer);
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
if (toEmit) {
|
|
962
|
+
for (const buffer of toEmit) {
|
|
963
|
+
arrayRemove(buffers, buffer);
|
|
964
|
+
subscriber.next(buffer);
|
|
965
|
+
}
|
|
966
|
+
}
|
|
967
|
+
},
|
|
968
|
+
complete: () => {
|
|
969
|
+
for (const buffer of buffers) {
|
|
987
970
|
subscriber.next(buffer);
|
|
988
971
|
}
|
|
989
|
-
|
|
972
|
+
subscriber.complete();
|
|
973
|
+
},
|
|
990
974
|
},
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
subscriber.next(buffer);
|
|
994
|
-
}
|
|
995
|
-
subscriber.complete();
|
|
975
|
+
() => {
|
|
976
|
+
buffers = null!;
|
|
996
977
|
},
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
),
|
|
1002
|
-
);
|
|
1003
|
-
});
|
|
978
|
+
),
|
|
979
|
+
);
|
|
980
|
+
});
|
|
981
|
+
};
|
|
1004
982
|
}
|
|
1005
983
|
|
|
1006
984
|
export interface BufferTimeConfig {
|
|
@@ -1011,191 +989,198 @@ export interface BufferTimeConfig {
|
|
|
1011
989
|
}
|
|
1012
990
|
|
|
1013
991
|
/**
|
|
1014
|
-
* @tsplus
|
|
1015
|
-
*/
|
|
1016
|
-
export function
|
|
1017
|
-
fa: Observable<R, E, A
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
992
|
+
* @tsplus pipeable fncts.observable.Observable bufferTime
|
|
993
|
+
*/
|
|
994
|
+
export function bufferTime(config: BufferTimeConfig) {
|
|
995
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, ReadonlyArray<A>> => {
|
|
996
|
+
const {
|
|
997
|
+
bufferTimeSpan,
|
|
998
|
+
bufferCreationInterval = null,
|
|
999
|
+
maxBufferSize = Infinity,
|
|
1000
|
+
scheduler = asyncScheduler,
|
|
1001
|
+
} = config;
|
|
1002
|
+
return fa.operate((source, subscriber, environment) => {
|
|
1003
|
+
let bufferRecords:
|
|
1004
|
+
| {
|
|
1005
|
+
buffer: A[];
|
|
1006
|
+
subs: Subscription;
|
|
1007
|
+
}[]
|
|
1008
|
+
| null = [];
|
|
1009
|
+
let restartOnEmit = true;
|
|
1010
|
+
const emit = (record: { buffer: A[]; subs: Subscription }) => {
|
|
1011
|
+
const { buffer, subs } = record;
|
|
1012
|
+
subs.unsubscribe();
|
|
1013
|
+
arrayRemove(bufferRecords, record);
|
|
1014
|
+
subscriber.next(buffer);
|
|
1015
|
+
restartOnEmit && startBuffer();
|
|
1016
|
+
};
|
|
1017
|
+
const startBuffer = () => {
|
|
1018
|
+
if (bufferRecords) {
|
|
1019
|
+
const subs = new Subscription();
|
|
1020
|
+
subscriber.add(subs);
|
|
1021
|
+
const buffer: A[] = [];
|
|
1022
|
+
const record = {
|
|
1023
|
+
buffer,
|
|
1024
|
+
subs,
|
|
1025
|
+
};
|
|
1026
|
+
bufferRecords.push(record);
|
|
1027
|
+
subs.add(scheduler.schedule(() => emit(record), bufferTimeSpan));
|
|
1028
|
+
}
|
|
1029
|
+
};
|
|
1030
|
+
bufferCreationInterval !== null && bufferCreationInterval >= 0
|
|
1031
|
+
? subscriber.add(
|
|
1032
|
+
scheduler.schedule(function () {
|
|
1033
|
+
startBuffer();
|
|
1034
|
+
!this.closed && subscriber.add(this.schedule(null, bufferCreationInterval));
|
|
1035
|
+
}, bufferCreationInterval),
|
|
1036
|
+
)
|
|
1037
|
+
: (restartOnEmit = true);
|
|
1038
|
+
startBuffer();
|
|
1039
|
+
const bufferTimeSubscriber = operatorSubscriber(
|
|
1040
|
+
subscriber,
|
|
1041
|
+
{
|
|
1042
|
+
next: (value: A) => {
|
|
1043
|
+
const recordsCopy = bufferRecords!.slice();
|
|
1044
|
+
for (const record of recordsCopy) {
|
|
1045
|
+
const { buffer } = record;
|
|
1046
|
+
buffer.push(value);
|
|
1047
|
+
maxBufferSize <= buffer.length && emit(record);
|
|
1048
|
+
}
|
|
1049
|
+
},
|
|
1050
|
+
complete: () => {
|
|
1051
|
+
while (bufferRecords?.length) {
|
|
1052
|
+
subscriber.next(bufferRecords.shift()!.buffer);
|
|
1053
|
+
}
|
|
1054
|
+
bufferTimeSubscriber?.unsubscribe();
|
|
1055
|
+
subscriber.complete();
|
|
1056
|
+
subscriber.unsubscribe();
|
|
1057
|
+
},
|
|
1076
1058
|
},
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
}
|
|
1059
|
+
() => (bufferRecords = null),
|
|
1060
|
+
);
|
|
1061
|
+
source.provideEnvironment(environment).subscribe(bufferTimeSubscriber);
|
|
1062
|
+
});
|
|
1063
|
+
};
|
|
1082
1064
|
}
|
|
1083
1065
|
|
|
1084
1066
|
/**
|
|
1085
|
-
* @tsplus
|
|
1067
|
+
* @tsplus pipeable fncts.observable.Observable bufferToggle
|
|
1086
1068
|
*/
|
|
1087
|
-
export function
|
|
1088
|
-
fa: Observable<R, E, A>,
|
|
1069
|
+
export function bufferToggle<R1, E1, B, R2, E2>(
|
|
1089
1070
|
openings: ObservableInput<R1, E1, B>,
|
|
1090
1071
|
closingSelector: (value: B) => ObservableInput<R2, E2, any>,
|
|
1091
|
-
)
|
|
1092
|
-
return fa
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1072
|
+
) {
|
|
1073
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R | R1 | R2, E | E1 | E2, ReadonlyArray<A>> => {
|
|
1074
|
+
return fa.operate((source, subscriber, environment) => {
|
|
1075
|
+
const buffers: A[][] = [];
|
|
1076
|
+
from(openings)
|
|
1077
|
+
.provideEnvironment(environment)
|
|
1078
|
+
.subscribe(
|
|
1079
|
+
operatorSubscriber(subscriber, {
|
|
1080
|
+
next: (openValue) => {
|
|
1081
|
+
const buffer: A[] = [];
|
|
1082
|
+
buffers.push(buffer);
|
|
1083
|
+
const closingSubscription = new Subscription();
|
|
1084
|
+
const emitBuffer = () => {
|
|
1085
|
+
arrayRemove(buffers, buffer);
|
|
1086
|
+
subscriber.next(buffer);
|
|
1087
|
+
closingSubscription.unsubscribe();
|
|
1088
|
+
};
|
|
1089
|
+
closingSubscription.add(
|
|
1090
|
+
from(closingSelector(openValue))
|
|
1091
|
+
.provideEnvironment(environment)
|
|
1092
|
+
.subscribe(operatorSubscriber(subscriber, { next: emitBuffer, complete: noop })),
|
|
1093
|
+
);
|
|
1094
|
+
},
|
|
1095
|
+
complete: noop,
|
|
1096
|
+
}),
|
|
1097
|
+
);
|
|
1098
|
+
source.provideEnvironment(environment).subscribe(
|
|
1099
|
+
operatorSubscriber(subscriber, {
|
|
1100
|
+
next: (value) => {
|
|
1101
|
+
for (const buffer of buffers) {
|
|
1102
|
+
buffer.push(value);
|
|
1103
|
+
}
|
|
1104
|
+
},
|
|
1105
|
+
complete: () => {
|
|
1106
|
+
while (buffers.length > 0) {
|
|
1107
|
+
subscriber.next(buffers.shift()!);
|
|
1108
|
+
}
|
|
1109
|
+
subscriber.complete();
|
|
1110
|
+
},
|
|
1111
|
+
}),
|
|
1112
|
+
);
|
|
1113
|
+
});
|
|
1114
|
+
};
|
|
1130
1115
|
}
|
|
1131
1116
|
|
|
1132
1117
|
/**
|
|
1133
|
-
* @tsplus
|
|
1134
|
-
*/
|
|
1135
|
-
export function
|
|
1136
|
-
fa: Observable<R, E, A
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
);
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
subscriber.complete();
|
|
1118
|
+
* @tsplus pipeable fncts.observable.Observable bufferWhen
|
|
1119
|
+
*/
|
|
1120
|
+
export function bufferWhen<R1, E1>(closingSelector: () => ObservableInput<R1, E1, any>) {
|
|
1121
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, ReadonlyArray<A>> => {
|
|
1122
|
+
return fa.operate((source, subscriber, environment) => {
|
|
1123
|
+
let buffer: A[] | null = null;
|
|
1124
|
+
let closingSubscriber: Subscriber<E | E1, A> | null = null;
|
|
1125
|
+
const openBuffer = () => {
|
|
1126
|
+
closingSubscriber?.unsubscribe();
|
|
1127
|
+
const b = buffer;
|
|
1128
|
+
buffer = [];
|
|
1129
|
+
b && subscriber.next(b);
|
|
1130
|
+
from(closingSelector())
|
|
1131
|
+
.provideEnvironment(environment)
|
|
1132
|
+
.subscribe((closingSubscriber = operatorSubscriber(subscriber, { next: openBuffer, complete: noop })));
|
|
1133
|
+
};
|
|
1134
|
+
openBuffer();
|
|
1135
|
+
source.provideEnvironment(environment).subscribe(
|
|
1136
|
+
operatorSubscriber(
|
|
1137
|
+
subscriber,
|
|
1138
|
+
{
|
|
1139
|
+
next: (value) => buffer?.push(value),
|
|
1140
|
+
complete: () => {
|
|
1141
|
+
buffer && subscriber.next(buffer);
|
|
1142
|
+
subscriber.complete();
|
|
1143
|
+
},
|
|
1160
1144
|
},
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
)
|
|
1164
|
-
);
|
|
1165
|
-
}
|
|
1145
|
+
() => (buffer = closingSubscriber = null),
|
|
1146
|
+
),
|
|
1147
|
+
);
|
|
1148
|
+
});
|
|
1149
|
+
};
|
|
1166
1150
|
}
|
|
1167
1151
|
|
|
1168
1152
|
/**
|
|
1169
|
-
* @tsplus
|
|
1153
|
+
* @tsplus pipeable fncts.observable.Observable catchAllCause
|
|
1170
1154
|
*/
|
|
1171
1155
|
export function catchAllCause<R, E, A, R1, E1, B>(
|
|
1172
|
-
self: Observable<R, E, A>,
|
|
1173
1156
|
f: (cause: Cause<E>, caught: Observable<R | R1, E | E1, A | B>) => ObservableInput<R | R1, E1, B>,
|
|
1174
|
-
)
|
|
1175
|
-
return self
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
innerSub
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1157
|
+
) {
|
|
1158
|
+
return (self: Observable<R, E, A>): Observable<R | R1, E1, A | B> => {
|
|
1159
|
+
return self.operate((source, subscriber, environment) => {
|
|
1160
|
+
let innerSub: Subscription | null = null;
|
|
1161
|
+
let syncUnsub = false;
|
|
1162
|
+
let handledResult: Observable<R | R1, E1, B>;
|
|
1163
|
+
innerSub = source.provideEnvironment(environment).subscribe(
|
|
1164
|
+
operatorSubscriber(subscriber, {
|
|
1165
|
+
error: (cause) => {
|
|
1166
|
+
handledResult = from(f(cause, source.catchAllCause(f)));
|
|
1167
|
+
if (innerSub) {
|
|
1168
|
+
innerSub.unsubscribe();
|
|
1169
|
+
innerSub = null;
|
|
1170
|
+
handledResult.provideEnvironment(environment).subscribe(subscriber);
|
|
1171
|
+
} else {
|
|
1172
|
+
syncUnsub = true;
|
|
1173
|
+
}
|
|
1174
|
+
},
|
|
1175
|
+
}),
|
|
1176
|
+
);
|
|
1177
|
+
if (syncUnsub) {
|
|
1178
|
+
innerSub.unsubscribe();
|
|
1179
|
+
innerSub = null;
|
|
1180
|
+
handledResult!.provideEnvironment(environment).subscribe(subscriber);
|
|
1181
|
+
}
|
|
1182
|
+
});
|
|
1183
|
+
};
|
|
1199
1184
|
}
|
|
1200
1185
|
|
|
1201
1186
|
/**
|
|
@@ -1204,23 +1189,26 @@ export function catchAllCause<R, E, A, R1, E1, B>(
|
|
|
1204
1189
|
export function concatAll<R, E, R1, E1, A>(
|
|
1205
1190
|
ffa: Observable<R, E, ObservableInput<R1, E1, A>>,
|
|
1206
1191
|
): Observable<R | R1, E | E1, A> {
|
|
1207
|
-
return
|
|
1192
|
+
return ffa.mergeAll(1);
|
|
1208
1193
|
}
|
|
1209
1194
|
|
|
1210
1195
|
/**
|
|
1211
|
-
* @tsplus
|
|
1196
|
+
* @tsplus pipeable fncts.observable.Observable concat
|
|
1212
1197
|
*/
|
|
1213
|
-
export function
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
): Observable<
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
> {
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1198
|
+
export function concat<O extends ReadonlyArray<ObservableInput<any, any>>>(...sources: O) {
|
|
1199
|
+
return <R, E, A>(
|
|
1200
|
+
fa: Observable<R, E, A>,
|
|
1201
|
+
): Observable<
|
|
1202
|
+
R | Observable.EnvironmentOf<O[number]>,
|
|
1203
|
+
E | Observable.ErrorOf<O[number]>,
|
|
1204
|
+
A | Observable.TypeOf<O[number]>
|
|
1205
|
+
> => {
|
|
1206
|
+
return fa.operate((source, subscriber, environment) => {
|
|
1207
|
+
fromArrayLike([source, ...sources])
|
|
1208
|
+
.concatAll.provideEnvironment(environment)
|
|
1209
|
+
.subscribe(subscriber);
|
|
1210
|
+
});
|
|
1211
|
+
};
|
|
1224
1212
|
}
|
|
1225
1213
|
|
|
1226
1214
|
/**
|
|
@@ -1231,20 +1219,21 @@ export function count<R, E, A>(fa: Observable<R, E, A>): Observable<R, E, number
|
|
|
1231
1219
|
}
|
|
1232
1220
|
|
|
1233
1221
|
/**
|
|
1234
|
-
* @tsplus
|
|
1222
|
+
* @tsplus pipeable fncts.observable.Observable countWithIndex
|
|
1235
1223
|
*/
|
|
1236
|
-
export function countWithIndex<
|
|
1237
|
-
fa: Observable<R, E, A
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
return fa.foldLeftWithIndex(0, (i, total, v) => (predicate(i, v) ? total + 1 : total));
|
|
1224
|
+
export function countWithIndex<A>(predicate: PredicateWithIndex<number, A>) {
|
|
1225
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R, E, number> => {
|
|
1226
|
+
return fa.foldLeftWithIndex(0, (i, total, v) => (predicate(i, v) ? total + 1 : total));
|
|
1227
|
+
};
|
|
1241
1228
|
}
|
|
1242
1229
|
|
|
1243
1230
|
/**
|
|
1244
|
-
* @tsplus
|
|
1231
|
+
* @tsplus pipeable fncts.observable.Observable countWith
|
|
1245
1232
|
*/
|
|
1246
|
-
export function
|
|
1247
|
-
return fa
|
|
1233
|
+
export function countWith<A>(predicate: Predicate<A>) {
|
|
1234
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R, E, number> => {
|
|
1235
|
+
return fa.countWithIndex((_, a) => predicate(a));
|
|
1236
|
+
};
|
|
1248
1237
|
}
|
|
1249
1238
|
|
|
1250
1239
|
/**
|
|
@@ -1254,134 +1243,145 @@ export function combineLatestAll<R, E, R1, E1, A>(
|
|
|
1254
1243
|
fa: Observable<R, E, ObservableInput<R1, E1, A>>,
|
|
1255
1244
|
): Observable<R | R1, E | E1, ReadonlyArray<A>> {
|
|
1256
1245
|
return joinAllInternal(fa, (sources) =>
|
|
1257
|
-
!sources.length ? empty() : (
|
|
1246
|
+
!sources.length ? empty() : (zipLatest(sources[0]!, ...sources.slice(1)) as any),
|
|
1258
1247
|
);
|
|
1259
1248
|
}
|
|
1260
1249
|
|
|
1261
1250
|
/**
|
|
1262
|
-
* @tsplus
|
|
1251
|
+
* @tsplus pipeable fncts.observable.Observable zipLatest
|
|
1263
1252
|
*/
|
|
1264
|
-
export function
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
): Observable<
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1253
|
+
export function zipLatest<O extends ReadonlyArray<ObservableInput<any, any, any>>>(...sources: O) {
|
|
1254
|
+
return <R, E, A>(
|
|
1255
|
+
self: ObservableInput<R, E, A>,
|
|
1256
|
+
): Observable<
|
|
1257
|
+
R | Observable.EnvironmentOf<O[number]>,
|
|
1258
|
+
E | Observable.ErrorOf<O[number]>,
|
|
1259
|
+
[
|
|
1260
|
+
A,
|
|
1261
|
+
...{
|
|
1262
|
+
[K in keyof O]: Observable.TypeOf<O[K]>;
|
|
1263
|
+
},
|
|
1264
|
+
]
|
|
1265
|
+
> => {
|
|
1266
|
+
if (!sources.length) {
|
|
1267
|
+
return from(self).unsafeCoerce();
|
|
1268
|
+
}
|
|
1269
|
+
return from(self).operate((source, subscriber, environment) => {
|
|
1270
|
+
combineLatestInternal(subscriber, environment, [source, ...sources]);
|
|
1271
|
+
});
|
|
1272
|
+
};
|
|
1278
1273
|
}
|
|
1279
1274
|
|
|
1280
1275
|
/**
|
|
1281
|
-
* @tsplus
|
|
1276
|
+
* @tsplus pipeable fncts.observable.Observable zipWithLatest
|
|
1282
1277
|
*/
|
|
1283
|
-
export function
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
next
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1278
|
+
export function zipWithLatest<A, R1, E1, B, C>(that: ObservableInput<R1, E1, B>, f: (a: A, b: B) => C) {
|
|
1279
|
+
return <R, E>(self: Observable<R, E, A>): Observable<R | R1, E | E1, C> => {
|
|
1280
|
+
return self.zipLatest(Observable.from(that)).map(f.tupled);
|
|
1281
|
+
};
|
|
1282
|
+
}
|
|
1283
|
+
|
|
1284
|
+
/**
|
|
1285
|
+
* @tsplus pipeable fncts.observable.Observable debounceWith
|
|
1286
|
+
*/
|
|
1287
|
+
export function debounceWith<A, R1, E1>(durationSelector: (value: A) => ObservableInput<R1, E1, any>) {
|
|
1288
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, A> => {
|
|
1289
|
+
return fa.operate((source, subscriber, environment) => {
|
|
1290
|
+
let lastValue: Maybe<A> = Nothing();
|
|
1291
|
+
let durationSubscriber: Subscriber<E1, any> | null = null;
|
|
1292
|
+
const emit = () => {
|
|
1293
|
+
durationSubscriber?.unsubscribe();
|
|
1294
|
+
durationSubscriber = null;
|
|
1295
|
+
if (lastValue.isJust()) {
|
|
1296
|
+
const { value } = lastValue;
|
|
1297
|
+
lastValue = Nothing();
|
|
1298
|
+
subscriber.next(value);
|
|
1299
|
+
}
|
|
1300
|
+
};
|
|
1301
|
+
source.provideEnvironment(environment).subscribe(
|
|
1302
|
+
operatorSubscriber(
|
|
1303
|
+
subscriber,
|
|
1304
|
+
{
|
|
1305
|
+
next: (value) => {
|
|
1306
|
+
durationSubscriber?.unsubscribe();
|
|
1307
|
+
lastValue = Just(value);
|
|
1308
|
+
durationSubscriber = operatorSubscriber(subscriber, { next: emit, complete: noop });
|
|
1309
|
+
from(durationSelector(value)).provideEnvironment(environment).subscribe(durationSubscriber);
|
|
1310
|
+
},
|
|
1311
|
+
complete: () => {
|
|
1312
|
+
emit();
|
|
1313
|
+
subscriber.complete();
|
|
1314
|
+
},
|
|
1308
1315
|
},
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
subscriber.complete();
|
|
1316
|
+
() => {
|
|
1317
|
+
lastValue = durationSubscriber = null!;
|
|
1312
1318
|
},
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
),
|
|
1318
|
-
);
|
|
1319
|
-
});
|
|
1319
|
+
),
|
|
1320
|
+
);
|
|
1321
|
+
});
|
|
1322
|
+
};
|
|
1320
1323
|
}
|
|
1321
1324
|
|
|
1322
1325
|
/**
|
|
1323
|
-
* @tsplus
|
|
1326
|
+
* @tsplus pipeable fncts.observable.Observable debounce
|
|
1324
1327
|
*/
|
|
1325
|
-
export function
|
|
1326
|
-
fa: Observable<R, E, A
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
subscriber.add(activeTask);
|
|
1350
|
-
return;
|
|
1328
|
+
export function debounce(dueTime: number, scheduler: SchedulerLike = asyncScheduler) {
|
|
1329
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A> => {
|
|
1330
|
+
return fa.operate((source, subscriber, environment) => {
|
|
1331
|
+
let activeTask: Subscription | null = null;
|
|
1332
|
+
let lastValue: A | null = null;
|
|
1333
|
+
let lastTime: number | null = null;
|
|
1334
|
+
const emit = () => {
|
|
1335
|
+
if (activeTask) {
|
|
1336
|
+
activeTask.unsubscribe();
|
|
1337
|
+
activeTask = null;
|
|
1338
|
+
const value = lastValue!;
|
|
1339
|
+
lastValue = null;
|
|
1340
|
+
subscriber.next(value);
|
|
1341
|
+
}
|
|
1342
|
+
};
|
|
1343
|
+
function emitWhenIdle(this: SchedulerAction<unknown>) {
|
|
1344
|
+
const targetTime = lastTime! + dueTime;
|
|
1345
|
+
const now = scheduler.now();
|
|
1346
|
+
if (now < targetTime) {
|
|
1347
|
+
activeTask = this.schedule(undefined, targetTime - now);
|
|
1348
|
+
subscriber.add(activeTask);
|
|
1349
|
+
return;
|
|
1350
|
+
}
|
|
1351
|
+
emit();
|
|
1351
1352
|
}
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1353
|
+
source.provideEnvironment(environment).subscribe(
|
|
1354
|
+
operatorSubscriber(
|
|
1355
|
+
subscriber,
|
|
1356
|
+
{
|
|
1357
|
+
next: (value) => {
|
|
1358
|
+
lastValue = value;
|
|
1359
|
+
lastTime = scheduler.now();
|
|
1360
|
+
if (!activeTask) {
|
|
1361
|
+
activeTask = scheduler.schedule(emitWhenIdle, dueTime);
|
|
1362
|
+
subscriber.add(activeTask);
|
|
1363
|
+
}
|
|
1364
|
+
},
|
|
1365
|
+
complete: () => {
|
|
1366
|
+
emit();
|
|
1367
|
+
subscriber.complete();
|
|
1368
|
+
},
|
|
1365
1369
|
},
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
subscriber.complete();
|
|
1370
|
+
() => {
|
|
1371
|
+
lastValue = activeTask = null;
|
|
1369
1372
|
},
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
),
|
|
1375
|
-
);
|
|
1376
|
-
});
|
|
1373
|
+
),
|
|
1374
|
+
);
|
|
1375
|
+
});
|
|
1376
|
+
};
|
|
1377
1377
|
}
|
|
1378
1378
|
|
|
1379
1379
|
/**
|
|
1380
1380
|
* @tsplus getter fncts.observable.Observable either
|
|
1381
1381
|
*/
|
|
1382
1382
|
export function either<R, E, A>(fa: Observable<R, E, A>): Observable<R, never, Either<E, A>> {
|
|
1383
|
-
return fa.operate((source, subscriber) => {
|
|
1384
|
-
source.subscribe(
|
|
1383
|
+
return fa.operate((source, subscriber, environment) => {
|
|
1384
|
+
source.provideEnvironment(environment).subscribe(
|
|
1385
1385
|
operatorSubscriber(subscriber, {
|
|
1386
1386
|
next: (value) => {
|
|
1387
1387
|
subscriber.next(Either.right(value));
|
|
@@ -1398,54 +1398,54 @@ export function either<R, E, A>(fa: Observable<R, E, A>): Observable<R, never, E
|
|
|
1398
1398
|
}
|
|
1399
1399
|
|
|
1400
1400
|
/**
|
|
1401
|
-
* @tsplus
|
|
1401
|
+
* @tsplus pipeable fncts.observable.Observable delayWithIndex
|
|
1402
1402
|
*/
|
|
1403
|
-
export function delayWithIndex<
|
|
1404
|
-
fa: Observable<R, E, A
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
return fa.mergeMapWithIndex((i, a) => f(i, a).take(1).as(a));
|
|
1403
|
+
export function delayWithIndex<A, R1, E1>(f: (index: number, value: A) => Observable<R1, E1, any>) {
|
|
1404
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, A> => {
|
|
1405
|
+
return fa.mergeMapWithIndex((i, a) => f(i, a).take(1).as(a));
|
|
1406
|
+
};
|
|
1408
1407
|
}
|
|
1409
1408
|
|
|
1410
1409
|
/**
|
|
1411
|
-
* @tsplus
|
|
1410
|
+
* @tsplus pipeable fncts.observable.Observable delayWith
|
|
1412
1411
|
*/
|
|
1413
|
-
export function
|
|
1414
|
-
fa: Observable<R, E, A
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
return fa.delayWithIndex((_, a) => f(a));
|
|
1412
|
+
export function delayWith<A, R1, E1>(f: (value: A) => Observable<R1, E1, any>) {
|
|
1413
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, A> => {
|
|
1414
|
+
return fa.delayWithIndex((_, a) => f(a));
|
|
1415
|
+
};
|
|
1418
1416
|
}
|
|
1419
1417
|
|
|
1420
1418
|
/**
|
|
1421
|
-
* @tsplus
|
|
1419
|
+
* @tsplus pipeable fncts.observable.Observable delay
|
|
1422
1420
|
*/
|
|
1423
|
-
export function
|
|
1424
|
-
fa: Observable<R, E, A
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
const duration = timer(due, scheduler);
|
|
1429
|
-
return delayWith_(fa, () => duration);
|
|
1421
|
+
export function delay(due: number | Date, scheduler: SchedulerLike = asyncScheduler) {
|
|
1422
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A> => {
|
|
1423
|
+
const duration = timer(due, scheduler);
|
|
1424
|
+
return fa.delayWith(() => duration);
|
|
1425
|
+
};
|
|
1430
1426
|
}
|
|
1431
1427
|
|
|
1432
1428
|
/**
|
|
1433
1429
|
* @tsplus getter fncts.observable.Observable dematerialize
|
|
1434
1430
|
*/
|
|
1435
1431
|
export function dematerialize<R, E, E1, A>(fa: Observable<R, E, Notification<E1, A>>): Observable<R, E | E1, A> {
|
|
1436
|
-
return fa.operate((source, subscriber) => {
|
|
1437
|
-
source
|
|
1432
|
+
return fa.operate((source, subscriber, environment) => {
|
|
1433
|
+
source
|
|
1434
|
+
.provideEnvironment(environment)
|
|
1435
|
+
.subscribe(operatorSubscriber(subscriber, { next: (notification) => notification.observe(subscriber) }));
|
|
1438
1436
|
});
|
|
1439
1437
|
}
|
|
1440
1438
|
|
|
1441
1439
|
/**
|
|
1442
|
-
* @tsplus
|
|
1440
|
+
* @tsplus pipeable fncts.observable.Observable ensuring
|
|
1443
1441
|
*/
|
|
1444
|
-
export function
|
|
1445
|
-
return fa
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1442
|
+
export function ensuring(finalizer: () => void) {
|
|
1443
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A> => {
|
|
1444
|
+
return fa.operate((source, subscriber, environment) => {
|
|
1445
|
+
source.provideEnvironment(environment).subscribe(subscriber);
|
|
1446
|
+
subscriber.add(finalizer);
|
|
1447
|
+
});
|
|
1448
|
+
};
|
|
1449
1449
|
}
|
|
1450
1450
|
|
|
1451
1451
|
/**
|
|
@@ -1454,21 +1454,23 @@ export function ensuring_<R, E, A>(fa: Observable<R, E, A>, finalizer: () => voi
|
|
|
1454
1454
|
export function exhaustAll<R, E, R1, E1, A>(
|
|
1455
1455
|
ffa: Observable<R, E, ObservableInput<R1, E1, A>>,
|
|
1456
1456
|
): Observable<R | R1, E | E1, A> {
|
|
1457
|
-
return ffa.operate((source, subscriber) => {
|
|
1457
|
+
return ffa.operate((source, subscriber, environment) => {
|
|
1458
1458
|
let isComplete = false;
|
|
1459
1459
|
let innerSub: Subscription | null = null;
|
|
1460
|
-
source.subscribe(
|
|
1460
|
+
source.provideEnvironment(environment).subscribe(
|
|
1461
1461
|
operatorSubscriber(subscriber, {
|
|
1462
1462
|
next: (inner) => {
|
|
1463
1463
|
if (!innerSub) {
|
|
1464
|
-
innerSub = from(inner)
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1464
|
+
innerSub = from(inner)
|
|
1465
|
+
.provideEnvironment(environment)
|
|
1466
|
+
.subscribe(
|
|
1467
|
+
operatorSubscriber(subscriber, {
|
|
1468
|
+
complete: () => {
|
|
1469
|
+
innerSub = null;
|
|
1470
|
+
isComplete && subscriber.complete();
|
|
1471
|
+
},
|
|
1472
|
+
}),
|
|
1473
|
+
);
|
|
1472
1474
|
}
|
|
1473
1475
|
},
|
|
1474
1476
|
complete: () => {
|
|
@@ -1481,130 +1483,126 @@ export function exhaustAll<R, E, R1, E1, A>(
|
|
|
1481
1483
|
}
|
|
1482
1484
|
|
|
1483
1485
|
/**
|
|
1484
|
-
* @tsplus
|
|
1486
|
+
* @tsplus pipeable fncts.observable.Observable exhaustMapWithIndex
|
|
1485
1487
|
*/
|
|
1486
|
-
export function exhaustMapWithIndex<
|
|
1487
|
-
self: Observable<R, E, A
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1488
|
+
export function exhaustMapWithIndex<A, R1, E1, B>(f: (i: number, a: A) => ObservableInput<R1, E1, B>) {
|
|
1489
|
+
return <R, E>(self: Observable<R, E, A>): Observable<R | R1, E | E1, B> => {
|
|
1490
|
+
return self.operate((source, subscriber, environment) => {
|
|
1491
|
+
let index = 0;
|
|
1492
|
+
let innerSub: Subscriber<E1, B> | null = null;
|
|
1493
|
+
let isComplete = false;
|
|
1494
|
+
source.provideEnvironment(environment).subscribe(
|
|
1495
|
+
operatorSubscriber(subscriber, {
|
|
1496
|
+
next: (outerValue) => {
|
|
1497
|
+
if (!innerSub) {
|
|
1498
|
+
innerSub = operatorSubscriber(subscriber, {
|
|
1499
|
+
complete: () => {
|
|
1500
|
+
innerSub = null;
|
|
1501
|
+
isComplete && subscriber.complete();
|
|
1502
|
+
},
|
|
1503
|
+
});
|
|
1504
|
+
from(f(index++, outerValue))
|
|
1505
|
+
.provideEnvironment(environment)
|
|
1506
|
+
.subscribe(innerSub);
|
|
1507
|
+
}
|
|
1508
|
+
},
|
|
1509
|
+
complete: () => {
|
|
1510
|
+
isComplete = true;
|
|
1511
|
+
!innerSub && subscriber.complete();
|
|
1512
|
+
},
|
|
1513
|
+
}),
|
|
1514
|
+
);
|
|
1515
|
+
});
|
|
1516
|
+
};
|
|
1514
1517
|
}
|
|
1515
1518
|
|
|
1516
1519
|
/**
|
|
1517
|
-
* @tsplus
|
|
1520
|
+
* @tsplus pipeable fncts.observable.Observable exhaustMap
|
|
1518
1521
|
*/
|
|
1519
|
-
export function
|
|
1520
|
-
self: Observable<R, E, A
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
return self.exhaustMapWithIndex((_, a) => f(a));
|
|
1522
|
+
export function exhaustMap<A, R1, E1, B>(f: (a: A) => ObservableInput<R1, E1, B>) {
|
|
1523
|
+
return <R, E>(self: Observable<R, E, A>): Observable<R | R1, E | E1, B> => {
|
|
1524
|
+
return self.exhaustMapWithIndex((_, a) => f(a));
|
|
1525
|
+
};
|
|
1524
1526
|
}
|
|
1525
1527
|
|
|
1526
1528
|
/**
|
|
1527
|
-
* @tsplus
|
|
1529
|
+
* @tsplus pipeable fncts.observable.Observable expandWithIndex
|
|
1528
1530
|
*/
|
|
1529
|
-
export function expandWithIndex<
|
|
1530
|
-
fa: Observable<R, E, A>,
|
|
1531
|
+
export function expandWithIndex<A, R1, E1, B>(
|
|
1531
1532
|
f: (i: number, a: A) => ObservableInput<R1, E1, B>,
|
|
1532
1533
|
concurrent = Infinity,
|
|
1533
|
-
)
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1534
|
+
) {
|
|
1535
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, B> => {
|
|
1536
|
+
concurrent = (concurrent || 0) < 1 ? Infinity : concurrent;
|
|
1537
|
+
return fa.operate((source, subscriber, environment) =>
|
|
1538
|
+
mergeInternal(source, subscriber, environment, f, concurrent, undefined, true),
|
|
1539
|
+
);
|
|
1540
|
+
};
|
|
1537
1541
|
}
|
|
1538
1542
|
|
|
1539
1543
|
/**
|
|
1540
|
-
* @tsplus
|
|
1544
|
+
* @tsplus pipeable fncts.observable.Observable expand
|
|
1541
1545
|
*/
|
|
1542
|
-
export function
|
|
1543
|
-
fa: Observable<R, E, A
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
): Observable<R | R1, E | E1, B> {
|
|
1547
|
-
return fa.expandWithIndex((_, a) => f(a), concurrent);
|
|
1546
|
+
export function expand<A, R1, E1, B>(f: (a: A) => ObservableInput<R1, E1, B>, concurrent = Infinity) {
|
|
1547
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, B> => {
|
|
1548
|
+
return fa.expandWithIndex((_, a) => f(a), concurrent);
|
|
1549
|
+
};
|
|
1548
1550
|
}
|
|
1549
1551
|
|
|
1550
1552
|
/**
|
|
1551
|
-
* @tsplus
|
|
1553
|
+
* @tsplus pipeable fncts.observable.Observable findWithIndex
|
|
1552
1554
|
*/
|
|
1553
|
-
export function findWithIndex<
|
|
1554
|
-
fa: Observable<R, E, A>,
|
|
1555
|
+
export function findWithIndex<A, B extends A>(
|
|
1555
1556
|
refinement: RefinementWithIndex<number, A, B>,
|
|
1556
|
-
): Observable<R, E, Maybe<B>>;
|
|
1557
|
-
export function findWithIndex<
|
|
1558
|
-
fa: Observable<R, E, A>,
|
|
1557
|
+
): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, Maybe<B>>;
|
|
1558
|
+
export function findWithIndex<A>(
|
|
1559
1559
|
predicate: PredicateWithIndex<number, A>,
|
|
1560
|
-
): Observable<R, E, Maybe<A>>;
|
|
1561
|
-
export function findWithIndex<
|
|
1562
|
-
fa: Observable<R, E, A
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
return fa.operate(findInternal(predicate, "value"));
|
|
1560
|
+
): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, Maybe<A>>;
|
|
1561
|
+
export function findWithIndex<A>(predicate: PredicateWithIndex<number, A>) {
|
|
1562
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R, E, Maybe<A>> => {
|
|
1563
|
+
return fa.operate(findInternal(predicate, "value"));
|
|
1564
|
+
};
|
|
1566
1565
|
}
|
|
1567
1566
|
|
|
1568
1567
|
/**
|
|
1569
|
-
* @tsplus
|
|
1568
|
+
* @tsplus pipeable fncts.observable.Observable find
|
|
1570
1569
|
*/
|
|
1571
|
-
export function
|
|
1572
|
-
fa: Observable<R, E, A>,
|
|
1570
|
+
export function find<A, B extends A>(
|
|
1573
1571
|
refinement: Refinement<A, B>,
|
|
1574
|
-
): Observable<R, E, Maybe<B>>;
|
|
1575
|
-
export function
|
|
1576
|
-
export function
|
|
1577
|
-
return fa
|
|
1572
|
+
): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, Maybe<B>>;
|
|
1573
|
+
export function find<A>(predicate: Predicate<A>): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, Maybe<A>>;
|
|
1574
|
+
export function find<A>(predicate: Predicate<A>) {
|
|
1575
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R, E, Maybe<A>> => {
|
|
1576
|
+
return fa.findWithIndex((_, a) => predicate(a));
|
|
1577
|
+
};
|
|
1578
1578
|
}
|
|
1579
1579
|
|
|
1580
1580
|
/**
|
|
1581
|
-
* @tsplus
|
|
1581
|
+
* @tsplus pipeable fncts.observable.Observable findIndexWithIndex
|
|
1582
1582
|
*/
|
|
1583
|
-
export function findIndexWithIndex<
|
|
1584
|
-
fa: Observable<R, E, A>,
|
|
1583
|
+
export function findIndexWithIndex<A, B extends A>(
|
|
1585
1584
|
refinement: RefinementWithIndex<number, A, B>,
|
|
1586
|
-
): Observable<R, E, number>;
|
|
1587
|
-
export function findIndexWithIndex<
|
|
1588
|
-
fa: Observable<R, E, A>,
|
|
1585
|
+
): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, number>;
|
|
1586
|
+
export function findIndexWithIndex<A>(
|
|
1589
1587
|
predicate: PredicateWithIndex<number, A>,
|
|
1590
|
-
): Observable<R, E, number>;
|
|
1591
|
-
export function findIndexWithIndex<
|
|
1592
|
-
fa: Observable<R, E, A
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
return fa.operate(findInternal(predicate, "index"));
|
|
1588
|
+
): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, number>;
|
|
1589
|
+
export function findIndexWithIndex<A>(predicate: PredicateWithIndex<number, A>) {
|
|
1590
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R, E, number> => {
|
|
1591
|
+
return fa.operate(findInternal(predicate, "index"));
|
|
1592
|
+
};
|
|
1596
1593
|
}
|
|
1597
1594
|
|
|
1598
1595
|
/**
|
|
1599
|
-
* @tsplus
|
|
1596
|
+
* @tsplus pipeable fncts.observable.Observable findIndex
|
|
1600
1597
|
*/
|
|
1601
|
-
export function
|
|
1602
|
-
fa: Observable<R, E, A>,
|
|
1598
|
+
export function findIndex<A, B extends A>(
|
|
1603
1599
|
refinement: Refinement<A, B>,
|
|
1604
|
-
): Observable<R, E, number>;
|
|
1605
|
-
export function
|
|
1606
|
-
export function
|
|
1607
|
-
return
|
|
1600
|
+
): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, number>;
|
|
1601
|
+
export function findIndex<A>(predicate: Predicate<A>): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, number>;
|
|
1602
|
+
export function findIndex<A>(predicate: Predicate<A>) {
|
|
1603
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R, E, number> => {
|
|
1604
|
+
return fa.findIndexWithIndex((_, a) => predicate(a));
|
|
1605
|
+
};
|
|
1608
1606
|
}
|
|
1609
1607
|
|
|
1610
1608
|
/**
|
|
@@ -1615,14 +1613,18 @@ export function forkJoin<S extends Record<string, ObservableInput<any, any>>>(
|
|
|
1615
1613
|
): Observable<
|
|
1616
1614
|
Observable.EnvironmentOf<S[keyof S]>,
|
|
1617
1615
|
Observable.ErrorOf<S[keyof S]>,
|
|
1618
|
-
{
|
|
1616
|
+
{
|
|
1617
|
+
[K in keyof S]: Observable.TypeOf<S[K]>;
|
|
1618
|
+
}
|
|
1619
1619
|
>;
|
|
1620
1620
|
export function forkJoin<A extends ReadonlyArray<ObservableInput<any, any>>>(
|
|
1621
1621
|
...sources: A
|
|
1622
1622
|
): Observable<
|
|
1623
1623
|
Observable.EnvironmentOf<A[number]>,
|
|
1624
1624
|
Observable.ErrorOf<A[number]>,
|
|
1625
|
-
{
|
|
1625
|
+
{
|
|
1626
|
+
[K in keyof A]: Observable.TypeOf<A[K]>;
|
|
1627
|
+
}
|
|
1626
1628
|
>;
|
|
1627
1629
|
export function forkJoin(...args: any[]): Observable<any, any, any> {
|
|
1628
1630
|
const { args: sources, keys } = arrayOrObject(args);
|
|
@@ -1671,8 +1673,8 @@ export function forkJoin(...args: any[]): Observable<any, any, any> {
|
|
|
1671
1673
|
* @tsplus getter fncts.observable.Observable ignore
|
|
1672
1674
|
*/
|
|
1673
1675
|
export function ignore<R, E, A>(fa: Observable<R, E, A>): Observable<R, E, never> {
|
|
1674
|
-
return fa.operate((source, subscriber) => {
|
|
1675
|
-
source.subscribe(
|
|
1676
|
+
return fa.operate((source, subscriber, environment) => {
|
|
1677
|
+
source.provideEnvironment(environment).subscribe(
|
|
1676
1678
|
operatorSubscriber(subscriber, {
|
|
1677
1679
|
next: noop,
|
|
1678
1680
|
}),
|
|
@@ -1684,8 +1686,8 @@ export function ignore<R, E, A>(fa: Observable<R, E, A>): Observable<R, E, never
|
|
|
1684
1686
|
* @tsplus getter fncts.observable.Observable isEmpty
|
|
1685
1687
|
*/
|
|
1686
1688
|
export function isEmpty<R, E, A>(fa: Observable<R, E, A>): Observable<R, E, boolean> {
|
|
1687
|
-
return fa.operate((source, subscriber) => {
|
|
1688
|
-
source.subscribe(
|
|
1689
|
+
return fa.operate((source, subscriber, environment) => {
|
|
1690
|
+
source.provideEnvironment(environment).subscribe(
|
|
1689
1691
|
operatorSubscriber(subscriber, {
|
|
1690
1692
|
next: () => {
|
|
1691
1693
|
subscriber.next(false);
|
|
@@ -1704,8 +1706,8 @@ export function isEmpty<R, E, A>(fa: Observable<R, E, A>): Observable<R, E, bool
|
|
|
1704
1706
|
* @tsplus getter fncts.observable.Observable materialize
|
|
1705
1707
|
*/
|
|
1706
1708
|
export function materialize<R, E, A>(fa: Observable<R, E, A>): Observable<R, never, Notification<E, A>> {
|
|
1707
|
-
return fa.operate((source, subscriber) => {
|
|
1708
|
-
source.subscribe(
|
|
1709
|
+
return fa.operate((source, subscriber, environment) => {
|
|
1710
|
+
source.provideEnvironment(environment).subscribe(
|
|
1709
1711
|
operatorSubscriber(subscriber, {
|
|
1710
1712
|
next: (value) => {
|
|
1711
1713
|
subscriber.next(Notification.next(value));
|
|
@@ -1722,51 +1724,53 @@ export function materialize<R, E, A>(fa: Observable<R, E, A>): Observable<R, nev
|
|
|
1722
1724
|
}
|
|
1723
1725
|
|
|
1724
1726
|
/**
|
|
1725
|
-
* @tsplus
|
|
1727
|
+
* @tsplus pipeable fncts.observable.Observable mergeAll
|
|
1726
1728
|
*/
|
|
1727
|
-
export function
|
|
1728
|
-
self: Observable<R, E, ObservableInput<R1, E1, A
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
return self.mergeMap(Function.identity, concurrent);
|
|
1729
|
+
export function mergeAll(concurrent = Infinity) {
|
|
1730
|
+
return <R, E, R1, E1, A>(self: Observable<R, E, ObservableInput<R1, E1, A>>): Observable<R | R1, E | E1, A> => {
|
|
1731
|
+
return self.mergeMap(Function.identity, concurrent);
|
|
1732
|
+
};
|
|
1732
1733
|
}
|
|
1733
1734
|
|
|
1734
1735
|
/**
|
|
1735
|
-
* @tsplus
|
|
1736
|
+
* @tsplus pipeable fncts.observable.Observable mergeScanWithIndex
|
|
1736
1737
|
*/
|
|
1737
|
-
export function mergeScanWithIndex<
|
|
1738
|
-
fa: Observable<R, E, A>,
|
|
1738
|
+
export function mergeScanWithIndex<A, R1, E1, B>(
|
|
1739
1739
|
initial: B,
|
|
1740
1740
|
f: (index: number, acc: B, value: A) => ObservableInput<R1, E1, B>,
|
|
1741
1741
|
concurrent = Infinity,
|
|
1742
|
-
)
|
|
1743
|
-
return fa
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1742
|
+
) {
|
|
1743
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, B> => {
|
|
1744
|
+
return fa.operate((source, subscriber, environment) => {
|
|
1745
|
+
let state = initial;
|
|
1746
|
+
return mergeInternal(
|
|
1747
|
+
source,
|
|
1748
|
+
subscriber,
|
|
1749
|
+
environment,
|
|
1750
|
+
(index, value) => f(index, state, value),
|
|
1751
|
+
concurrent,
|
|
1752
|
+
(value) => {
|
|
1753
|
+
state = value;
|
|
1754
|
+
},
|
|
1755
|
+
false,
|
|
1756
|
+
undefined,
|
|
1757
|
+
() => (state = null!),
|
|
1758
|
+
);
|
|
1759
|
+
});
|
|
1760
|
+
};
|
|
1758
1761
|
}
|
|
1759
1762
|
|
|
1760
1763
|
/**
|
|
1761
|
-
* @tsplus
|
|
1764
|
+
* @tsplus pipeable fncts.observable.Observable mergeScan
|
|
1762
1765
|
*/
|
|
1763
|
-
export function
|
|
1764
|
-
fa: Observable<R, E, A>,
|
|
1766
|
+
export function mergeScan<A, R1, E1, B>(
|
|
1765
1767
|
initial: B,
|
|
1766
1768
|
f: (acc: B, value: A) => ObservableInput<R1, E1, B>,
|
|
1767
1769
|
concurrent = Infinity,
|
|
1768
|
-
)
|
|
1769
|
-
return
|
|
1770
|
+
) {
|
|
1771
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, B> => {
|
|
1772
|
+
return fa.mergeScanWithIndex(initial, (_, b, a) => f(b, a), concurrent);
|
|
1773
|
+
};
|
|
1770
1774
|
}
|
|
1771
1775
|
|
|
1772
1776
|
export function onErrorResumeNext<R, E, A, O extends ReadonlyArray<ObservableInput<any, any>>>(
|
|
@@ -1777,7 +1781,7 @@ export function onErrorResumeNext<R, E, A, O extends ReadonlyArray<ObservableInp
|
|
|
1777
1781
|
E | Observable.ErrorOf<O[number]>,
|
|
1778
1782
|
A | Observable.TypeOf<O[number]>
|
|
1779
1783
|
> {
|
|
1780
|
-
return fa.operate((source, subscriber) => {
|
|
1784
|
+
return fa.operate((source, subscriber, environment) => {
|
|
1781
1785
|
const remaining = [source, ...sources];
|
|
1782
1786
|
const subscribeNext = () => {
|
|
1783
1787
|
if (!subscriber.closed) {
|
|
@@ -1794,7 +1798,7 @@ export function onErrorResumeNext<R, E, A, O extends ReadonlyArray<ObservableInp
|
|
|
1794
1798
|
return;
|
|
1795
1799
|
}
|
|
1796
1800
|
const innerSub = operatorSubscriber(subscriber, { error: noop, complete: noop });
|
|
1797
|
-
subscriber.add(nextSource.subscribe(innerSub));
|
|
1801
|
+
subscriber.add(nextSource.provideEnvironment(environment).subscribe(innerSub));
|
|
1798
1802
|
innerSub.add(subscribeNext);
|
|
1799
1803
|
} else {
|
|
1800
1804
|
subscriber.complete();
|
|
@@ -1806,65 +1810,68 @@ export function onErrorResumeNext<R, E, A, O extends ReadonlyArray<ObservableInp
|
|
|
1806
1810
|
}
|
|
1807
1811
|
|
|
1808
1812
|
/**
|
|
1809
|
-
* @tsplus
|
|
1813
|
+
* @tsplus pipeable fncts.observable.Observable onEmpty
|
|
1810
1814
|
*/
|
|
1811
|
-
export function
|
|
1812
|
-
return fa
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
|
|
1815
|
+
export function onEmpty<B>(f: Lazy<B>) {
|
|
1816
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A | B> => {
|
|
1817
|
+
return fa.operate((source, subscriber, environment) => {
|
|
1818
|
+
let hasValue = false;
|
|
1819
|
+
source.provideEnvironment(environment).subscribe(
|
|
1820
|
+
operatorSubscriber(subscriber, {
|
|
1821
|
+
next: (value) => {
|
|
1822
|
+
hasValue = true;
|
|
1823
|
+
subscriber.next(value);
|
|
1824
|
+
},
|
|
1825
|
+
complete: () => {
|
|
1826
|
+
if (!hasValue) {
|
|
1827
|
+
subscriber.next(f());
|
|
1828
|
+
}
|
|
1829
|
+
subscriber.complete();
|
|
1830
|
+
},
|
|
1831
|
+
}),
|
|
1832
|
+
);
|
|
1833
|
+
});
|
|
1834
|
+
};
|
|
1829
1835
|
}
|
|
1830
1836
|
|
|
1831
1837
|
/**
|
|
1832
|
-
* @tsplus
|
|
1838
|
+
* @tsplus pipeable fncts.observable.Observable repeat
|
|
1833
1839
|
*/
|
|
1834
|
-
export function
|
|
1835
|
-
return
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
if (
|
|
1847
|
-
innerSub
|
|
1848
|
-
|
|
1849
|
-
|
|
1840
|
+
export function repeat(count = Infinity) {
|
|
1841
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A> => {
|
|
1842
|
+
return count <= 0
|
|
1843
|
+
? empty()
|
|
1844
|
+
: fa.operate((source, subscriber, environment) => {
|
|
1845
|
+
let repeats = 0;
|
|
1846
|
+
let innerSub: Subscription | null;
|
|
1847
|
+
const loop = () => {
|
|
1848
|
+
let syncUnsub = false;
|
|
1849
|
+
innerSub = source.provideEnvironment(environment).subscribe(
|
|
1850
|
+
operatorSubscriber(subscriber, {
|
|
1851
|
+
complete: () => {
|
|
1852
|
+
if (++repeats < count) {
|
|
1853
|
+
if (innerSub) {
|
|
1854
|
+
innerSub.unsubscribe();
|
|
1855
|
+
innerSub = null;
|
|
1856
|
+
loop();
|
|
1857
|
+
} else {
|
|
1858
|
+
syncUnsub = true;
|
|
1859
|
+
}
|
|
1850
1860
|
} else {
|
|
1851
|
-
|
|
1861
|
+
subscriber.complete;
|
|
1852
1862
|
}
|
|
1853
|
-
}
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
};
|
|
1866
|
-
loop();
|
|
1867
|
-
});
|
|
1863
|
+
},
|
|
1864
|
+
}),
|
|
1865
|
+
);
|
|
1866
|
+
if (syncUnsub) {
|
|
1867
|
+
innerSub.unsubscribe();
|
|
1868
|
+
innerSub = null;
|
|
1869
|
+
loop();
|
|
1870
|
+
}
|
|
1871
|
+
};
|
|
1872
|
+
loop();
|
|
1873
|
+
});
|
|
1874
|
+
};
|
|
1868
1875
|
}
|
|
1869
1876
|
|
|
1870
1877
|
export interface RetryConfig {
|
|
@@ -1873,126 +1880,118 @@ export interface RetryConfig {
|
|
|
1873
1880
|
}
|
|
1874
1881
|
|
|
1875
1882
|
/**
|
|
1876
|
-
* @tsplus
|
|
1883
|
+
* @tsplus pipeable fncts.observable.Observable retry
|
|
1877
1884
|
*/
|
|
1878
|
-
export function
|
|
1879
|
-
export function
|
|
1880
|
-
export function
|
|
1881
|
-
fa: Observable<R, E, A
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1887
|
-
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
};
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
loop();
|
|
1885
|
+
export function retry(count?: number): <R, E, A>(fa: Observable<R, E, A>) => Observable<R, E, A>;
|
|
1886
|
+
export function retry(config: RetryConfig): <R, E, A>(fa: Observable<R, E, A>) => Observable<R, E, A>;
|
|
1887
|
+
export function retry(configOrCount: number | RetryConfig = Infinity) {
|
|
1888
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A> => {
|
|
1889
|
+
let config: RetryConfig;
|
|
1890
|
+
if (configOrCount && typeof configOrCount === "object") {
|
|
1891
|
+
config = configOrCount;
|
|
1892
|
+
} else {
|
|
1893
|
+
config = {
|
|
1894
|
+
count: configOrCount,
|
|
1895
|
+
};
|
|
1896
|
+
}
|
|
1897
|
+
const { count, resetOnSuccess = false } = config;
|
|
1898
|
+
return count <= 0
|
|
1899
|
+
? fa
|
|
1900
|
+
: fa.operate((source, subscriber, environment) => {
|
|
1901
|
+
let retries = 0;
|
|
1902
|
+
let innerSub: Subscription | null;
|
|
1903
|
+
const loop = () => {
|
|
1904
|
+
let syncUnsub = false;
|
|
1905
|
+
innerSub = source.provideEnvironment(environment).subscribe(
|
|
1906
|
+
operatorSubscriber(subscriber, {
|
|
1907
|
+
next: (value) => {
|
|
1908
|
+
if (resetOnSuccess) {
|
|
1909
|
+
retries = 0;
|
|
1910
|
+
}
|
|
1911
|
+
subscriber.next(value);
|
|
1912
|
+
},
|
|
1913
|
+
error: (err) => {
|
|
1914
|
+
if (retries++ < count) {
|
|
1915
|
+
if (innerSub) {
|
|
1916
|
+
innerSub.unsubscribe();
|
|
1917
|
+
innerSub = null;
|
|
1918
|
+
loop();
|
|
1919
|
+
} else {
|
|
1920
|
+
syncUnsub = true;
|
|
1921
|
+
}
|
|
1916
1922
|
} else {
|
|
1917
|
-
|
|
1923
|
+
subscriber.error(err);
|
|
1918
1924
|
}
|
|
1919
|
-
}
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
loop();
|
|
1932
|
-
});
|
|
1925
|
+
},
|
|
1926
|
+
}),
|
|
1927
|
+
);
|
|
1928
|
+
if (syncUnsub) {
|
|
1929
|
+
innerSub.unsubscribe();
|
|
1930
|
+
innerSub = null;
|
|
1931
|
+
loop();
|
|
1932
|
+
}
|
|
1933
|
+
};
|
|
1934
|
+
loop();
|
|
1935
|
+
});
|
|
1936
|
+
};
|
|
1933
1937
|
}
|
|
1934
1938
|
|
|
1935
1939
|
/**
|
|
1936
|
-
* @tsplus
|
|
1940
|
+
* @tsplus pipeable fncts.observable.Observable sample
|
|
1937
1941
|
*/
|
|
1938
|
-
export function
|
|
1939
|
-
fa: Observable<R, E, A
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
|
|
1942
|
+
export function sample<R1, E1>(notifier: Observable<R1, E1, any>) {
|
|
1943
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, A> => {
|
|
1944
|
+
return fa.operate((source, subscriber, environment) => {
|
|
1945
|
+
let hasValue = false;
|
|
1946
|
+
let lastValue: A | null = null;
|
|
1947
|
+
source.provideEnvironment(environment).subscribe(
|
|
1948
|
+
operatorSubscriber(subscriber, {
|
|
1949
|
+
next: (value) => {
|
|
1950
|
+
hasValue = true;
|
|
1951
|
+
lastValue = value;
|
|
1952
|
+
},
|
|
1953
|
+
}),
|
|
1954
|
+
);
|
|
1955
|
+
const emit = () => {
|
|
1956
|
+
if (hasValue) {
|
|
1957
|
+
hasValue = false;
|
|
1958
|
+
const value = lastValue!;
|
|
1959
|
+
lastValue = null;
|
|
1960
|
+
subscriber.next(value);
|
|
1961
|
+
}
|
|
1962
|
+
};
|
|
1963
|
+
notifier
|
|
1964
|
+
.provideEnvironment(environment)
|
|
1965
|
+
.subscribe(operatorSubscriber(subscriber, { next: emit, complete: noop }));
|
|
1966
|
+
});
|
|
1967
|
+
};
|
|
1963
1968
|
}
|
|
1964
1969
|
|
|
1965
1970
|
/**
|
|
1966
|
-
* @tsplus
|
|
1971
|
+
* @tsplus pipeable fncts.observable.Observable sampleTime
|
|
1967
1972
|
*/
|
|
1968
|
-
export function
|
|
1969
|
-
fa: Observable<R, E, A
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
): Observable<R, E, A> {
|
|
1973
|
-
return sample_(fa, interval(period, scheduler));
|
|
1973
|
+
export function sampleTime(period: number, scheduler: SchedulerLike = asyncScheduler) {
|
|
1974
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A> => {
|
|
1975
|
+
return fa.sample(interval(period, scheduler));
|
|
1976
|
+
};
|
|
1974
1977
|
}
|
|
1975
1978
|
|
|
1976
1979
|
/**
|
|
1977
|
-
* @tsplus
|
|
1980
|
+
* @tsplus pipeable fncts.observable.Observable scanLeftWithIndex
|
|
1978
1981
|
*/
|
|
1979
|
-
export function scanLeftWithIndex<
|
|
1980
|
-
fa: Observable<R, E, A
|
|
1981
|
-
|
|
1982
|
-
|
|
1983
|
-
): Observable<R, E, B> {
|
|
1984
|
-
return fa.operate(scanInternal(f, initial, true, true));
|
|
1982
|
+
export function scanLeftWithIndex<A, B>(initial: B, f: (index: number, acc: B, value: A) => B) {
|
|
1983
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R, E, B> => {
|
|
1984
|
+
return fa.operate(scanInternal(f, initial, true, true));
|
|
1985
|
+
};
|
|
1985
1986
|
}
|
|
1986
1987
|
|
|
1987
1988
|
/**
|
|
1988
|
-
* @tsplus
|
|
1989
|
+
* @tsplus pipeable fncts.observable.Observable scanLeft
|
|
1989
1990
|
*/
|
|
1990
|
-
export function scanLeft<
|
|
1991
|
-
fa: Observable<R, E, A
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
): Observable<R, E, B> {
|
|
1995
|
-
return fa.scanLeftWithIndex(initial, (_, b, a) => f(b, a));
|
|
1991
|
+
export function scanLeft<A, B>(initial: B, f: (acc: B, value: A) => B) {
|
|
1992
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R, E, B> => {
|
|
1993
|
+
return fa.scanLeftWithIndex(initial, (_, b, a) => f(b, a));
|
|
1994
|
+
};
|
|
1996
1995
|
}
|
|
1997
1996
|
|
|
1998
1997
|
/**
|
|
@@ -2020,112 +2019,108 @@ export function serviceWithObservable<S, R, E, A>(
|
|
|
2020
2019
|
}
|
|
2021
2020
|
|
|
2022
2021
|
/**
|
|
2023
|
-
* @tsplus
|
|
2022
|
+
* @tsplus pipeable fncts.observable.Observable skip
|
|
2024
2023
|
*/
|
|
2025
|
-
export function
|
|
2026
|
-
return fa
|
|
2024
|
+
export function skip(count: number) {
|
|
2025
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A> => {
|
|
2026
|
+
return fa.filterWithIndex((index, _) => count <= index);
|
|
2027
|
+
};
|
|
2027
2028
|
}
|
|
2028
2029
|
|
|
2029
2030
|
/**
|
|
2030
|
-
* @tsplus
|
|
2031
|
+
* @tsplus pipeable fncts.observable.Observable skipLast
|
|
2031
2032
|
*/
|
|
2032
|
-
export function
|
|
2033
|
-
return
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
|
|
2047
|
-
|
|
2048
|
-
|
|
2049
|
-
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
|
|
2033
|
+
export function skipLast(skipCount: number) {
|
|
2034
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A> => {
|
|
2035
|
+
return skipCount <= 0
|
|
2036
|
+
? fa
|
|
2037
|
+
: fa.operate((source, subscriber, environment) => {
|
|
2038
|
+
let ring: A[] = new Array(skipCount);
|
|
2039
|
+
let seen = 0;
|
|
2040
|
+
source.provideEnvironment(environment).subscribe(
|
|
2041
|
+
operatorSubscriber(subscriber, {
|
|
2042
|
+
next: (value) => {
|
|
2043
|
+
const valueIndex = seen++;
|
|
2044
|
+
if (valueIndex < skipCount) {
|
|
2045
|
+
ring[valueIndex] = value;
|
|
2046
|
+
} else {
|
|
2047
|
+
const index = valueIndex % skipCount;
|
|
2048
|
+
const oldValue = ring[index];
|
|
2049
|
+
ring[index] = value;
|
|
2050
|
+
subscriber.next(oldValue!);
|
|
2051
|
+
}
|
|
2052
|
+
},
|
|
2053
|
+
}),
|
|
2054
|
+
);
|
|
2055
|
+
return () => {
|
|
2056
|
+
ring = null!;
|
|
2057
|
+
};
|
|
2058
|
+
});
|
|
2059
|
+
};
|
|
2058
2060
|
}
|
|
2059
2061
|
|
|
2060
2062
|
/**
|
|
2061
|
-
* @tsplus
|
|
2063
|
+
* @tsplus pipeable fncts.observable.Observable skipUntil
|
|
2062
2064
|
*/
|
|
2063
|
-
export function
|
|
2064
|
-
fa: Observable<R, E, A
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
}
|
|
2074
|
-
|
|
2065
|
+
export function skipUntil<R1, E1>(notifier: Observable<R1, E1, any>) {
|
|
2066
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, A> => {
|
|
2067
|
+
return fa.operate((source, subscriber, environment) => {
|
|
2068
|
+
let taking = false;
|
|
2069
|
+
const skipSubscriber = operatorSubscriber(subscriber, {
|
|
2070
|
+
next: () => {
|
|
2071
|
+
skipSubscriber?.unsubscribe();
|
|
2072
|
+
taking = true;
|
|
2073
|
+
},
|
|
2074
|
+
complete: noop,
|
|
2075
|
+
});
|
|
2076
|
+
from(notifier).provideEnvironment(environment).subscribe(skipSubscriber);
|
|
2077
|
+
source.provideEnvironment(environment).subscribe(
|
|
2078
|
+
operatorSubscriber(subscriber, {
|
|
2079
|
+
next: (value) => taking && subscriber.next(value),
|
|
2080
|
+
}),
|
|
2081
|
+
);
|
|
2075
2082
|
});
|
|
2076
|
-
|
|
2077
|
-
from(notifier).subscribe(skipSubscriber);
|
|
2078
|
-
|
|
2079
|
-
source.subscribe(
|
|
2080
|
-
operatorSubscriber(subscriber, {
|
|
2081
|
-
next: (value) => taking && subscriber.next(value),
|
|
2082
|
-
}),
|
|
2083
|
-
);
|
|
2084
|
-
});
|
|
2083
|
+
};
|
|
2085
2084
|
}
|
|
2086
2085
|
|
|
2087
2086
|
/**
|
|
2088
|
-
* @tsplus
|
|
2087
|
+
* @tsplus pipeable fncts.observable.Observable skipWhile
|
|
2089
2088
|
*/
|
|
2090
|
-
export function
|
|
2091
|
-
fa: Observable<R, E, A
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
});
|
|
2089
|
+
export function skipWhile<A>(predicate: PredicateWithIndex<number, A>) {
|
|
2090
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R, E, A> => {
|
|
2091
|
+
return fa.operate((source, subscriber, environment) => {
|
|
2092
|
+
let taking = false;
|
|
2093
|
+
let index = 0;
|
|
2094
|
+
source.provideEnvironment(environment).subscribe(
|
|
2095
|
+
operatorSubscriber(subscriber, {
|
|
2096
|
+
next: (value) => (taking || (taking = !predicate(index++, value))) && subscriber.next(value),
|
|
2097
|
+
}),
|
|
2098
|
+
);
|
|
2099
|
+
});
|
|
2100
|
+
};
|
|
2103
2101
|
}
|
|
2104
2102
|
|
|
2105
2103
|
/**
|
|
2106
|
-
* @tsplus
|
|
2104
|
+
* @tsplus pipeable fncts.observable.Observable startWith
|
|
2107
2105
|
*/
|
|
2108
|
-
export function
|
|
2109
|
-
fa: Observable<R, E, A
|
|
2110
|
-
|
|
2111
|
-
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
|
|
2115
|
-
});
|
|
2106
|
+
export function startWith<B extends ReadonlyArray<unknown>>(...values: B) {
|
|
2107
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A | B[number]> => {
|
|
2108
|
+
return fa.operate((source, subscriber) => {
|
|
2109
|
+
// @ts-expect-error
|
|
2110
|
+
source.concat(values).subscribe(subscriber);
|
|
2111
|
+
});
|
|
2112
|
+
};
|
|
2116
2113
|
}
|
|
2117
2114
|
|
|
2118
2115
|
/**
|
|
2119
|
-
* @tsplus
|
|
2116
|
+
* @tsplus pipeable fncts.observable.Observable subscribeOn
|
|
2120
2117
|
*/
|
|
2121
|
-
export function
|
|
2122
|
-
fa: Observable<R, E, A
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
)
|
|
2126
|
-
|
|
2127
|
-
subscriber.add(scheduler.schedule(() => source.subscribe(subscriber), delay));
|
|
2128
|
-
});
|
|
2118
|
+
export function subscribeOn(scheduler: SchedulerLike, delay = 0) {
|
|
2119
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A> => {
|
|
2120
|
+
return fa.operate((source, subscriber, environment) => {
|
|
2121
|
+
subscriber.add(scheduler.schedule(() => source.provideEnvironment(environment).subscribe(subscriber), delay));
|
|
2122
|
+
});
|
|
2123
|
+
};
|
|
2129
2124
|
}
|
|
2130
2125
|
|
|
2131
2126
|
/**
|
|
@@ -2134,232 +2129,229 @@ export function subscribeOn_<R, E, A>(
|
|
|
2134
2129
|
export function switchAll<R, E, R1, E1, A>(
|
|
2135
2130
|
ffa: Observable<R, E, ObservableInput<R1, E1, A>>,
|
|
2136
2131
|
): Observable<R | R1, E | E1, A> {
|
|
2137
|
-
return
|
|
2132
|
+
return ffa.switchMap(Function.identity);
|
|
2138
2133
|
}
|
|
2139
|
-
|
|
2140
|
-
/**
|
|
2141
|
-
* @tsplus
|
|
2142
|
-
*/
|
|
2143
|
-
export function switchMapWithIndex<
|
|
2144
|
-
fa: Observable<R, E, A
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
|
|
2148
|
-
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
|
-
|
|
2152
|
-
|
|
2153
|
-
|
|
2154
|
-
|
|
2155
|
-
|
|
2156
|
-
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
|
|
2167
|
-
|
|
2168
|
-
|
|
2169
|
-
);
|
|
2134
|
+
|
|
2135
|
+
/**
|
|
2136
|
+
* @tsplus pipeable fncts.observable.Observable switchMapWithIndex
|
|
2137
|
+
*/
|
|
2138
|
+
export function switchMapWithIndex<A, R1, E1, B>(f: (index: number, value: A) => ObservableInput<R1, E1, B>) {
|
|
2139
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, B> => {
|
|
2140
|
+
return fa.operate((source, subscriber, environment) => {
|
|
2141
|
+
let innerSubscriber: Subscriber<E | E1, B> | null = null;
|
|
2142
|
+
let index = 0;
|
|
2143
|
+
let isComplete = false;
|
|
2144
|
+
const checkComplete = () => isComplete && !innerSubscriber && subscriber.complete();
|
|
2145
|
+
source.provideEnvironment(environment).subscribe(
|
|
2146
|
+
operatorSubscriber(
|
|
2147
|
+
subscriber,
|
|
2148
|
+
{
|
|
2149
|
+
next: (value) => {
|
|
2150
|
+
innerSubscriber?.unsubscribe();
|
|
2151
|
+
const outerIndex = index++;
|
|
2152
|
+
from(f(outerIndex, value))
|
|
2153
|
+
.provideEnvironment(environment)
|
|
2154
|
+
.subscribe(
|
|
2155
|
+
(innerSubscriber = operatorSubscriber(subscriber, {
|
|
2156
|
+
next: (innerValue) => subscriber.next(innerValue),
|
|
2157
|
+
complete: () => {
|
|
2158
|
+
innerSubscriber = null!;
|
|
2159
|
+
checkComplete();
|
|
2160
|
+
},
|
|
2161
|
+
})),
|
|
2162
|
+
);
|
|
2163
|
+
},
|
|
2170
2164
|
},
|
|
2171
|
-
|
|
2172
|
-
|
|
2173
|
-
|
|
2174
|
-
|
|
2175
|
-
|
|
2176
|
-
)
|
|
2177
|
-
);
|
|
2178
|
-
}
|
|
2165
|
+
() => {
|
|
2166
|
+
isComplete = true;
|
|
2167
|
+
checkComplete();
|
|
2168
|
+
},
|
|
2169
|
+
),
|
|
2170
|
+
);
|
|
2171
|
+
});
|
|
2172
|
+
};
|
|
2179
2173
|
}
|
|
2180
2174
|
|
|
2181
2175
|
/**
|
|
2182
|
-
* @tsplus
|
|
2176
|
+
* @tsplus pipeable fncts.observable.Observable switchMap
|
|
2183
2177
|
*/
|
|
2184
|
-
export function
|
|
2185
|
-
fa: Observable<R, E, A
|
|
2186
|
-
|
|
2187
|
-
|
|
2188
|
-
return fa.switchMapWithIndex((_, a) => f(a));
|
|
2178
|
+
export function switchMap<A, R1, E1, B>(f: (value: A) => ObservableInput<R1, E1, B>) {
|
|
2179
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, B> => {
|
|
2180
|
+
return fa.switchMapWithIndex((_, a) => f(a));
|
|
2181
|
+
};
|
|
2189
2182
|
}
|
|
2190
2183
|
|
|
2191
2184
|
/**
|
|
2192
|
-
* @tsplus
|
|
2185
|
+
* @tsplus pipeable fncts.observable.Observable switchScanWithIndex
|
|
2193
2186
|
*/
|
|
2194
|
-
export function switchScanWithIndex<
|
|
2195
|
-
fa: Observable<R, E, A>,
|
|
2187
|
+
export function switchScanWithIndex<A, R1, E1, B>(
|
|
2196
2188
|
initial: B,
|
|
2197
2189
|
f: (index: number, acc: B, value: A) => ObservableInput<R1, E1, B>,
|
|
2198
|
-
)
|
|
2199
|
-
return
|
|
2200
|
-
|
|
2201
|
-
|
|
2202
|
-
|
|
2203
|
-
|
|
2204
|
-
|
|
2205
|
-
|
|
2206
|
-
|
|
2207
|
-
|
|
2190
|
+
) {
|
|
2191
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, B> => {
|
|
2192
|
+
return fa.operate((source, subscriber, environment) => {
|
|
2193
|
+
let state = initial;
|
|
2194
|
+
source
|
|
2195
|
+
.switchMapWithIndex((index, value) => from(f(index, state, value)).map((b) => ((state = b), b)))
|
|
2196
|
+
.provideEnvironment(environment)
|
|
2197
|
+
.subscribe(subscriber);
|
|
2198
|
+
return () => {
|
|
2199
|
+
state = null!;
|
|
2200
|
+
};
|
|
2201
|
+
});
|
|
2202
|
+
};
|
|
2208
2203
|
}
|
|
2209
2204
|
|
|
2210
2205
|
/**
|
|
2211
|
-
* @tsplus
|
|
2206
|
+
* @tsplus pipeable fncts.observable.Observable switchScan
|
|
2212
2207
|
*/
|
|
2213
|
-
export function
|
|
2214
|
-
fa: Observable<R, E, A
|
|
2215
|
-
|
|
2216
|
-
|
|
2217
|
-
): Observable<R | R1, E | E1, B> {
|
|
2218
|
-
return fa.switchScanWithIndex(initial, (_, b, a) => f(b, a));
|
|
2208
|
+
export function switchScan<A, R1, E1, B>(initial: B, f: (acc: B, value: A) => ObservableInput<R1, E1, B>) {
|
|
2209
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, B> => {
|
|
2210
|
+
return fa.switchScanWithIndex(initial, (_, b, a) => f(b, a));
|
|
2211
|
+
};
|
|
2219
2212
|
}
|
|
2220
2213
|
|
|
2221
2214
|
/**
|
|
2222
|
-
* @tsplus
|
|
2215
|
+
* @tsplus pipeable fncts.observable.Observable take
|
|
2223
2216
|
*/
|
|
2224
|
-
export function
|
|
2225
|
-
return
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
|
|
2229
|
-
|
|
2230
|
-
|
|
2231
|
-
|
|
2232
|
-
|
|
2233
|
-
|
|
2234
|
-
|
|
2235
|
-
|
|
2217
|
+
export function take(count: number) {
|
|
2218
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A> => {
|
|
2219
|
+
return count <= 0
|
|
2220
|
+
? empty()
|
|
2221
|
+
: fa.operate((source, sub, environment) => {
|
|
2222
|
+
let seen = 0;
|
|
2223
|
+
source.provideEnvironment(environment).subscribe(
|
|
2224
|
+
new OperatorSubscriber(sub, {
|
|
2225
|
+
next: (value) => {
|
|
2226
|
+
if (++seen <= count) {
|
|
2227
|
+
sub.next(value);
|
|
2228
|
+
if (count <= seen) {
|
|
2229
|
+
sub.complete();
|
|
2230
|
+
}
|
|
2236
2231
|
}
|
|
2237
|
-
}
|
|
2238
|
-
},
|
|
2239
|
-
|
|
2240
|
-
);
|
|
2241
|
-
|
|
2232
|
+
},
|
|
2233
|
+
}),
|
|
2234
|
+
);
|
|
2235
|
+
});
|
|
2236
|
+
};
|
|
2242
2237
|
}
|
|
2243
2238
|
|
|
2244
2239
|
/**
|
|
2245
|
-
* @tsplus
|
|
2240
|
+
* @tsplus pipeable fncts.observable.Observable takeLast
|
|
2246
2241
|
*/
|
|
2247
|
-
export function
|
|
2248
|
-
return
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
|
|
2257
|
-
|
|
2258
|
-
|
|
2242
|
+
export function takeLast(count: number) {
|
|
2243
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A> => {
|
|
2244
|
+
return count <= 0
|
|
2245
|
+
? empty()
|
|
2246
|
+
: fa.operate((source, subscriber, environment) => {
|
|
2247
|
+
let buffer: A[] = [];
|
|
2248
|
+
source.provideEnvironment(environment).subscribe(
|
|
2249
|
+
operatorSubscriber(
|
|
2250
|
+
subscriber,
|
|
2251
|
+
{
|
|
2252
|
+
next: (value) => {
|
|
2253
|
+
buffer.push(value);
|
|
2254
|
+
count < buffer.length && buffer.shift();
|
|
2255
|
+
},
|
|
2256
|
+
complete: () => {
|
|
2257
|
+
for (const value of buffer) {
|
|
2258
|
+
subscriber.next(value);
|
|
2259
|
+
}
|
|
2260
|
+
subscriber.complete();
|
|
2261
|
+
},
|
|
2259
2262
|
},
|
|
2260
|
-
|
|
2261
|
-
|
|
2262
|
-
subscriber.next(value);
|
|
2263
|
-
}
|
|
2264
|
-
subscriber.complete();
|
|
2263
|
+
() => {
|
|
2264
|
+
buffer = null!;
|
|
2265
2265
|
},
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
|
|
2269
|
-
|
|
2270
|
-
),
|
|
2271
|
-
);
|
|
2272
|
-
});
|
|
2266
|
+
),
|
|
2267
|
+
);
|
|
2268
|
+
});
|
|
2269
|
+
};
|
|
2273
2270
|
}
|
|
2274
2271
|
|
|
2275
2272
|
/**
|
|
2276
|
-
* @tsplus
|
|
2273
|
+
* @tsplus pipeable fncts.observable.Observable takeUntil
|
|
2277
2274
|
*/
|
|
2278
|
-
export function
|
|
2279
|
-
fa: Observable<R, E, A
|
|
2280
|
-
|
|
2281
|
-
)
|
|
2282
|
-
|
|
2283
|
-
|
|
2284
|
-
|
|
2285
|
-
|
|
2275
|
+
export function takeUntil<R1, E1>(notifier: ObservableInput<R1, E1, any>) {
|
|
2276
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, A> => {
|
|
2277
|
+
return fa.operate((source, subscriber, environment) => {
|
|
2278
|
+
from(notifier)
|
|
2279
|
+
.provideEnvironment(environment)
|
|
2280
|
+
.subscribe(operatorSubscriber(subscriber, { next: () => subscriber.complete(), complete: noop }));
|
|
2281
|
+
!subscriber.closed && source.provideEnvironment(environment).subscribe(subscriber);
|
|
2282
|
+
});
|
|
2283
|
+
};
|
|
2286
2284
|
}
|
|
2287
2285
|
|
|
2288
2286
|
/**
|
|
2289
|
-
* @tsplus
|
|
2287
|
+
* @tsplus pipeable fncts.observable.Observable takeWhileWithIndex
|
|
2290
2288
|
*/
|
|
2291
|
-
export function takeWhileWithIndex<
|
|
2292
|
-
fa: Observable<R, E, A>,
|
|
2289
|
+
export function takeWhileWithIndex<A, B extends A>(
|
|
2293
2290
|
refinement: RefinementWithIndex<number, A, B>,
|
|
2294
2291
|
inclusive?: boolean,
|
|
2295
|
-
): Observable<R, E, B>;
|
|
2296
|
-
export function takeWhileWithIndex<
|
|
2297
|
-
fa: Observable<R, E, A>,
|
|
2298
|
-
predicate: PredicateWithIndex<number, A>,
|
|
2299
|
-
inclusive?: boolean,
|
|
2300
|
-
): Observable<R, E, A>;
|
|
2301
|
-
export function takeWhileWithIndex<R, E, A>(
|
|
2302
|
-
fa: Observable<R, E, A>,
|
|
2292
|
+
): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, B>;
|
|
2293
|
+
export function takeWhileWithIndex<A>(
|
|
2303
2294
|
predicate: PredicateWithIndex<number, A>,
|
|
2304
2295
|
inclusive?: boolean,
|
|
2305
|
-
): Observable<R, E, A>
|
|
2306
|
-
|
|
2307
|
-
|
|
2308
|
-
|
|
2309
|
-
|
|
2310
|
-
|
|
2311
|
-
|
|
2312
|
-
(
|
|
2313
|
-
|
|
2314
|
-
|
|
2315
|
-
|
|
2316
|
-
|
|
2317
|
-
|
|
2296
|
+
): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, A>;
|
|
2297
|
+
export function takeWhileWithIndex<A>(predicate: PredicateWithIndex<number, A>, inclusive?: boolean) {
|
|
2298
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R, E, A> => {
|
|
2299
|
+
return fa.operate((source, subscriber, environment) => {
|
|
2300
|
+
let index = 0;
|
|
2301
|
+
source.provideEnvironment(environment).subscribe(
|
|
2302
|
+
operatorSubscriber(subscriber, {
|
|
2303
|
+
next: (value) => {
|
|
2304
|
+
const result = predicate(index++, value);
|
|
2305
|
+
(result || inclusive) && subscriber.next(value);
|
|
2306
|
+
!result && subscriber.complete();
|
|
2307
|
+
},
|
|
2308
|
+
}),
|
|
2309
|
+
);
|
|
2310
|
+
});
|
|
2311
|
+
};
|
|
2318
2312
|
}
|
|
2319
2313
|
|
|
2320
2314
|
/**
|
|
2321
|
-
* @tsplus
|
|
2315
|
+
* @tsplus pipeable fncts.observable.Observable takeWhile
|
|
2322
2316
|
*/
|
|
2323
|
-
export function
|
|
2324
|
-
fa: Observable<R, E, A>,
|
|
2317
|
+
export function takeWhile<A, B extends A>(
|
|
2325
2318
|
refinement: Refinement<A, B>,
|
|
2326
2319
|
inclusive?: boolean,
|
|
2327
|
-
): Observable<R, E, B>;
|
|
2328
|
-
export function
|
|
2329
|
-
fa: Observable<R, E, A>,
|
|
2330
|
-
predicate: Predicate<A>,
|
|
2331
|
-
inclusive?: boolean,
|
|
2332
|
-
): Observable<R, E, A>;
|
|
2333
|
-
export function takeWhile_<R, E, A>(
|
|
2334
|
-
fa: Observable<R, E, A>,
|
|
2320
|
+
): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, B>;
|
|
2321
|
+
export function takeWhile<A>(
|
|
2335
2322
|
predicate: Predicate<A>,
|
|
2336
2323
|
inclusive?: boolean,
|
|
2337
|
-
): Observable<R, E, A>
|
|
2338
|
-
|
|
2324
|
+
): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, A>;
|
|
2325
|
+
export function takeWhile<A>(predicate: Predicate<A>, inclusive?: boolean) {
|
|
2326
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R, E, A> => {
|
|
2327
|
+
return fa.takeWhileWithIndex((_, a) => predicate(a), inclusive);
|
|
2328
|
+
};
|
|
2339
2329
|
}
|
|
2340
2330
|
|
|
2341
2331
|
/**
|
|
2342
|
-
* @tsplus
|
|
2332
|
+
* @tsplus pipeable fncts.observable.Observable tap
|
|
2343
2333
|
*/
|
|
2344
|
-
export function
|
|
2345
|
-
return fa
|
|
2346
|
-
|
|
2347
|
-
|
|
2348
|
-
|
|
2349
|
-
|
|
2350
|
-
|
|
2351
|
-
|
|
2352
|
-
|
|
2353
|
-
|
|
2354
|
-
|
|
2355
|
-
|
|
2356
|
-
|
|
2357
|
-
|
|
2358
|
-
|
|
2359
|
-
|
|
2360
|
-
|
|
2361
|
-
|
|
2362
|
-
|
|
2334
|
+
export function tap<E, A>(observer: Partial<Observer<E, A>>) {
|
|
2335
|
+
return <R>(fa: Observable<R, E, A>): Observable<R, E, A> => {
|
|
2336
|
+
return fa.operate((source, subscriber, environment) => {
|
|
2337
|
+
source.provideEnvironment(environment).subscribe(
|
|
2338
|
+
operatorSubscriber(subscriber, {
|
|
2339
|
+
next: (value) => {
|
|
2340
|
+
observer.next?.(value);
|
|
2341
|
+
subscriber.next(value);
|
|
2342
|
+
},
|
|
2343
|
+
error: (err) => {
|
|
2344
|
+
observer.error?.(err);
|
|
2345
|
+
subscriber.error(err);
|
|
2346
|
+
},
|
|
2347
|
+
complete: () => {
|
|
2348
|
+
observer.complete?.();
|
|
2349
|
+
subscriber.complete();
|
|
2350
|
+
},
|
|
2351
|
+
}),
|
|
2352
|
+
);
|
|
2353
|
+
});
|
|
2354
|
+
};
|
|
2363
2355
|
}
|
|
2364
2356
|
|
|
2365
2357
|
export interface ThrottleConfig {
|
|
@@ -2373,77 +2365,80 @@ export const defaultThrottleConfig: ThrottleConfig = {
|
|
|
2373
2365
|
};
|
|
2374
2366
|
|
|
2375
2367
|
/**
|
|
2376
|
-
* @tsplus
|
|
2368
|
+
* @tsplus pipeable fncts.observable.Observable throttle
|
|
2377
2369
|
*/
|
|
2378
|
-
export function
|
|
2379
|
-
fa: Observable<R, E, A>,
|
|
2370
|
+
export function throttle<A, R1, E1>(
|
|
2380
2371
|
durationSelector: (a: A) => ObservableInput<R1, E1, any>,
|
|
2381
2372
|
{ leading, trailing }: ThrottleConfig = defaultThrottleConfig,
|
|
2382
|
-
)
|
|
2383
|
-
return fa
|
|
2384
|
-
|
|
2385
|
-
|
|
2386
|
-
|
|
2387
|
-
|
|
2388
|
-
|
|
2389
|
-
|
|
2390
|
-
|
|
2391
|
-
|
|
2392
|
-
|
|
2373
|
+
) {
|
|
2374
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, A> => {
|
|
2375
|
+
return fa.operate((source, subscriber, environment) => {
|
|
2376
|
+
let sendValue: Maybe<A> = Nothing();
|
|
2377
|
+
let throttled: Subscription | null = null;
|
|
2378
|
+
let isComplete = false;
|
|
2379
|
+
const endThrottling = () => {
|
|
2380
|
+
throttled?.unsubscribe();
|
|
2381
|
+
throttled = null;
|
|
2382
|
+
if (trailing) {
|
|
2383
|
+
send();
|
|
2384
|
+
isComplete && subscriber.complete();
|
|
2385
|
+
}
|
|
2386
|
+
};
|
|
2387
|
+
const cleanupThrottling = () => {
|
|
2388
|
+
throttled = null;
|
|
2393
2389
|
isComplete && subscriber.complete();
|
|
2394
|
-
}
|
|
2395
|
-
|
|
2396
|
-
|
|
2397
|
-
|
|
2398
|
-
|
|
2399
|
-
|
|
2400
|
-
|
|
2401
|
-
|
|
2402
|
-
|
|
2403
|
-
|
|
2404
|
-
|
|
2405
|
-
|
|
2406
|
-
|
|
2407
|
-
|
|
2408
|
-
|
|
2409
|
-
|
|
2410
|
-
|
|
2411
|
-
|
|
2412
|
-
|
|
2413
|
-
|
|
2414
|
-
|
|
2415
|
-
|
|
2416
|
-
|
|
2417
|
-
|
|
2418
|
-
|
|
2419
|
-
|
|
2420
|
-
|
|
2421
|
-
},
|
|
2422
|
-
complete: () => {
|
|
2423
|
-
isComplete = true;
|
|
2424
|
-
!(trailing && sendValue.isJust() && throttled && !throttled.closed) && subscriber.complete();
|
|
2425
|
-
},
|
|
2426
|
-
}),
|
|
2427
|
-
);
|
|
2428
|
-
});
|
|
2390
|
+
};
|
|
2391
|
+
const startThrottling = (value: A) =>
|
|
2392
|
+
(throttled = from(durationSelector(value))
|
|
2393
|
+
.provideEnvironment(environment)
|
|
2394
|
+
.subscribe(operatorSubscriber(subscriber, { next: endThrottling, complete: cleanupThrottling })));
|
|
2395
|
+
const send = () => {
|
|
2396
|
+
if (sendValue.isJust()) {
|
|
2397
|
+
const { value } = sendValue;
|
|
2398
|
+
sendValue = Nothing();
|
|
2399
|
+
subscriber.next(value);
|
|
2400
|
+
!isComplete && startThrottling(value);
|
|
2401
|
+
}
|
|
2402
|
+
};
|
|
2403
|
+
source.provideEnvironment(environment).subscribe(
|
|
2404
|
+
operatorSubscriber(subscriber, {
|
|
2405
|
+
next: (value) => {
|
|
2406
|
+
sendValue = Just(value);
|
|
2407
|
+
!(throttled && !throttled.closed) && (leading ? send() : startThrottling(value));
|
|
2408
|
+
},
|
|
2409
|
+
complete: () => {
|
|
2410
|
+
isComplete = true;
|
|
2411
|
+
!(trailing && sendValue.isJust() && throttled && !throttled.closed) && subscriber.complete();
|
|
2412
|
+
},
|
|
2413
|
+
}),
|
|
2414
|
+
);
|
|
2415
|
+
});
|
|
2416
|
+
};
|
|
2429
2417
|
}
|
|
2430
2418
|
|
|
2431
2419
|
/**
|
|
2432
|
-
* @tsplus
|
|
2420
|
+
* @tsplus pipeable fncts.observable.Observable throttleTime
|
|
2433
2421
|
*/
|
|
2434
|
-
export function
|
|
2435
|
-
fa: Observable<R, E, A>,
|
|
2422
|
+
export function throttleTime(
|
|
2436
2423
|
duration: number,
|
|
2437
2424
|
scheduler: SchedulerLike = asyncScheduler,
|
|
2438
2425
|
config = defaultThrottleConfig,
|
|
2439
|
-
)
|
|
2440
|
-
|
|
2441
|
-
|
|
2426
|
+
) {
|
|
2427
|
+
return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A> => {
|
|
2428
|
+
const duration$ = timer(duration, scheduler);
|
|
2429
|
+
return fa.throttle(() => duration$, config);
|
|
2430
|
+
};
|
|
2442
2431
|
}
|
|
2443
2432
|
|
|
2444
2433
|
export type TimeoutConfig<R, E, A, B, M = unknown> = (
|
|
2445
|
-
| {
|
|
2446
|
-
|
|
2434
|
+
| {
|
|
2435
|
+
readonly each: number;
|
|
2436
|
+
readonly first?: number | Date;
|
|
2437
|
+
}
|
|
2438
|
+
| {
|
|
2439
|
+
readonly each?: number;
|
|
2440
|
+
readonly first: number | Date;
|
|
2441
|
+
}
|
|
2447
2442
|
) & {
|
|
2448
2443
|
readonly scheduler?: SchedulerLike;
|
|
2449
2444
|
readonly with?: (info: TimeoutInfo<A, M>) => ObservableInput<R, E, B>;
|
|
@@ -2464,74 +2459,75 @@ export class TimeoutError<A, M> extends Error {
|
|
|
2464
2459
|
}
|
|
2465
2460
|
|
|
2466
2461
|
/**
|
|
2467
|
-
* @tsplus
|
|
2462
|
+
* @tsplus pipeable fncts.observable.Observable timeout
|
|
2468
2463
|
*/
|
|
2469
|
-
export function
|
|
2470
|
-
|
|
2471
|
-
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2464
|
+
export function timeout<A, R1, E1, B, M = unknown>(
|
|
2465
|
+
config: TimeoutConfig<R1, E1, A, B, M> & {
|
|
2466
|
+
readonly with: (info: TimeoutInfo<A, M>) => ObservableInput<R1, E1, B>;
|
|
2467
|
+
},
|
|
2468
|
+
): <R, E>(fa: Observable<R, E, A>) => Observable<R | R1, E | E1, A | B>;
|
|
2469
|
+
export function timeout<A, M = unknown>(
|
|
2475
2470
|
config: Omit<TimeoutConfig<never, never, A, any, M>, "with">,
|
|
2476
|
-
): Observable<R, E | TimeoutError<A, M>, A>;
|
|
2477
|
-
export function
|
|
2478
|
-
|
|
2479
|
-
|
|
2480
|
-
): Observable<R | R1, E | E1 | TimeoutError<A, M>, A | B> {
|
|
2481
|
-
|
|
2482
|
-
|
|
2483
|
-
|
|
2484
|
-
|
|
2485
|
-
|
|
2486
|
-
|
|
2487
|
-
|
|
2488
|
-
|
|
2489
|
-
|
|
2490
|
-
|
|
2491
|
-
|
|
2492
|
-
|
|
2493
|
-
|
|
2494
|
-
|
|
2495
|
-
|
|
2496
|
-
|
|
2497
|
-
|
|
2498
|
-
|
|
2499
|
-
|
|
2500
|
-
|
|
2501
|
-
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
|
|
2505
|
-
|
|
2506
|
-
|
|
2507
|
-
|
|
2508
|
-
|
|
2509
|
-
);
|
|
2510
|
-
};
|
|
2511
|
-
|
|
2512
|
-
originalSourceSubscription = source.subscribe(
|
|
2513
|
-
operatorSubscriber(
|
|
2514
|
-
subscriber,
|
|
2515
|
-
{
|
|
2516
|
-
next: (value) => {
|
|
2517
|
-
timerSubscription?.unsubscribe();
|
|
2518
|
-
seen++;
|
|
2519
|
-
lastValue = Just(value);
|
|
2520
|
-
subscriber.next(value);
|
|
2521
|
-
each! > 0 && startTimer(each!);
|
|
2471
|
+
): <R, E>(fa: Observable<R, E, A>) => Observable<R, E | TimeoutError<A, M>, A>;
|
|
2472
|
+
export function timeout(config: any) {
|
|
2473
|
+
return <R, E, A, R1, E1, B, M = unknown>(
|
|
2474
|
+
fa: Observable<R, E, A>,
|
|
2475
|
+
): Observable<R | R1, E | E1 | TimeoutError<A, M>, A | B> => {
|
|
2476
|
+
const {
|
|
2477
|
+
first,
|
|
2478
|
+
each,
|
|
2479
|
+
with: _with = timeoutError,
|
|
2480
|
+
scheduler = asyncScheduler,
|
|
2481
|
+
meta = null!,
|
|
2482
|
+
} = config as TimeoutConfig<R, E1, A, B, M>;
|
|
2483
|
+
return fa.operate((source, subscriber, environment) => {
|
|
2484
|
+
// eslint-disable-next-line prefer-const
|
|
2485
|
+
let originalSourceSubscription: Subscription;
|
|
2486
|
+
let timerSubscription: Subscription;
|
|
2487
|
+
let lastValue: Maybe<A> = Nothing();
|
|
2488
|
+
let seen = 0;
|
|
2489
|
+
const startTimer = (delay: number) => {
|
|
2490
|
+
timerSubscription = caughtSchedule(
|
|
2491
|
+
subscriber,
|
|
2492
|
+
scheduler,
|
|
2493
|
+
() => {
|
|
2494
|
+
originalSourceSubscription.unsubscribe();
|
|
2495
|
+
from<R | R1, E1 | TimeoutError<A, M>, B>(
|
|
2496
|
+
_with({
|
|
2497
|
+
meta,
|
|
2498
|
+
lastValue,
|
|
2499
|
+
seen,
|
|
2500
|
+
}),
|
|
2501
|
+
)
|
|
2502
|
+
.provideEnvironment(environment)
|
|
2503
|
+
.subscribe(subscriber);
|
|
2522
2504
|
},
|
|
2523
|
-
|
|
2524
|
-
|
|
2525
|
-
|
|
2526
|
-
|
|
2527
|
-
|
|
2528
|
-
|
|
2529
|
-
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
|
|
2534
|
-
|
|
2505
|
+
delay,
|
|
2506
|
+
);
|
|
2507
|
+
};
|
|
2508
|
+
originalSourceSubscription = source.provideEnvironment(environment).subscribe(
|
|
2509
|
+
operatorSubscriber(
|
|
2510
|
+
subscriber,
|
|
2511
|
+
{
|
|
2512
|
+
next: (value) => {
|
|
2513
|
+
timerSubscription?.unsubscribe();
|
|
2514
|
+
seen++;
|
|
2515
|
+
lastValue = Just(value);
|
|
2516
|
+
subscriber.next(value);
|
|
2517
|
+
each! > 0 && startTimer(each!);
|
|
2518
|
+
},
|
|
2519
|
+
},
|
|
2520
|
+
() => {
|
|
2521
|
+
if (!timerSubscription?.closed) {
|
|
2522
|
+
timerSubscription?.unsubscribe();
|
|
2523
|
+
}
|
|
2524
|
+
lastValue = Nothing();
|
|
2525
|
+
},
|
|
2526
|
+
),
|
|
2527
|
+
);
|
|
2528
|
+
startTimer(first != null ? (typeof first === "number" ? first : +first - scheduler.now()) : each!);
|
|
2529
|
+
});
|
|
2530
|
+
};
|
|
2535
2531
|
}
|
|
2536
2532
|
|
|
2537
2533
|
function timeoutError<R, A, M>(info: TimeoutInfo<A, M>): Observable<R, TimeoutError<A, M>, never> {
|
|
@@ -2546,104 +2542,106 @@ function toArrayAccumulator(arr: any[], value: any) {
|
|
|
2546
2542
|
* @tsplus getter fncts.observable.Observable toArray
|
|
2547
2543
|
*/
|
|
2548
2544
|
export function toArray<R, E, A>(fa: Observable<R, E, A>): Observable<R, E, ReadonlyArray<A>> {
|
|
2549
|
-
return
|
|
2550
|
-
source
|
|
2545
|
+
return fa.operate((source, subscriber, environment) => {
|
|
2546
|
+
source
|
|
2547
|
+
.foldLeft([] as A[], toArrayAccumulator)
|
|
2548
|
+
.provideEnvironment(environment)
|
|
2549
|
+
.subscribe(subscriber);
|
|
2551
2550
|
});
|
|
2552
2551
|
}
|
|
2553
2552
|
|
|
2554
2553
|
/**
|
|
2555
|
-
* @tsplus
|
|
2554
|
+
* @tsplus pipeable fncts.observable.Observable unique
|
|
2556
2555
|
*/
|
|
2557
|
-
export function
|
|
2558
|
-
fa: Observable<R, E, A
|
|
2559
|
-
|
|
2560
|
-
|
|
2561
|
-
)
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
|
|
2572
|
-
|
|
2573
|
-
|
|
2574
|
-
|
|
2575
|
-
|
|
2576
|
-
|
|
2577
|
-
);
|
|
2578
|
-
});
|
|
2556
|
+
export function unique<A, K, R1, E1 = never>(toKey?: (value: A) => K, flushes?: Observable<R1, E1, any>) {
|
|
2557
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, A> => {
|
|
2558
|
+
return fa.operate((source, subscriber, environment) => {
|
|
2559
|
+
let distinctKeys = HashSet.empty<A | K>();
|
|
2560
|
+
source.provideEnvironment(environment).subscribe(
|
|
2561
|
+
operatorSubscriber(subscriber, {
|
|
2562
|
+
next: (value) => {
|
|
2563
|
+
const key = toKey ? toKey(value) : value;
|
|
2564
|
+
if (!distinctKeys.has(key)) {
|
|
2565
|
+
distinctKeys.add(key);
|
|
2566
|
+
subscriber.next(value);
|
|
2567
|
+
}
|
|
2568
|
+
},
|
|
2569
|
+
}),
|
|
2570
|
+
);
|
|
2571
|
+
flushes
|
|
2572
|
+
?.provideEnvironment(environment)
|
|
2573
|
+
.subscribe(operatorSubscriber(subscriber, { next: () => (distinctKeys = HashSet.empty()), complete: noop }));
|
|
2574
|
+
});
|
|
2575
|
+
};
|
|
2579
2576
|
}
|
|
2580
2577
|
|
|
2581
2578
|
/**
|
|
2582
|
-
* @tsplus
|
|
2579
|
+
* @tsplus pipeable fncts.observable.Observable uniqueUntilChanged
|
|
2583
2580
|
*/
|
|
2584
|
-
export function
|
|
2585
|
-
fa: Observable<R, E, A>,
|
|
2581
|
+
export function uniqueUntilChanged<A, K>(
|
|
2586
2582
|
E: Eq<K>,
|
|
2587
2583
|
keySelector: (value: A) => K,
|
|
2588
|
-
): Observable<R, E, A>;
|
|
2589
|
-
export function
|
|
2590
|
-
fa: Observable<R, E, A>,
|
|
2584
|
+
): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, A>;
|
|
2585
|
+
export function uniqueUntilChanged<A, K>(
|
|
2591
2586
|
equals: (x: K, y: K) => boolean,
|
|
2592
2587
|
keySelector: (value: A) => K,
|
|
2593
|
-
): Observable<R, E, A>;
|
|
2594
|
-
export function
|
|
2595
|
-
export function
|
|
2596
|
-
fa: Observable<R, E, A>,
|
|
2588
|
+
): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, A>;
|
|
2589
|
+
export function uniqueUntilChanged<A>(E: Eq<A>): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, A>;
|
|
2590
|
+
export function uniqueUntilChanged<A>(
|
|
2597
2591
|
equals: (x: A, y: A) => boolean,
|
|
2598
|
-
): Observable<R, E, A>;
|
|
2599
|
-
export function
|
|
2600
|
-
fa: Observable<R, E, A>,
|
|
2592
|
+
): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, A>;
|
|
2593
|
+
export function uniqueUntilChanged<A, K = A>(
|
|
2601
2594
|
E: Eq<K> | ((x: K, y: K) => boolean),
|
|
2602
2595
|
keySelector: (value: A) => K = Function.identity as (_: A) => K,
|
|
2603
|
-
)
|
|
2604
|
-
|
|
2605
|
-
|
|
2606
|
-
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
2612
|
-
|
|
2613
|
-
first
|
|
2614
|
-
|
|
2615
|
-
|
|
2616
|
-
|
|
2617
|
-
|
|
2618
|
-
|
|
2619
|
-
|
|
2620
|
-
|
|
2596
|
+
) {
|
|
2597
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R, E, A> => {
|
|
2598
|
+
const compare = "equals" in E ? E.equals : E;
|
|
2599
|
+
return fa.operate((source, subscriber, environment) => {
|
|
2600
|
+
let previousKey: K;
|
|
2601
|
+
let first = true;
|
|
2602
|
+
source.provideEnvironment(environment).subscribe(
|
|
2603
|
+
operatorSubscriber(subscriber, {
|
|
2604
|
+
next: (value) => {
|
|
2605
|
+
const currentKey = keySelector(value);
|
|
2606
|
+
if (first || !compare(previousKey, currentKey)) {
|
|
2607
|
+
first = false;
|
|
2608
|
+
previousKey = currentKey;
|
|
2609
|
+
subscriber.next(value);
|
|
2610
|
+
}
|
|
2611
|
+
},
|
|
2612
|
+
}),
|
|
2613
|
+
);
|
|
2614
|
+
});
|
|
2615
|
+
};
|
|
2621
2616
|
}
|
|
2622
2617
|
|
|
2623
2618
|
/**
|
|
2624
|
-
* @tsplus
|
|
2619
|
+
* @tsplus pipeable fncts.observable.Observable uniqueUntilKeyChanged
|
|
2625
2620
|
*/
|
|
2626
|
-
export function
|
|
2627
|
-
fa: Observable<R, E, A>,
|
|
2621
|
+
export function uniqueUntilKeyChanged<A, K extends keyof A>(
|
|
2628
2622
|
key: K,
|
|
2629
2623
|
E: Eq<A[K]>,
|
|
2630
|
-
): Observable<R, E, A>;
|
|
2631
|
-
export function
|
|
2632
|
-
fa: Observable<R, E, A>,
|
|
2624
|
+
): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, A>;
|
|
2625
|
+
export function uniqueUntilKeyChanged<A, K extends keyof A>(
|
|
2633
2626
|
key: K,
|
|
2634
2627
|
equals: (x: A[K], y: A[K]) => boolean,
|
|
2635
|
-
): Observable<R, E, A>;
|
|
2636
|
-
export function
|
|
2637
|
-
fa: Observable<R, E, A>,
|
|
2628
|
+
): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, A>;
|
|
2629
|
+
export function uniqueUntilKeyChanged<A, K extends keyof A>(
|
|
2638
2630
|
key: K,
|
|
2639
2631
|
equals: Eq<A[K]> | ((x: A[K], y: A[K]) => boolean),
|
|
2640
|
-
)
|
|
2641
|
-
|
|
2642
|
-
|
|
2632
|
+
) {
|
|
2633
|
+
if ("equals" in equals) {
|
|
2634
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R, E, A> =>
|
|
2635
|
+
fa.uniqueUntilChanged((x, y) => equals.equals(y[key])(x[key]));
|
|
2636
|
+
} else {
|
|
2637
|
+
return <R, E>(fa: Observable<R, E, A>): Observable<R, E, A> =>
|
|
2638
|
+
fa.uniqueUntilChanged((x, y) => equals(x[key], y[key]));
|
|
2639
|
+
}
|
|
2643
2640
|
}
|
|
2644
2641
|
|
|
2645
2642
|
function combineLatestInternal(
|
|
2646
2643
|
subscriber: Subscriber<any, any>,
|
|
2644
|
+
environment: Environment<any>,
|
|
2647
2645
|
observables: ObservableInput<any, any, any>[],
|
|
2648
2646
|
scheduler?: SchedulerLike,
|
|
2649
2647
|
valueTransform: (values: any[]) => any = Function.identity,
|
|
@@ -2655,9 +2653,9 @@ function combineLatestInternal(
|
|
|
2655
2653
|
let remainingFirstValues = length;
|
|
2656
2654
|
for (let i = 0; i < length; i++) {
|
|
2657
2655
|
maybeSchedule(subscriber, scheduler, () => {
|
|
2658
|
-
const source = scheduler ?
|
|
2656
|
+
const source = scheduler ? observables[i]!.pipe(scheduled(scheduler)) : from(observables[i]!);
|
|
2659
2657
|
let hasFirstValue = false;
|
|
2660
|
-
source.subscribe(
|
|
2658
|
+
source.provideEnvironment(environment).subscribe(
|
|
2661
2659
|
operatorSubscriber(subscriber, {
|
|
2662
2660
|
next: (value) => {
|
|
2663
2661
|
values[i] = value;
|
|
@@ -2684,11 +2682,11 @@ function combineLatestInternal(
|
|
|
2684
2682
|
function findInternal<A>(
|
|
2685
2683
|
predicate: PredicateWithIndex<number, A>,
|
|
2686
2684
|
emit: "value" | "index",
|
|
2687
|
-
): <R, E>(source: Observable<R, E, A>, subscriber: Subscriber<E, any>) => void {
|
|
2685
|
+
): <R, E>(source: Observable<R, E, A>, subscriber: Subscriber<E, any>, environment: Environment<R>) => void {
|
|
2688
2686
|
const findIndex = emit === "index";
|
|
2689
|
-
return (source, subscriber) => {
|
|
2687
|
+
return (source, subscriber, environment) => {
|
|
2690
2688
|
let index = 0;
|
|
2691
|
-
source.subscribe(
|
|
2689
|
+
source.provideEnvironment(environment).subscribe(
|
|
2692
2690
|
operatorSubscriber(subscriber, {
|
|
2693
2691
|
next: (value) => {
|
|
2694
2692
|
const i = index++;
|
|
@@ -2724,6 +2722,7 @@ function maybeSchedule(subscription: Subscription, scheduler: SchedulerLike | un
|
|
|
2724
2722
|
function mergeInternal<R, E, A, R1, E1, B>(
|
|
2725
2723
|
source: Observable<R, E, A>,
|
|
2726
2724
|
subscriber: Subscriber<E | E1, B>,
|
|
2725
|
+
environment: Environment<R | R1>,
|
|
2727
2726
|
f: (i: number, a: A) => ObservableInput<R1, E1, B>,
|
|
2728
2727
|
concurrent: number,
|
|
2729
2728
|
onBeforeNext?: (innerValue: B) => void,
|
|
@@ -2735,57 +2734,54 @@ function mergeInternal<R, E, A, R1, E1, B>(
|
|
|
2735
2734
|
let active = 0;
|
|
2736
2735
|
let index = 0;
|
|
2737
2736
|
let isComplete = false;
|
|
2738
|
-
|
|
2739
|
-
const checkComplete = () => {
|
|
2737
|
+
const checkComplete = () => {
|
|
2740
2738
|
if (isComplete && !buffer.length && !active) {
|
|
2741
2739
|
subscriber.complete();
|
|
2742
2740
|
}
|
|
2743
2741
|
};
|
|
2744
|
-
|
|
2745
|
-
const outerNext = (a: A) => (active < concurrent ? doInnerSub(a) : buffer.push(a));
|
|
2746
|
-
|
|
2742
|
+
const outerNext = (a: A) => (active < concurrent ? doInnerSub(a) : buffer.push(a));
|
|
2747
2743
|
const doInnerSub = (a: A) => {
|
|
2748
2744
|
expand && subscriber.next(a as any);
|
|
2749
2745
|
active++;
|
|
2750
2746
|
let innerComplete = false;
|
|
2751
|
-
from(f(index++, a))
|
|
2752
|
-
|
|
2753
|
-
|
|
2754
|
-
|
|
2755
|
-
|
|
2756
|
-
|
|
2757
|
-
|
|
2758
|
-
|
|
2759
|
-
|
|
2760
|
-
|
|
2761
|
-
|
|
2762
|
-
|
|
2763
|
-
|
|
2764
|
-
|
|
2765
|
-
|
|
2747
|
+
from(f(index++, a))
|
|
2748
|
+
.provideEnvironment(environment)
|
|
2749
|
+
.subscribe(
|
|
2750
|
+
new OperatorSubscriber(
|
|
2751
|
+
subscriber,
|
|
2752
|
+
{
|
|
2753
|
+
next: (b) => {
|
|
2754
|
+
onBeforeNext?.(b);
|
|
2755
|
+
if (expand) {
|
|
2756
|
+
outerNext(b as any);
|
|
2757
|
+
} else {
|
|
2758
|
+
subscriber.next(b);
|
|
2759
|
+
}
|
|
2760
|
+
},
|
|
2761
|
+
complete: () => {
|
|
2762
|
+
innerComplete = true;
|
|
2763
|
+
},
|
|
2766
2764
|
},
|
|
2767
|
-
|
|
2768
|
-
|
|
2769
|
-
|
|
2770
|
-
|
|
2771
|
-
|
|
2772
|
-
|
|
2773
|
-
|
|
2774
|
-
|
|
2775
|
-
|
|
2776
|
-
|
|
2765
|
+
() => {
|
|
2766
|
+
if (innerComplete) {
|
|
2767
|
+
try {
|
|
2768
|
+
active--;
|
|
2769
|
+
while (buffer.length && active < concurrent) {
|
|
2770
|
+
const bufferedValue = buffer.shift()!;
|
|
2771
|
+
innerSubScheduler
|
|
2772
|
+
? subscriber.add(innerSubScheduler.schedule(() => doInnerSub(bufferedValue)))
|
|
2773
|
+
: doInnerSub(bufferedValue);
|
|
2774
|
+
}
|
|
2775
|
+
checkComplete();
|
|
2776
|
+
} catch (err) {
|
|
2777
|
+
subscriber.error(Cause.halt(err));
|
|
2777
2778
|
}
|
|
2778
|
-
checkComplete();
|
|
2779
|
-
} catch (err) {
|
|
2780
|
-
subscriber.error(Cause.halt(err));
|
|
2781
2779
|
}
|
|
2782
|
-
}
|
|
2783
|
-
|
|
2784
|
-
)
|
|
2785
|
-
);
|
|
2780
|
+
},
|
|
2781
|
+
),
|
|
2782
|
+
);
|
|
2786
2783
|
};
|
|
2787
|
-
|
|
2788
|
-
source.subscribe(
|
|
2784
|
+
source.provideEnvironment(environment).subscribe(
|
|
2789
2785
|
new OperatorSubscriber(subscriber, {
|
|
2790
2786
|
next: outerNext,
|
|
2791
2787
|
complete: () => {
|
|
@@ -2794,7 +2790,6 @@ function mergeInternal<R, E, A, R1, E1, B>(
|
|
|
2794
2790
|
},
|
|
2795
2791
|
}),
|
|
2796
2792
|
);
|
|
2797
|
-
|
|
2798
2793
|
return () => {
|
|
2799
2794
|
additionalTeardown?.();
|
|
2800
2795
|
};
|
|
@@ -2820,12 +2815,12 @@ export function scanInternal<R, E, A, B>(
|
|
|
2820
2815
|
hasInitial: boolean,
|
|
2821
2816
|
emitOnNext: boolean,
|
|
2822
2817
|
emitBeforeComplete?: undefined | true,
|
|
2823
|
-
): (source: Observable<R, E, A>, subscriber: Subscriber<any, any>) => void {
|
|
2824
|
-
return (source, subscriber) => {
|
|
2818
|
+
): (source: Observable<R, E, A>, subscriber: Subscriber<any, any>, environment: Environment<R>) => void {
|
|
2819
|
+
return (source, subscriber, environment) => {
|
|
2825
2820
|
let hasState = hasInitial;
|
|
2826
2821
|
let state: any = initial;
|
|
2827
2822
|
let index = 0;
|
|
2828
|
-
source.subscribe(
|
|
2823
|
+
source.provideEnvironment(environment).subscribe(
|
|
2829
2824
|
operatorSubscriber(subscriber, {
|
|
2830
2825
|
next: (value) => {
|
|
2831
2826
|
const i = index++;
|