@fncts/observable 0.0.9 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/BehaviorSubject.d.ts +2 -2
  2. package/Notification.d.ts +4 -4
  3. package/Observable/api/connect.d.ts +2 -2
  4. package/Observable/api/connectable.d.ts +2 -2
  5. package/Observable/api/fromEvent.d.ts +4 -0
  6. package/Observable/api/race.d.ts +2 -1
  7. package/Observable/api/raceWith.d.ts +2 -2
  8. package/Observable/api/repeatWhen.d.ts +5 -2
  9. package/Observable/api/retryWhen.d.ts +2 -3
  10. package/Observable/api/share.d.ts +5 -4
  11. package/Observable/api/window.d.ts +2 -2
  12. package/Observable/api/windowCount.d.ts +2 -2
  13. package/Observable/api/windowTime.d.ts +5 -5
  14. package/Observable/api/windowToggle.d.ts +3 -3
  15. package/Observable/api/windowWhen.d.ts +3 -3
  16. package/Observable/api.d.ts +188 -194
  17. package/Observable/definition.d.ts +8 -6
  18. package/Operator.d.ts +2 -2
  19. package/_cjs/Action.cjs.map +1 -1
  20. package/_cjs/AnimationFrameAction.cjs.map +1 -1
  21. package/_cjs/AnimationFrameScheduler.cjs +0 -1
  22. package/_cjs/AnimationFrameScheduler.cjs.map +1 -1
  23. package/_cjs/BehaviorSubject.cjs +1 -1
  24. package/_cjs/BehaviorSubject.cjs.map +1 -1
  25. package/_cjs/Notification.cjs +21 -17
  26. package/_cjs/Notification.cjs.map +1 -1
  27. package/_cjs/Observable/api/connect.cjs +12 -10
  28. package/_cjs/Observable/api/connect.cjs.map +1 -1
  29. package/_cjs/Observable/api/connectable.cjs +6 -4
  30. package/_cjs/Observable/api/connectable.cjs.map +1 -1
  31. package/_cjs/Observable/api/fromCallback.cjs.map +1 -1
  32. package/_cjs/Observable/api/fromEvent.cjs +3 -0
  33. package/_cjs/Observable/api/fromEvent.cjs.map +1 -1
  34. package/_cjs/Observable/api/race.cjs +2 -2
  35. package/_cjs/Observable/api/race.cjs.map +1 -1
  36. package/_cjs/Observable/api/raceWith.cjs +8 -6
  37. package/_cjs/Observable/api/raceWith.cjs.map +1 -1
  38. package/_cjs/Observable/api/repeatWhen.cjs +46 -46
  39. package/_cjs/Observable/api/repeatWhen.cjs.map +1 -1
  40. package/_cjs/Observable/api/retryWhen.cjs +31 -38
  41. package/_cjs/Observable/api/retryWhen.cjs.map +1 -1
  42. package/_cjs/Observable/api/share.cjs +66 -64
  43. package/_cjs/Observable/api/share.cjs.map +1 -1
  44. package/_cjs/Observable/api/window.cjs +35 -33
  45. package/_cjs/Observable/api/window.cjs.map +1 -1
  46. package/_cjs/Observable/api/windowCount.cjs +41 -39
  47. package/_cjs/Observable/api/windowCount.cjs.map +1 -1
  48. package/_cjs/Observable/api/windowTime.cjs +66 -64
  49. package/_cjs/Observable/api/windowTime.cjs.map +1 -1
  50. package/_cjs/Observable/api/windowToggle.cjs +63 -61
  51. package/_cjs/Observable/api/windowToggle.cjs.map +1 -1
  52. package/_cjs/Observable/api/windowWhen.cjs +43 -41
  53. package/_cjs/Observable/api/windowWhen.cjs.map +1 -1
  54. package/_cjs/Observable/api.cjs +1270 -1105
  55. package/_cjs/Observable/api.cjs.map +1 -1
  56. package/_cjs/Observable/definition.cjs +9 -8
  57. package/_cjs/Observable/definition.cjs.map +1 -1
  58. package/_cjs/Observable/dom/animationFrames.cjs.map +1 -1
  59. package/_cjs/Observable.cjs.map +1 -1
  60. package/_cjs/Operator.cjs +11 -9
  61. package/_cjs/Operator.cjs.map +1 -1
  62. package/_cjs/Scheduler.cjs +0 -5
  63. package/_cjs/Scheduler.cjs.map +1 -1
  64. package/_cjs/Subject.cjs +3 -3
  65. package/_cjs/Subject.cjs.map +1 -1
  66. package/_cjs/Subscriber.cjs.map +1 -1
  67. package/_cjs/internal/util.cjs.map +1 -1
  68. package/_mjs/Action.mjs.map +1 -1
  69. package/_mjs/AnimationFrameAction.mjs.map +1 -1
  70. package/_mjs/AnimationFrameScheduler.mjs +0 -2
  71. package/_mjs/AnimationFrameScheduler.mjs.map +1 -1
  72. package/_mjs/BehaviorSubject.mjs +1 -1
  73. package/_mjs/BehaviorSubject.mjs.map +1 -1
  74. package/_mjs/Notification.mjs +18 -14
  75. package/_mjs/Notification.mjs.map +1 -1
  76. package/_mjs/Observable/api/connect.mjs +12 -10
  77. package/_mjs/Observable/api/connect.mjs.map +1 -1
  78. package/_mjs/Observable/api/connectable.mjs +6 -4
  79. package/_mjs/Observable/api/connectable.mjs.map +1 -1
  80. package/_mjs/Observable/api/fromCallback.mjs.map +1 -1
  81. package/_mjs/Observable/api/fromEvent.mjs +4 -0
  82. package/_mjs/Observable/api/fromEvent.mjs.map +1 -1
  83. package/_mjs/Observable/api/race.mjs +2 -2
  84. package/_mjs/Observable/api/race.mjs.map +1 -1
  85. package/_mjs/Observable/api/raceWith.mjs +7 -5
  86. package/_mjs/Observable/api/raceWith.mjs.map +1 -1
  87. package/_mjs/Observable/api/repeatWhen.mjs +47 -44
  88. package/_mjs/Observable/api/repeatWhen.mjs.map +1 -1
  89. package/_mjs/Observable/api/retryWhen.mjs +30 -33
  90. package/_mjs/Observable/api/retryWhen.mjs.map +1 -1
  91. package/_mjs/Observable/api/share.mjs +63 -61
  92. package/_mjs/Observable/api/share.mjs.map +1 -1
  93. package/_mjs/Observable/api/window.mjs +32 -30
  94. package/_mjs/Observable/api/window.mjs.map +1 -1
  95. package/_mjs/Observable/api/windowCount.mjs +40 -38
  96. package/_mjs/Observable/api/windowCount.mjs.map +1 -1
  97. package/_mjs/Observable/api/windowTime.mjs +60 -58
  98. package/_mjs/Observable/api/windowTime.mjs.map +1 -1
  99. package/_mjs/Observable/api/windowToggle.mjs +56 -54
  100. package/_mjs/Observable/api/windowToggle.mjs.map +1 -1
  101. package/_mjs/Observable/api/windowWhen.mjs +42 -40
  102. package/_mjs/Observable/api/windowWhen.mjs.map +1 -1
  103. package/_mjs/Observable/api.mjs +1198 -1031
  104. package/_mjs/Observable/api.mjs.map +1 -1
  105. package/_mjs/Observable/definition.mjs +9 -8
  106. package/_mjs/Observable/definition.mjs.map +1 -1
  107. package/_mjs/Observable/dom/animationFrames.mjs.map +1 -1
  108. package/_mjs/Observable.mjs.map +1 -1
  109. package/_mjs/Operator.mjs +11 -9
  110. package/_mjs/Operator.mjs.map +1 -1
  111. package/_mjs/Scheduler.mjs +0 -6
  112. package/_mjs/Scheduler.mjs.map +1 -1
  113. package/_mjs/Subject.mjs +3 -3
  114. package/_mjs/Subject.mjs.map +1 -1
  115. package/_mjs/Subscriber.mjs.map +1 -1
  116. package/_mjs/internal/util.mjs.map +1 -1
  117. package/_src/Action.ts +0 -1
  118. package/_src/AnimationFrameAction.ts +0 -2
  119. package/_src/AnimationFrameScheduler.ts +2 -7
  120. package/_src/BehaviorSubject.ts +3 -3
  121. package/_src/Notification.ts +21 -23
  122. package/_src/Observable/api/connect.ts +12 -9
  123. package/_src/Observable/api/connectable.ts +6 -7
  124. package/_src/Observable/api/fromCallback.ts +0 -1
  125. package/_src/Observable/api/fromEvent.ts +3 -0
  126. package/_src/Observable/api/race.ts +15 -13
  127. package/_src/Observable/api/raceWith.ts +15 -14
  128. package/_src/Observable/api/repeatWhen.ts +51 -56
  129. package/_src/Observable/api/retryWhen.ts +38 -43
  130. package/_src/Observable/api/share.ts +63 -71
  131. package/_src/Observable/api/window.ts +36 -41
  132. package/_src/Observable/api/windowCount.ts +44 -51
  133. package/_src/Observable/api/windowTime.ts +69 -81
  134. package/_src/Observable/api/windowToggle.ts +69 -73
  135. package/_src/Observable/api/windowWhen.ts +49 -55
  136. package/_src/Observable/api.ts +1489 -1495
  137. package/_src/Observable/definition.ts +24 -18
  138. package/_src/Observable/dom/animationFrames.ts +16 -6
  139. package/_src/Observable/instances.ts +0 -23
  140. package/_src/Observable.ts +0 -2
  141. package/_src/Operator.ts +20 -15
  142. package/_src/Scheduler.ts +0 -6
  143. package/_src/Subject.ts +1 -1
  144. package/_src/Subscriber.ts +3 -2
  145. package/_src/internal/util.ts +8 -4
  146. package/package.json +2 -2
@@ -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
- : mergeAll_(fromArrayLike(sources as ReadonlyArray<ObservableInput<any, any>>), concurrency);
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 fluent fncts.observable.Observable scheduled
254
+ * @tsplus pipeable fncts.observable.Observable scheduled
258
255
  * @tsplus static fncts.observable.ObservableOps scheduled
259
256
  */
260
- export function scheduled<R, E, A>(input: ObservableInput<R, E, A>, scheduler: SchedulerLike): Observable<R, E, A> {
261
- if (isArrayLike(input)) {
262
- return scheduleArray(input, scheduler);
263
- }
264
- if (isPromiseLike(input)) {
265
- return schedulePromise(input, scheduler);
266
- }
267
- if (isIterable(input)) {
268
- return scheduleIterable(input, scheduler);
269
- }
270
- if (isAsyncIterable(input)) {
271
- return scheduleAsyncIterable(input, scheduler);
272
- }
273
- if (isReadableStream(input)) {
274
- return scheduleReadableStreamLike(input, scheduler);
275
- }
276
- return scheduleObservable(from(input), scheduler);
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
- { [K in keyof O]: Observable.TypeOf<O[K]> }
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]!).subscribe(
455
- operatorSubscriber(subscriber, {
456
- next: (value) => {
457
- buffers[sourceIndex]!.push(value);
458
- if (buffers.every((buffer) => buffer.length)) {
459
- const result: any = buffers.map((buffer) => buffer.shift()!);
460
- subscriber.next(result);
461
- if (buffers.some((buffer, i) => !buffer.length && completed[i])) {
462
- subscriber.complete();
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
- complete: () => {
467
- completed[sourceIndex] = true;
468
- !buffers[sourceIndex]!.length && subscriber.complete();
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!;
@@ -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 fluent fncts.observable.Observable zipWith
513
+ * @tsplus pipeable fncts.observable.Observable zipWith
512
514
  */
513
- export function zipWith<R, E, A, R1, E1, B, C>(
514
- fa: Observable<R, E, A>,
515
- fb: Observable<R1, E1, B>,
516
- f: (a: A, b: B) => C,
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 fluent fncts.observable.Observable zip
522
+ * @tsplus pipeable fncts.observable.Observable zip
523
523
  */
524
- export function zip<R, E, A, R1, E1, B>(
525
- fa: Observable<R, E, A>,
526
- fb: Observable<R1, E1, B>,
527
- ): Observable<R | R1, E | E1, readonly [A, B]> {
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 fluent fncts.observable.Observable ap
531
+ * @tsplus pipeable fncts.observable.Observable ap
533
532
  */
534
- export function ap<R, E, A, R1, E1, B>(
535
- fab: Observable<R, E, (a: A) => B>,
536
- fa: Observable<R1, E1, A>,
537
- ): Observable<R | R1, E | E1, B> {
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 fluent fncts.observable.Observable mapWithIndex
540
+ * @tsplus pipeable fncts.observable.Observable mapWithIndex
543
541
  */
544
- export function mapWithIndex<R, E, A, B>(fa: Observable<R, E, A>, f: (i: number, a: A) => B): Observable<R, E, B> {
545
- return fa.operate((source, subscriber) => {
546
- let i = 0;
547
- source.subscribe(
548
- new OperatorSubscriber(subscriber, {
549
- next: (value) => {
550
- subscriber.next(f(i++, value));
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 fluent fncts.observable.Observable map
558
+ * @tsplus pipeable fncts.observable.Observable map
559
559
  */
560
- export function map_<R, E, A, B>(fa: Observable<R, E, A>, f: (a: A) => B): Observable<R, E, B> {
561
- return fa.mapWithIndex((_, a) => f(a));
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 fluent fncts.observable.Observable as
567
+ * @tsplus pipeable fncts.observable.Observable as
566
568
  */
567
- export function as_<R, E, A, B>(fa: Observable<R, E, A>, b: Lazy<B>): Observable<R, E, B> {
568
- return map_(fa, b);
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 fluent fncts.observable.Observable mapError
576
+ * @tsplus pipeable fncts.observable.Observable mapError
573
577
  */
574
- export function mapError_<R, E, A, E1>(fa: Observable<R, E, A>, f: (e: E) => E1): Observable<R, E1, A> {
575
- return fa.operate((source, subscriber) => {
576
- source.subscribe(
577
- new OperatorSubscriber(subscriber, {
578
- error: (err) => {
579
- subscriber.error(err.map(f));
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 operate_(fa, (source, subscriber) => {
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 fluent fncts.observable.Observable filterWithIndex
618
+ * @tsplus pipeable fncts.observable.Observable filterWithIndex
613
619
  */
614
- export function filterWithIndex_<R, E, A, B extends A>(
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 filterWithIndex_<R, E, A>(
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
- return operate_(fa, (source, subscriber) => {
627
- let index = 0;
628
- source.subscribe(
629
- operatorSubscriber(subscriber, { next: (value) => predicate(index++, value) && subscriber.next(value) }),
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 fluent fncts.observable.Observable filter
640
+ * @tsplus pipeable fncts.observable.Observable filter
636
641
  */
637
- export function filter_<R, E, A, B extends A>(
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 filter_<R, E, A>(fa: Observable<R, E, A>, predicate: Predicate<A>): Observable<R, E, A>;
642
- export function filter_<R, E, A>(fa: Observable<R, E, A>, predicate: Predicate<A>): Observable<R, E, A> {
643
- return fa.filterWithIndex((_, a) => predicate(a));
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 fluent fncts.observable.Observable filterMapWithIndex
653
+ * @tsplus pipeable fncts.observable.Observable filterMapWithIndex
648
654
  */
649
- export function filterMapWithIndex<R, E, A, B>(
650
- fa: Observable<R, E, A>,
651
- f: (i: number, a: A) => Maybe<B>,
652
- ): Observable<R, E, B> {
653
- return operate_(fa, (source, subscriber) => {
654
- let index = 0;
655
- source.subscribe(
656
- operatorSubscriber(subscriber, {
657
- next: (value) =>
658
- f(index++, value).match(
659
- () => noop,
660
- (b) => subscriber.next(b),
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 fluent fncts.observable.Observable filterMap
673
+ * @tsplus pipeable fncts.observable.Observable filterMap
669
674
  */
670
- export function filterMap_<R, E, A, B>(fa: Observable<R, E, A>, f: (a: A) => Maybe<B>): Observable<R, E, B> {
671
- return fa.filterMapWithIndex((_, a) => f(a));
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 fluent fncts.observable.Observable partitionWithIndex
682
+ * @tsplus pipeable fncts.observable.Observable partitionWithIndex
676
683
  */
677
- export function partitionWithIndex<R, E, A, B extends A>(
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<R, E, A>(
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<R, E, A>(
686
- fa: Observable<R, E, A>,
687
- predicate: PredicateWithIndex<number, A>,
688
- ): readonly [Observable<R, E, A>, Observable<R, E, A>] {
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 fluent fncts.observable.Observable partition
697
+ * @tsplus pipeable fncts.observable.Observable partition
694
698
  */
695
- export function partition_<R, E, A, B extends A>(
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 partition_<R, E, A>(
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
- return fa.partitionWithIndex((_, a) => predicate(a));
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 fluent fncts.observable.Observable partitionMap
712
+ * @tsplus pipeable fncts.observable.Observable partitionMapWithIndex
743
713
  */
744
- export function partitionMap_<R, E, A, B, C>(
745
- fa: Observable<R, E, A>,
746
- f: (a: A) => Either<B, C>,
747
- ): readonly [Observable<R, E, B>, Observable<R, E, C>] {
748
- return fa.partitionMapWithIndex((_, a) => f(a));
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 fluent fncts.observable.Observable provideEnvironment
742
+ * @tsplus pipeable fncts.observable.Observable partitionMap
753
743
  */
754
- export function provideEnvironment<R, E, A>(
755
- self: Observable<R, E, A>,
756
- environment: Environment<R>,
757
- ): Observable<never, E, A> {
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 fluent fncts.observable.Observable provideService
751
+ * @tsplus pipeable fncts.observable.Observable provideService
763
752
  */
764
- export function provideService<R, E, A, S>(
765
- self: Observable<R, E, A>,
766
- service: S,
767
- /** @tsplus auto */ tag: Tag<S>,
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 fluent fncts.observable.Observable mergeMapWithIndex
760
+ * @tsplus pipeable fncts.observable.Observable mergeMapWithIndex
774
761
  */
775
- export function mergeMapWithIndex<R, E, A, R1, E1, B>(
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
- ): Observable<R | R1, E | E1, B> {
780
- return operate_(ma, (source, sub) => mergeInternal(source, sub, f, concurrent));
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 fluent fncts.observable.Observable mergeMap
772
+ * @tsplus pipeable fncts.observable.Observable mergeMap
785
773
  */
786
- export function mergeMap_<R, E, A, R1, E1, B>(
787
- ma: Observable<R, E, A>,
788
- f: (a: A) => ObservableInput<R1, E1, B>,
789
- concurrent = Infinity,
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 fluent fncts.observable.Observable concatMapWithIndex
781
+ * @tsplus pipeable fncts.observable.Observable concatMapWithIndex
796
782
  */
797
- export function concatMapWithIndex<R, E, A, R1, E1, B>(
798
- ma: Observable<R, E, A>,
799
- f: (i: number, a: A) => ObservableInput<R1, E1, B>,
800
- ): Observable<R | R1, E | E1, B> {
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 fluent fncts.observable.Observable concatMap
790
+ * @tsplus pipeable fncts.observable.Observable concatMap
806
791
  */
807
- export function concatMap_<R, E, A, R1, E1, B>(
808
- ma: Observable<R, E, A>,
809
- f: (a: A) => ObservableInput<R1, E1, B>,
810
- ): Observable<R | R1, E | E1, B> {
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 fluent fncts.observable.Observable contramapEnvironment
799
+ * @tsplus pipeable fncts.observable.Observable contramapEnvironment
816
800
  */
817
- export function contramapEnvironment<R, E, A, R0>(
818
- self: Observable<R, E, A>,
819
- f: (r0: Environment<R0>) => Environment<R>,
820
- ): Observable<R0, E, A> {
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 fluent fncts.observable.Observable foldLeftWithIndex
815
+ * @tsplus pipeable fncts.observable.Observable foldLeftWithIndex
833
816
  */
834
- export function foldLeftWithIndex<R, E, A, B>(
835
- fa: Observable<R, E, A>,
836
- initial: B,
837
- f: (index: number, acc: B, value: A) => B,
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 fluent fncts.observable.Observable foldLeft
824
+ * @tsplus pipeable fncts.observable.Observable foldLeft
844
825
  */
845
- export function foldLeft<R, E, A, B>(
846
- fa: Observable<R, E, A>,
847
- initial: B,
848
- f: (acc: B, value: A) => B,
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 fluent fncts.observable.Observable at
833
+ * @tsplus pipeable fncts.observable.Observable at
855
834
  */
856
- export function at_<R, E, A>(fa: Observable<R, E, A>, index: number): Observable<R, E, Maybe<A>> {
857
- return fa
858
- .filterWithIndex((i) => i === index)
859
- .take(1)
860
- .map(Maybe.just)
861
- .onEmpty(() => Nothing());
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 fluent fncts.observable.Observable audit
846
+ * @tsplus pipeable fncts.observable.Observable audit
866
847
  */
867
- export function audit_<R, E, A, R1, E1>(
868
- fa: Observable<R, E, A>,
869
- durationSelector: (value: A) => ObservableInput<R1, E1, any>,
870
- ): Observable<R | R1, E | E1, A> {
871
- return fa.operate((source, subscriber) => {
872
- let lastValue: Maybe<A> = Nothing();
873
- let durationSubscriber: Subscriber<any, any> | null = null;
874
- let isComplete = false;
875
- const endDuration = () => {
876
- durationSubscriber?.unsubscribe();
877
- durationSubscriber = null;
878
- if (lastValue.isJust()) {
879
- const { value } = lastValue;
880
- lastValue = Nothing();
881
- subscriber.next(value);
882
- }
883
- isComplete && subscriber.complete();
884
- };
885
-
886
- const cleanupDuration = () => {
887
- durationSubscriber = null;
888
- isComplete && subscriber.complete();
889
- };
890
-
891
- source.subscribe(
892
- operatorSubscriber(subscriber, {
893
- next: (value) => {
894
- lastValue = Just(value);
895
- if (!durationSubscriber) {
896
- from(durationSelector(value)).subscribe(
897
- (durationSubscriber = operatorSubscriber(subscriber, { next: endDuration, complete: cleanupDuration })),
898
- );
899
- }
900
- },
901
- complete: () => {
902
- isComplete = true;
903
- (lastValue.isNothing() || !durationSubscriber || durationSubscriber.closed) && subscriber.complete();
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 fluent fncts.observable.Observable auditTime
894
+ * @tsplus pipeable fncts.observable.Observable auditTime
912
895
  */
913
- export function auditTime_<R, E, A>(
914
- fa: Observable<R, E, A>,
915
- duration: number,
916
- scheduler: SchedulerLike = asyncScheduler,
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 fluent fncts.observable.Observable buffer
903
+ * @tsplus pipeable fncts.observable.Observable buffer
923
904
  */
924
- export function buffer_<R, E, A, R1, E1>(
925
- fa: Observable<R, E, A>,
926
- closingNotifier: Observable<R1, E1, any>,
927
- ): Observable<R | R1, E | E1, ReadonlyArray<A>> {
928
- return fa.operate((source, subscriber) => {
929
- let buffer: A[] = [];
930
- source.subscribe(
931
- operatorSubscriber(subscriber, {
932
- next: (value) => buffer.push(value),
933
- complete: () => {
934
- subscriber.next(buffer);
935
- subscriber.complete();
936
- },
937
- }),
938
- );
939
- closingNotifier.subscribe(
940
- operatorSubscriber(subscriber, {
941
- next: () => {
942
- const b = buffer;
943
- buffer = [];
944
- subscriber.next(b);
945
- },
946
- complete: noop,
947
- }),
948
- );
949
- return () => {
950
- buffer = null!;
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 fluent fncts.observable.Observable bufferCount
936
+ * @tsplus pipeable fncts.observable.Observable bufferCount
957
937
  */
958
- export function bufferCount_<R, E, A>(
959
- fa: Observable<R, E, A>,
960
- bufferSize: number,
961
- startBufferEvery?: number,
962
- ): Observable<R, E, ReadonlyArray<A>> {
963
- // eslint-disable-next-line no-param-reassign
964
- startBufferEvery = startBufferEvery ?? bufferSize;
965
- return fa.operate((source, subscriber) => {
966
- let buffers: A[][] = [];
967
- let count = 0;
968
- source.subscribe(
969
- operatorSubscriber(
970
- subscriber,
971
- {
972
- next: (value) => {
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
- if (toEmit) {
985
- for (const buffer of toEmit) {
986
- arrayRemove(buffers, buffer);
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
- complete: () => {
992
- for (const buffer of buffers) {
993
- subscriber.next(buffer);
994
- }
995
- subscriber.complete();
975
+ () => {
976
+ buffers = null!;
996
977
  },
997
- },
998
- () => {
999
- buffers = null!;
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 fluent fncts.observable.Observable bufferTime
1015
- */
1016
- export function bufferTime_<R, E, A>(
1017
- fa: Observable<R, E, A>,
1018
- config: BufferTimeConfig,
1019
- ): Observable<R, E, ReadonlyArray<A>> {
1020
- const {
1021
- bufferTimeSpan,
1022
- bufferCreationInterval = null,
1023
- maxBufferSize = Infinity,
1024
- scheduler = asyncScheduler,
1025
- } = config;
1026
- return fa.operate((source, subscriber) => {
1027
- let bufferRecords: { buffer: A[]; subs: Subscription }[] | null = [];
1028
- let restartOnEmit = true;
1029
- const emit = (record: { buffer: A[]; subs: Subscription }) => {
1030
- const { buffer, subs } = record;
1031
- subs.unsubscribe();
1032
- arrayRemove(bufferRecords, record);
1033
- subscriber.next(buffer);
1034
- restartOnEmit && startBuffer();
1035
- };
1036
- const startBuffer = () => {
1037
- if (bufferRecords) {
1038
- const subs = new Subscription();
1039
- subscriber.add(subs);
1040
- const buffer: A[] = [];
1041
- const record = {
1042
- buffer,
1043
- subs,
1044
- };
1045
- bufferRecords.push(record);
1046
- subs.add(scheduler.schedule(() => emit(record), bufferTimeSpan));
1047
- }
1048
- };
1049
- bufferCreationInterval !== null && bufferCreationInterval >= 0
1050
- ? subscriber.add(
1051
- scheduler.schedule(function () {
1052
- startBuffer();
1053
- !this.closed && subscriber.add(this.schedule(null, bufferCreationInterval));
1054
- }, bufferCreationInterval),
1055
- )
1056
- : (restartOnEmit = true);
1057
- startBuffer();
1058
- const bufferTimeSubscriber = operatorSubscriber(
1059
- subscriber,
1060
- {
1061
- next: (value: A) => {
1062
- const recordsCopy = bufferRecords!.slice();
1063
- for (const record of recordsCopy) {
1064
- const { buffer } = record;
1065
- buffer.push(value);
1066
- maxBufferSize <= buffer.length && emit(record);
1067
- }
1068
- },
1069
- complete: () => {
1070
- while (bufferRecords?.length) {
1071
- subscriber.next(bufferRecords.shift()!.buffer);
1072
- }
1073
- bufferTimeSubscriber?.unsubscribe();
1074
- subscriber.complete();
1075
- subscriber.unsubscribe();
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
- () => (bufferRecords = null),
1079
- );
1080
- source.subscribe(bufferTimeSubscriber);
1081
- });
1059
+ () => (bufferRecords = null),
1060
+ );
1061
+ source.provideEnvironment(environment).subscribe(bufferTimeSubscriber);
1062
+ });
1063
+ };
1082
1064
  }
1083
1065
 
1084
1066
  /**
1085
- * @tsplus fluent fncts.observable.Observable bufferToggle
1067
+ * @tsplus pipeable fncts.observable.Observable bufferToggle
1086
1068
  */
1087
- export function bufferToggle_<R, E, A, R1, E1, B, R2, E2>(
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
- ): Observable<R | R1 | R2, E | E1 | E2, ReadonlyArray<A>> {
1092
- return fa.operate((source, subscriber) => {
1093
- const buffers: A[][] = [];
1094
- from(openings).subscribe(
1095
- operatorSubscriber(subscriber, {
1096
- next: (openValue) => {
1097
- const buffer: A[] = [];
1098
- buffers.push(buffer);
1099
- const closingSubscription = new Subscription();
1100
- const emitBuffer = () => {
1101
- arrayRemove(buffers, buffer);
1102
- subscriber.next(buffer);
1103
- closingSubscription.unsubscribe();
1104
- };
1105
- closingSubscription.add(
1106
- from(closingSelector(openValue)).subscribe(
1107
- operatorSubscriber(subscriber, { next: emitBuffer, complete: noop }),
1108
- ),
1109
- );
1110
- },
1111
- complete: noop,
1112
- }),
1113
- );
1114
- source.subscribe(
1115
- operatorSubscriber(subscriber, {
1116
- next: (value) => {
1117
- for (const buffer of buffers) {
1118
- buffer.push(value);
1119
- }
1120
- },
1121
- complete: () => {
1122
- while (buffers.length > 0) {
1123
- subscriber.next(buffers.shift()!);
1124
- }
1125
- subscriber.complete();
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 fluent fncts.observable.Observable bufferWhen
1134
- */
1135
- export function bufferWhen_<R, E, A, R1, E1>(
1136
- fa: Observable<R, E, A>,
1137
- closingSelector: () => ObservableInput<R1, E1, any>,
1138
- ): Observable<R | R1, E | E1, ReadonlyArray<A>> {
1139
- return fa.operate((source, subscriber) => {
1140
- let buffer: A[] | null = null;
1141
- let closingSubscriber: Subscriber<E | E1, A> | null = null;
1142
- const openBuffer = () => {
1143
- closingSubscriber?.unsubscribe();
1144
- const b = buffer;
1145
- buffer = [];
1146
- b && subscriber.next(b);
1147
- from(closingSelector()).subscribe(
1148
- (closingSubscriber = operatorSubscriber(subscriber, { next: openBuffer, complete: noop })),
1149
- );
1150
- };
1151
- openBuffer();
1152
- source.subscribe(
1153
- operatorSubscriber(
1154
- subscriber,
1155
- {
1156
- next: (value) => buffer?.push(value),
1157
- complete: () => {
1158
- buffer && subscriber.next(buffer);
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
- () => (buffer = closingSubscriber = null),
1163
- ),
1164
- );
1165
- });
1145
+ () => (buffer = closingSubscriber = null),
1146
+ ),
1147
+ );
1148
+ });
1149
+ };
1166
1150
  }
1167
1151
 
1168
1152
  /**
1169
- * @tsplus fluent fncts.observable.Observable catchAllCause
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
- ): Observable<R | R1, E1, A | B> {
1175
- return self.operate((source, subscriber) => {
1176
- let innerSub: Subscription | null = null;
1177
- let syncUnsub = false;
1178
- let handledResult: Observable<R | R1, E1, B>;
1179
- innerSub = source.subscribe(
1180
- operatorSubscriber(subscriber, {
1181
- error: (cause) => {
1182
- handledResult = from(f(cause, source.catchAllCause(f)));
1183
- if (innerSub) {
1184
- innerSub.unsubscribe();
1185
- innerSub = null;
1186
- handledResult.subscribe(subscriber);
1187
- } else {
1188
- syncUnsub = true;
1189
- }
1190
- },
1191
- }),
1192
- );
1193
- if (syncUnsub) {
1194
- innerSub.unsubscribe();
1195
- innerSub = null;
1196
- handledResult!.subscribe(subscriber);
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 mergeAll_(ffa, 1);
1192
+ return ffa.mergeAll(1);
1208
1193
  }
1209
1194
 
1210
1195
  /**
1211
- * @tsplus fluent fncts.observable.Observable concat
1196
+ * @tsplus pipeable fncts.observable.Observable concat
1212
1197
  */
1213
- export function concat_<R, E, A, O extends ReadonlyArray<ObservableInput<any, any>>>(
1214
- fa: Observable<R, E, A>,
1215
- ...sources: O
1216
- ): Observable<
1217
- R | Observable.EnvironmentOf<O[number]>,
1218
- E | Observable.ErrorOf<O[number]>,
1219
- A | Observable.TypeOf<O[number]>
1220
- > {
1221
- return fa.operate((source, subscriber) => {
1222
- fromArrayLike([source, ...sources]).concatAll.subscribe(subscriber);
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 fluent fncts.observable.Observable countWithIndex
1222
+ * @tsplus pipeable fncts.observable.Observable countWithIndex
1235
1223
  */
1236
- export function countWithIndex<R, E, A>(
1237
- fa: Observable<R, E, A>,
1238
- predicate: PredicateWithIndex<number, A>,
1239
- ): Observable<R, E, number> {
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 fluent fncts.observable.Observable countWith
1231
+ * @tsplus pipeable fncts.observable.Observable countWith
1245
1232
  */
1246
- export function countWith_<R, E, A>(fa: Observable<R, E, A>, predicate: Predicate<A>): Observable<R, E, number> {
1247
- return fa.countWithIndex((_, a) => predicate(a));
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() : (combineLatest_(sources[0]!, ...sources.slice(1)) as any),
1246
+ !sources.length ? empty() : (zipLatest(sources[0]!, ...sources.slice(1)) as any),
1258
1247
  );
1259
1248
  }
1260
1249
 
1261
1250
  /**
1262
- * @tsplus fluent fncts.observable.Observable combineLatest
1251
+ * @tsplus pipeable fncts.observable.Observable zipLatest
1263
1252
  */
1264
- export function combineLatest_<R, E, A, O extends ReadonlyArray<ObservableInput<any, any, any>>>(
1265
- self: ObservableInput<R, E, A>,
1266
- ...sources: O
1267
- ): Observable<
1268
- R | Observable.EnvironmentOf<O[number]>,
1269
- E | Observable.ErrorOf<O[number]>,
1270
- [A, ...{ [K in keyof O]: Observable.TypeOf<O[K]> }]
1271
- > {
1272
- if (!sources.length) {
1273
- return from(self).unsafeCoerce();
1274
- }
1275
- return from(self).operate((source, subscriber) => {
1276
- combineLatestInternal(subscriber, [source, ...sources]);
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 fluent fncts.observable.Observable debounceWith
1276
+ * @tsplus pipeable fncts.observable.Observable zipWithLatest
1282
1277
  */
1283
- export function debounceWith_<R, E, A, R1, E1>(
1284
- fa: Observable<R, E, A>,
1285
- durationSelector: (value: A) => ObservableInput<R1, E1, any>,
1286
- ): Observable<R | R1, E | E1, A> {
1287
- return fa.operate((source, subscriber) => {
1288
- let lastValue: Maybe<A> = Nothing();
1289
- let durationSubscriber: Subscriber<E1, any> | null = null;
1290
- const emit = () => {
1291
- durationSubscriber?.unsubscribe();
1292
- durationSubscriber = null;
1293
- if (lastValue.isJust()) {
1294
- const { value } = lastValue;
1295
- lastValue = Nothing();
1296
- subscriber.next(value);
1297
- }
1298
- };
1299
- source.subscribe(
1300
- operatorSubscriber(
1301
- subscriber,
1302
- {
1303
- next: (value) => {
1304
- durationSubscriber?.unsubscribe();
1305
- lastValue = Just(value);
1306
- durationSubscriber = operatorSubscriber(subscriber, { next: emit, complete: noop });
1307
- from(durationSelector(value)).subscribe(durationSubscriber);
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
- complete: () => {
1310
- emit();
1311
- subscriber.complete();
1316
+ () => {
1317
+ lastValue = durationSubscriber = null!;
1312
1318
  },
1313
- },
1314
- () => {
1315
- lastValue = durationSubscriber = null!;
1316
- },
1317
- ),
1318
- );
1319
- });
1319
+ ),
1320
+ );
1321
+ });
1322
+ };
1320
1323
  }
1321
1324
 
1322
1325
  /**
1323
- * @tsplus fluent fncts.observable.Observable debounce
1326
+ * @tsplus pipeable fncts.observable.Observable debounce
1324
1327
  */
1325
- export function debounce_<R, E, A>(
1326
- fa: Observable<R, E, A>,
1327
- dueTime: number,
1328
- scheduler: SchedulerLike = asyncScheduler,
1329
- ): Observable<R, E, A> {
1330
- return fa.operate((source, subscriber) => {
1331
- let activeTask: Subscription | null = null;
1332
- let lastValue: A | null = null;
1333
- let lastTime: number | null = null;
1334
-
1335
- const emit = () => {
1336
- if (activeTask) {
1337
- activeTask.unsubscribe();
1338
- activeTask = null;
1339
- const value = lastValue!;
1340
- lastValue = null;
1341
- subscriber.next(value);
1342
- }
1343
- };
1344
- function emitWhenIdle(this: SchedulerAction<unknown>) {
1345
- const targetTime = lastTime! + dueTime;
1346
- const now = scheduler.now();
1347
- if (now < targetTime) {
1348
- activeTask = this.schedule(undefined, targetTime - now);
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
- emit();
1353
- }
1354
- source.subscribe(
1355
- operatorSubscriber(
1356
- subscriber,
1357
- {
1358
- next: (value) => {
1359
- lastValue = value;
1360
- lastTime = scheduler.now();
1361
- if (!activeTask) {
1362
- activeTask = scheduler.schedule(emitWhenIdle, dueTime);
1363
- subscriber.add(activeTask);
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
- complete: () => {
1367
- emit();
1368
- subscriber.complete();
1370
+ () => {
1371
+ lastValue = activeTask = null;
1369
1372
  },
1370
- },
1371
- () => {
1372
- lastValue = activeTask = null;
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 fluent fncts.observable.Observable delayWithIndex
1401
+ * @tsplus pipeable fncts.observable.Observable delayWithIndex
1402
1402
  */
1403
- export function delayWithIndex<R, E, A, R1, E1>(
1404
- fa: Observable<R, E, A>,
1405
- f: (index: number, value: A) => Observable<R1, E1, any>,
1406
- ): Observable<R | R1, E | E1, A> {
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 fluent fncts.observable.Observable delayWith
1410
+ * @tsplus pipeable fncts.observable.Observable delayWith
1412
1411
  */
1413
- export function delayWith_<R, E, A, R1, E1>(
1414
- fa: Observable<R, E, A>,
1415
- f: (value: A) => Observable<R1, E1, any>,
1416
- ): Observable<R | R1, E | E1, A> {
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 fluent fncts.observable.Observable delay
1419
+ * @tsplus pipeable fncts.observable.Observable delay
1422
1420
  */
1423
- export function delay_<R, E, A>(
1424
- fa: Observable<R, E, A>,
1425
- due: number | Date,
1426
- scheduler: SchedulerLike = asyncScheduler,
1427
- ): Observable<R, E, A> {
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.subscribe(operatorSubscriber(subscriber, { next: (notification) => notification.observe(subscriber) }));
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 fluent fncts.observable.Observable ensuring
1440
+ * @tsplus pipeable fncts.observable.Observable ensuring
1443
1441
  */
1444
- export function ensuring_<R, E, A>(fa: Observable<R, E, A>, finalizer: () => void): Observable<R, E, A> {
1445
- return fa.operate((source, subscriber) => {
1446
- source.subscribe(subscriber);
1447
- subscriber.add(finalizer);
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).subscribe(
1465
- operatorSubscriber(subscriber, {
1466
- complete: () => {
1467
- innerSub = null;
1468
- isComplete && subscriber.complete();
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 fluent fncts.observable.Observable exhaustMapWithIndex
1486
+ * @tsplus pipeable fncts.observable.Observable exhaustMapWithIndex
1485
1487
  */
1486
- export function exhaustMapWithIndex<R, E, A, R1, E1, B>(
1487
- self: Observable<R, E, A>,
1488
- f: (i: number, a: A) => ObservableInput<R1, E1, B>,
1489
- ): Observable<R | R1, E | E1, B> {
1490
- return self.operate((source, subscriber) => {
1491
- let index = 0;
1492
- let innerSub: Subscriber<E1, B> | null = null;
1493
- let isComplete = false;
1494
- source.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)).subscribe(innerSub);
1505
- }
1506
- },
1507
- complete: () => {
1508
- isComplete = true;
1509
- !innerSub && subscriber.complete();
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 fluent fncts.observable.Observable exhaustMap
1520
+ * @tsplus pipeable fncts.observable.Observable exhaustMap
1518
1521
  */
1519
- export function exhaustMap_<R, E, A, R1, E1, B>(
1520
- self: Observable<R, E, A>,
1521
- f: (a: A) => ObservableInput<R1, E1, B>,
1522
- ): Observable<R | R1, E | E1, B> {
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 fluent fncts.observable.Observable expandWithIndex
1529
+ * @tsplus pipeable fncts.observable.Observable expandWithIndex
1528
1530
  */
1529
- export function expandWithIndex<R, E, A, R1, E1, B>(
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
- ): Observable<R | R1, E | E1, B> {
1534
- // eslint-disable-next-line no-param-reassign
1535
- concurrent = (concurrent || 0) < 1 ? Infinity : concurrent;
1536
- return fa.operate((source, subscriber) => mergeInternal(source, subscriber, f, concurrent, undefined, true));
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 fluent fncts.observable.Observable expand
1544
+ * @tsplus pipeable fncts.observable.Observable expand
1541
1545
  */
1542
- export function expand_<R, E, A, R1, E1, B>(
1543
- fa: Observable<R, E, A>,
1544
- f: (a: A) => ObservableInput<R1, E1, B>,
1545
- concurrent = Infinity,
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 fluent fncts.observable.Observable findWithIndex
1553
+ * @tsplus pipeable fncts.observable.Observable findWithIndex
1552
1554
  */
1553
- export function findWithIndex<R, E, A, B extends A>(
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<R, E, A>(
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<R, E, A>(
1562
- fa: Observable<R, E, A>,
1563
- predicate: PredicateWithIndex<number, A>,
1564
- ): Observable<R, E, Maybe<A>> {
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 fluent fncts.observable.Observable find
1568
+ * @tsplus pipeable fncts.observable.Observable find
1570
1569
  */
1571
- export function find_<R, E, A, B extends A>(
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 find_<R, E, A>(fa: Observable<R, E, A>, predicate: Predicate<A>): Observable<R, E, Maybe<A>>;
1576
- export function find_<R, E, A>(fa: Observable<R, E, A>, predicate: Predicate<A>): Observable<R, E, Maybe<A>> {
1577
- return fa.findWithIndex((_, a) => predicate(a));
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 fluent fncts.observable.Observable findIndexWithIndex
1581
+ * @tsplus pipeable fncts.observable.Observable findIndexWithIndex
1582
1582
  */
1583
- export function findIndexWithIndex<R, E, A, B extends A>(
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<R, E, A>(
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<R, E, A>(
1592
- fa: Observable<R, E, A>,
1593
- predicate: PredicateWithIndex<number, A>,
1594
- ): Observable<R, E, number> {
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 fluent fncts.observable.Observable findIndex
1596
+ * @tsplus pipeable fncts.observable.Observable findIndex
1600
1597
  */
1601
- export function findIndex_<R, E, A, B extends A>(
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 findIndex_<R, E, A>(fa: Observable<R, E, A>, predicate: Predicate<A>): Observable<R, E, number>;
1606
- export function findIndex_<R, E, A>(fa: Observable<R, E, A>, predicate: Predicate<A>): Observable<R, E, number> {
1607
- return findIndexWithIndex(fa, (_, a) => predicate(a));
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
- { [K in keyof S]: Observable.TypeOf<S[K]> }
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
- { [K in keyof A]: Observable.TypeOf<A[K]> }
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 fluent fncts.observable.Observable mergeAll
1727
+ * @tsplus pipeable fncts.observable.Observable mergeAll
1726
1728
  */
1727
- export function mergeAll_<R, E, R1, E1, A>(
1728
- self: Observable<R, E, ObservableInput<R1, E1, A>>,
1729
- concurrent = Infinity,
1730
- ): Observable<R | R1, E | E1, A> {
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 fluent fncts.observable.Observable mergeScanWithIndex
1736
+ * @tsplus pipeable fncts.observable.Observable mergeScanWithIndex
1736
1737
  */
1737
- export function mergeScanWithIndex<R, E, A, R1, E1, B>(
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
- ): Observable<R | R1, E | E1, B> {
1743
- return fa.operate((source, subscriber) => {
1744
- let state = initial;
1745
- return mergeInternal(
1746
- source,
1747
- subscriber,
1748
- (index, value) => f(index, state, value),
1749
- concurrent,
1750
- (value) => {
1751
- state = value;
1752
- },
1753
- false,
1754
- undefined,
1755
- () => (state = null!),
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 fluent fncts.observable.Observable mergeScan
1764
+ * @tsplus pipeable fncts.observable.Observable mergeScan
1762
1765
  */
1763
- export function mergeScan_<R, E, A, R1, E1, B>(
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
- ): Observable<R | R1, E | E1, B> {
1769
- return fa.mergeScanWithIndex(initial, (_, b, a) => f(b, a), concurrent);
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 fluent fncts.observable.Observable onEmpty
1813
+ * @tsplus pipeable fncts.observable.Observable onEmpty
1810
1814
  */
1811
- export function onEmpty_<R, E, A, B>(fa: Observable<R, E, A>, f: Lazy<B>): Observable<R, E, A | B> {
1812
- return fa.operate((source, subscriber) => {
1813
- let hasValue = false;
1814
- source.subscribe(
1815
- operatorSubscriber(subscriber, {
1816
- next: (value) => {
1817
- hasValue = true;
1818
- subscriber.next(value);
1819
- },
1820
- complete: () => {
1821
- if (!hasValue) {
1822
- subscriber.next(f());
1823
- }
1824
- subscriber.complete();
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 fluent fncts.observable.Observable repeat
1838
+ * @tsplus pipeable fncts.observable.Observable repeat
1833
1839
  */
1834
- export function repeat_<R, E, A>(fa: Observable<R, E, A>, count = Infinity): Observable<R, E, A> {
1835
- return count <= 0
1836
- ? empty()
1837
- : fa.operate((source, subscriber) => {
1838
- let repeats = 0;
1839
- let innerSub: Subscription | null;
1840
- const loop = () => {
1841
- let syncUnsub = false;
1842
- innerSub = source.subscribe(
1843
- operatorSubscriber(subscriber, {
1844
- complete: () => {
1845
- if (++repeats < count) {
1846
- if (innerSub) {
1847
- innerSub.unsubscribe();
1848
- innerSub = null;
1849
- loop();
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
- syncUnsub = true;
1861
+ subscriber.complete;
1852
1862
  }
1853
- } else {
1854
- subscriber.complete;
1855
- }
1856
- },
1857
- }),
1858
- );
1859
-
1860
- if (syncUnsub) {
1861
- innerSub.unsubscribe();
1862
- innerSub = null;
1863
- loop();
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 fluent fncts.observable.Observable retry
1883
+ * @tsplus pipeable fncts.observable.Observable retry
1877
1884
  */
1878
- export function retry_<R, E, A>(fa: Observable<R, E, A>, count?: number): Observable<R, E, A>;
1879
- export function retry_<R, E, A>(fa: Observable<R, E, A>, config: RetryConfig): Observable<R, E, A>;
1880
- export function retry_<R, E, A>(
1881
- fa: Observable<R, E, A>,
1882
- configOrCount: number | RetryConfig = Infinity,
1883
- ): Observable<R, E, A> {
1884
- let config: RetryConfig;
1885
- if (configOrCount && typeof configOrCount === "object") {
1886
- config = configOrCount;
1887
- } else {
1888
- config = {
1889
- count: configOrCount,
1890
- };
1891
- }
1892
-
1893
- const { count, resetOnSuccess = false } = config;
1894
-
1895
- return count <= 0
1896
- ? fa
1897
- : fa.operate((source, subscriber) => {
1898
- let retries = 0;
1899
- let innerSub: Subscription | null;
1900
- const loop = () => {
1901
- let syncUnsub = false;
1902
- innerSub = source.subscribe(
1903
- operatorSubscriber(subscriber, {
1904
- next: (value) => {
1905
- if (resetOnSuccess) {
1906
- retries = 0;
1907
- }
1908
- subscriber.next(value);
1909
- },
1910
- error: (err) => {
1911
- if (retries++ < count) {
1912
- if (innerSub) {
1913
- innerSub.unsubscribe();
1914
- innerSub = null;
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
- syncUnsub = true;
1923
+ subscriber.error(err);
1918
1924
  }
1919
- } else {
1920
- subscriber.error(err);
1921
- }
1922
- },
1923
- }),
1924
- );
1925
- if (syncUnsub) {
1926
- innerSub.unsubscribe();
1927
- innerSub = null;
1928
- loop();
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 fluent fncts.observable.Observable sample
1940
+ * @tsplus pipeable fncts.observable.Observable sample
1937
1941
  */
1938
- export function sample_<R, E, A, R1, E1>(
1939
- fa: Observable<R, E, A>,
1940
- notifier: Observable<R1, E1, any>,
1941
- ): Observable<R | R1, E | E1, A> {
1942
- return fa.operate((source, subscriber) => {
1943
- let hasValue = false;
1944
- let lastValue: A | null = null;
1945
- source.subscribe(
1946
- operatorSubscriber(subscriber, {
1947
- next: (value) => {
1948
- hasValue = true;
1949
- lastValue = value;
1950
- },
1951
- }),
1952
- );
1953
- const emit = () => {
1954
- if (hasValue) {
1955
- hasValue = false;
1956
- const value = lastValue!;
1957
- lastValue = null;
1958
- subscriber.next(value);
1959
- }
1960
- };
1961
- notifier.subscribe(operatorSubscriber(subscriber, { next: emit, complete: noop }));
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 fluent fncts.observable.Observable sampleTime
1971
+ * @tsplus pipeable fncts.observable.Observable sampleTime
1967
1972
  */
1968
- export function sampleTime_<R, E, A>(
1969
- fa: Observable<R, E, A>,
1970
- period: number,
1971
- scheduler: SchedulerLike = asyncScheduler,
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 fluent fncts.observable.Observable scanLeftWithIndex
1980
+ * @tsplus pipeable fncts.observable.Observable scanLeftWithIndex
1978
1981
  */
1979
- export function scanLeftWithIndex<R, E, A, B>(
1980
- fa: Observable<R, E, A>,
1981
- initial: B,
1982
- f: (index: number, acc: B, value: A) => B,
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 fluent fncts.observable.Observable scanLeft
1989
+ * @tsplus pipeable fncts.observable.Observable scanLeft
1989
1990
  */
1990
- export function scanLeft<R, E, A, B>(
1991
- fa: Observable<R, E, A>,
1992
- initial: B,
1993
- f: (acc: B, value: A) => B,
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 fluent fncts.observable.Observable skip
2022
+ * @tsplus pipeable fncts.observable.Observable skip
2024
2023
  */
2025
- export function skip_<R, E, A>(fa: Observable<R, E, A>, count: number): Observable<R, E, A> {
2026
- return fa.filterWithIndex((index, _) => count <= index);
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 fluent fncts.observable.Observable skipLast
2031
+ * @tsplus pipeable fncts.observable.Observable skipLast
2031
2032
  */
2032
- export function skipLast_<R, E, A>(fa: Observable<R, E, A>, skipCount: number): Observable<R, E, A> {
2033
- return skipCount <= 0
2034
- ? fa
2035
- : fa.operate((source, subscriber) => {
2036
- let ring: A[] = new Array(skipCount);
2037
- let seen = 0;
2038
- source.subscribe(
2039
- operatorSubscriber(subscriber, {
2040
- next: (value) => {
2041
- const valueIndex = seen++;
2042
- if (valueIndex < skipCount) {
2043
- ring[valueIndex] = value;
2044
- } else {
2045
- const index = valueIndex % skipCount;
2046
- const oldValue = ring[index];
2047
- ring[index] = value;
2048
- subscriber.next(oldValue!);
2049
- }
2050
- },
2051
- }),
2052
- );
2053
-
2054
- return () => {
2055
- ring = null!;
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 fluent fncts.observable.Observable skipUntil
2063
+ * @tsplus pipeable fncts.observable.Observable skipUntil
2062
2064
  */
2063
- export function skipUntil_<R, E, A, R1, E1>(
2064
- fa: Observable<R, E, A>,
2065
- notifier: Observable<R1, E1, any>,
2066
- ): Observable<R | R1, E | E1, A> {
2067
- return fa.operate((source, subscriber) => {
2068
- let taking = false;
2069
- const skipSubscriber = operatorSubscriber(subscriber, {
2070
- next: () => {
2071
- skipSubscriber?.unsubscribe();
2072
- taking = true;
2073
- },
2074
- complete: noop,
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 fluent fncts.observable.Observable skipWhile
2087
+ * @tsplus pipeable fncts.observable.Observable skipWhile
2089
2088
  */
2090
- export function skipWhile_<R, E, A>(
2091
- fa: Observable<R, E, A>,
2092
- predicate: PredicateWithIndex<number, A>,
2093
- ): Observable<R, E, A> {
2094
- return fa.operate((source, subscriber) => {
2095
- let taking = false;
2096
- let index = 0;
2097
- source.subscribe(
2098
- operatorSubscriber(subscriber, {
2099
- next: (value) => (taking || (taking = !predicate(index++, value))) && subscriber.next(value),
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 fluent fncts.observable.Observable startWith
2104
+ * @tsplus pipeable fncts.observable.Observable startWith
2107
2105
  */
2108
- export function startWith_<R, E, A, B extends ReadonlyArray<unknown>>(
2109
- fa: Observable<R, E, A>,
2110
- ...values: B
2111
- ): Observable<R, E, A | B[number]> {
2112
- return fa.operate((source, subscriber) => {
2113
- // @ts-expect-error
2114
- source.concat(values).subscribe(subscriber);
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 fluent fncts.observable.Observable subscribeOn
2116
+ * @tsplus pipeable fncts.observable.Observable subscribeOn
2120
2117
  */
2121
- export function subscribeOn_<R, E, A>(
2122
- fa: Observable<R, E, A>,
2123
- scheduler: SchedulerLike,
2124
- delay = 0,
2125
- ): Observable<R, E, A> {
2126
- return fa.operate((source, subscriber) => {
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 switchMap_(ffa, Function.identity);
2132
+ return ffa.switchMap(Function.identity);
2138
2133
  }
2139
-
2140
- /**
2141
- * @tsplus fluent fncts.observable.Observable switchMapWithIndex
2142
- */
2143
- export function switchMapWithIndex<R, E, A, R1, E1, B>(
2144
- fa: Observable<R, E, A>,
2145
- f: (index: number, value: A) => ObservableInput<R1, E1, B>,
2146
- ): Observable<R | R1, E | E1, B> {
2147
- return operate_(fa, (source, subscriber) => {
2148
- let innerSubscriber: Subscriber<E | E1, B> | null = null;
2149
- let index = 0;
2150
- let isComplete = false;
2151
-
2152
- const checkComplete = () => isComplete && !innerSubscriber && subscriber.complete();
2153
-
2154
- source.subscribe(
2155
- operatorSubscriber(
2156
- subscriber,
2157
- {
2158
- next: (value) => {
2159
- innerSubscriber?.unsubscribe();
2160
- const outerIndex = index++;
2161
- from(f(outerIndex, value)).subscribe(
2162
- (innerSubscriber = operatorSubscriber(subscriber, {
2163
- next: (innerValue) => subscriber.next(innerValue),
2164
- complete: () => {
2165
- innerSubscriber = null!;
2166
- checkComplete();
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
- isComplete = true;
2174
- checkComplete();
2175
- },
2176
- ),
2177
- );
2178
- });
2165
+ () => {
2166
+ isComplete = true;
2167
+ checkComplete();
2168
+ },
2169
+ ),
2170
+ );
2171
+ });
2172
+ };
2179
2173
  }
2180
2174
 
2181
2175
  /**
2182
- * @tsplus fluent fncts.observable.Observable switchMap
2176
+ * @tsplus pipeable fncts.observable.Observable switchMap
2183
2177
  */
2184
- export function switchMap_<R, E, A, R1, E1, B>(
2185
- fa: Observable<R, E, A>,
2186
- f: (value: A) => ObservableInput<R1, E1, B>,
2187
- ): Observable<R | R1, E | E1, B> {
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 fluent fncts.observable.Observable switchScanWithIndex
2185
+ * @tsplus pipeable fncts.observable.Observable switchScanWithIndex
2193
2186
  */
2194
- export function switchScanWithIndex<R, E, A, R1, E1, B>(
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
- ): Observable<R | R1, E | E1, B> {
2199
- return operate_(fa, (source, subscriber) => {
2200
- let state = initial;
2201
- switchMapWithIndex(source, (index, value) => from(f(index, state, value)).map((b) => ((state = b), b))).subscribe(
2202
- subscriber,
2203
- );
2204
- return () => {
2205
- state = null!;
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 fluent fncts.observable.Observable switchScan
2206
+ * @tsplus pipeable fncts.observable.Observable switchScan
2212
2207
  */
2213
- export function switchScan_<R, E, A, R1, E1, B>(
2214
- fa: Observable<R, E, A>,
2215
- initial: B,
2216
- f: (acc: B, value: A) => ObservableInput<R1, E1, B>,
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 fluent fncts.observable.Observable take
2215
+ * @tsplus pipeable fncts.observable.Observable take
2223
2216
  */
2224
- export function take_<R, E, A>(fa: Observable<R, E, A>, count: number): Observable<R, E, A> {
2225
- return count <= 0
2226
- ? empty()
2227
- : fa.operate((source, sub) => {
2228
- let seen = 0;
2229
- source.subscribe(
2230
- new OperatorSubscriber(sub, {
2231
- next: (value) => {
2232
- if (++seen <= count) {
2233
- sub.next(value);
2234
- if (count <= seen) {
2235
- sub.complete();
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 fluent fncts.observable.Observable takeLast
2240
+ * @tsplus pipeable fncts.observable.Observable takeLast
2246
2241
  */
2247
- export function takeLast_<R, E, A>(fa: Observable<R, E, A>, count: number): Observable<R, E, A> {
2248
- return count <= 0
2249
- ? empty()
2250
- : fa.operate((source, subscriber) => {
2251
- let buffer: A[] = [];
2252
- source.subscribe(
2253
- operatorSubscriber(
2254
- subscriber,
2255
- {
2256
- next: (value) => {
2257
- buffer.push(value);
2258
- count < buffer.length && buffer.shift();
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
- complete: () => {
2261
- for (const value of buffer) {
2262
- subscriber.next(value);
2263
- }
2264
- subscriber.complete();
2263
+ () => {
2264
+ buffer = null!;
2265
2265
  },
2266
- },
2267
- () => {
2268
- buffer = null!;
2269
- },
2270
- ),
2271
- );
2272
- });
2266
+ ),
2267
+ );
2268
+ });
2269
+ };
2273
2270
  }
2274
2271
 
2275
2272
  /**
2276
- * @tsplus fluent fncts.observable.Observable takeUntil
2273
+ * @tsplus pipeable fncts.observable.Observable takeUntil
2277
2274
  */
2278
- export function takeUntil_<R, E, A, R1, E1>(
2279
- fa: Observable<R, E, A>,
2280
- notifier: ObservableInput<R1, E1, any>,
2281
- ): Observable<R | R1, E | E1, A> {
2282
- return fa.operate((source, subscriber) => {
2283
- from(notifier).subscribe(operatorSubscriber(subscriber, { next: () => subscriber.complete(), complete: noop }));
2284
- !subscriber.closed && source.subscribe(subscriber);
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 fluent fncts.observable.Observable takeWhileWithIndex
2287
+ * @tsplus pipeable fncts.observable.Observable takeWhileWithIndex
2290
2288
  */
2291
- export function takeWhileWithIndex<R, E, A, B extends A>(
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<R, E, A>(
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
- return fa.operate((source, subscriber) => {
2307
- let index = 0;
2308
- source.subscribe(
2309
- operatorSubscriber(subscriber, {
2310
- next: (value) => {
2311
- const result = predicate(index++, value);
2312
- (result || inclusive) && subscriber.next(value);
2313
- !result && subscriber.complete();
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 fluent fncts.observable.Observable takeWhile
2315
+ * @tsplus pipeable fncts.observable.Observable takeWhile
2322
2316
  */
2323
- export function takeWhile_<R, E, A, B extends A>(
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 takeWhile_<R, E, A>(
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
- return fa.takeWhileWithIndex((_, a) => predicate(a), inclusive);
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 fluent fncts.observable.Observable tap
2332
+ * @tsplus pipeable fncts.observable.Observable tap
2343
2333
  */
2344
- export function tap_<R, E, A>(fa: Observable<R, E, A>, observer: Partial<Observer<E, A>>): Observable<R, E, A> {
2345
- return fa.operate((source, subscriber) => {
2346
- source.subscribe(
2347
- operatorSubscriber(subscriber, {
2348
- next: (value) => {
2349
- observer.next?.(value);
2350
- subscriber.next(value);
2351
- },
2352
- error: (err) => {
2353
- observer.error?.(err);
2354
- subscriber.error(err);
2355
- },
2356
- complete: () => {
2357
- observer.complete?.();
2358
- subscriber.complete();
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 fluent fncts.observable.Observable throttle
2368
+ * @tsplus pipeable fncts.observable.Observable throttle
2377
2369
  */
2378
- export function throttle_<R, E, A, R1, E1>(
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
- ): Observable<R | R1, E | E1, A> {
2383
- return fa.operate((source, subscriber) => {
2384
- let sendValue: Maybe<A> = Nothing();
2385
- let throttled: Subscription | null = null;
2386
- let isComplete = false;
2387
-
2388
- const endThrottling = () => {
2389
- throttled?.unsubscribe();
2390
- throttled = null;
2391
- if (trailing) {
2392
- send();
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
- const cleanupThrottling = () => {
2398
- throttled = null;
2399
- isComplete && subscriber.complete();
2400
- };
2401
-
2402
- const startThrottling = (value: A) =>
2403
- (throttled = from(durationSelector(value)).subscribe(
2404
- operatorSubscriber(subscriber, { next: endThrottling, complete: cleanupThrottling }),
2405
- ));
2406
-
2407
- const send = () => {
2408
- if (sendValue.isJust()) {
2409
- const { value } = sendValue;
2410
- sendValue = Nothing();
2411
- subscriber.next(value);
2412
- !isComplete && startThrottling(value);
2413
- }
2414
- };
2415
-
2416
- source.subscribe(
2417
- operatorSubscriber(subscriber, {
2418
- next: (value) => {
2419
- sendValue = Just(value);
2420
- !(throttled && !throttled.closed) && (leading ? send() : startThrottling(value));
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 fluent fncts.observable.Observable throttleTime
2420
+ * @tsplus pipeable fncts.observable.Observable throttleTime
2433
2421
  */
2434
- export function throttleTime_<R, E, A>(
2435
- fa: Observable<R, E, A>,
2422
+ export function throttleTime(
2436
2423
  duration: number,
2437
2424
  scheduler: SchedulerLike = asyncScheduler,
2438
2425
  config = defaultThrottleConfig,
2439
- ): Observable<R, E, A> {
2440
- const duration$ = timer(duration, scheduler);
2441
- return throttle_(fa, () => duration$, config);
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
- | { readonly each: number; readonly first?: number | Date }
2446
- | { readonly each?: number; readonly first: number | Date }
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 fluent fncts.observable.Observable timeout
2462
+ * @tsplus pipeable fncts.observable.Observable timeout
2468
2463
  */
2469
- export function timeout_<R, E, A, R1, E1, B, M = unknown>(
2470
- fa: Observable<R, E, A>,
2471
- config: TimeoutConfig<R1, E1, A, B, M> & { readonly with: (info: TimeoutInfo<A, M>) => ObservableInput<R1, E1, B> },
2472
- ): Observable<R | R1, E | E1, A | B>;
2473
- export function timeout_<R, E, A, M = unknown>(
2474
- fa: Observable<R, E, A>,
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 timeout_<R, E, A, R1, E1, B, M = unknown>(
2478
- fa: Observable<R, E, A>,
2479
- config: any,
2480
- ): Observable<R | R1, E | E1 | TimeoutError<A, M>, A | B> {
2481
- const {
2482
- first,
2483
- each,
2484
- with: _with = timeoutError,
2485
- scheduler = asyncScheduler,
2486
- meta = null!,
2487
- } = config as TimeoutConfig<R, E1, A, B, M>;
2488
- return operate_(fa, (source, subscriber) => {
2489
- // eslint-disable-next-line prefer-const
2490
- let originalSourceSubscription: Subscription;
2491
- let timerSubscription: Subscription;
2492
- let lastValue: Maybe<A> = Nothing();
2493
- let seen = 0;
2494
- const startTimer = (delay: number) => {
2495
- timerSubscription = caughtSchedule(
2496
- subscriber,
2497
- scheduler,
2498
- () => {
2499
- originalSourceSubscription.unsubscribe();
2500
- from<R | R1, E1 | TimeoutError<A, M>, B>(
2501
- _with({
2502
- meta,
2503
- lastValue,
2504
- seen,
2505
- }),
2506
- ).subscribe(subscriber);
2507
- },
2508
- delay,
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
- if (!timerSubscription?.closed) {
2526
- timerSubscription?.unsubscribe();
2527
- }
2528
- lastValue = Nothing();
2529
- },
2530
- ),
2531
- );
2532
-
2533
- startTimer(first != null ? (typeof first === "number" ? first : +first - scheduler.now()) : each!);
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,105 @@ 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 operate_(fa, (source, subscriber) => {
2550
- source.foldLeft([] as A[], toArrayAccumulator).subscribe(subscriber);
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 fluent fncts.observable.Observable unique
2554
+ * @tsplus pipeable fncts.observable.Observable unique
2556
2555
  */
2557
- export function unique_<R, E, A, K, R1, E1 = never>(
2558
- fa: Observable<R, E, A>,
2559
- toKey?: (value: A) => K,
2560
- flushes?: Observable<R1, E1, any>,
2561
- ): Observable<R | R1, E | E1, A> {
2562
- return operate_(fa, (source, subscriber) => {
2563
- let distinctKeys = HashSet.makeDefault<A | K>();
2564
- source.subscribe(
2565
- operatorSubscriber(subscriber, {
2566
- next: (value) => {
2567
- const key = toKey ? toKey(value) : value;
2568
- if (!distinctKeys.has(key)) {
2569
- distinctKeys.add(key);
2570
- subscriber.next(value);
2571
- }
2572
- },
2573
- }),
2574
- );
2575
- flushes?.subscribe(
2576
- operatorSubscriber(subscriber, { next: () => (distinctKeys = HashSet.makeDefault()), complete: noop }),
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.makeDefault<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(
2574
+ operatorSubscriber(subscriber, { next: () => (distinctKeys = HashSet.makeDefault()), complete: noop }),
2575
+ );
2576
+ });
2577
+ };
2579
2578
  }
2580
2579
 
2581
2580
  /**
2582
- * @tsplus fluent fncts.observable.Observable uniqueUntilChanged
2581
+ * @tsplus pipeable fncts.observable.Observable uniqueUntilChanged
2583
2582
  */
2584
- export function uniqueUntilChanged_<R, E, A, K>(
2585
- fa: Observable<R, E, A>,
2583
+ export function uniqueUntilChanged<A, K>(
2586
2584
  E: Eq<K>,
2587
2585
  keySelector: (value: A) => K,
2588
- ): Observable<R, E, A>;
2589
- export function uniqueUntilChanged_<R, E, A, K>(
2590
- fa: Observable<R, E, A>,
2586
+ ): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, A>;
2587
+ export function uniqueUntilChanged<A, K>(
2591
2588
  equals: (x: K, y: K) => boolean,
2592
2589
  keySelector: (value: A) => K,
2593
- ): Observable<R, E, A>;
2594
- export function uniqueUntilChanged_<R, E, A>(fa: Observable<R, E, A>, E: Eq<A>): Observable<R, E, A>;
2595
- export function uniqueUntilChanged_<R, E, A>(
2596
- fa: Observable<R, E, A>,
2590
+ ): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, A>;
2591
+ export function uniqueUntilChanged<A>(E: Eq<A>): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, A>;
2592
+ export function uniqueUntilChanged<A>(
2597
2593
  equals: (x: A, y: A) => boolean,
2598
- ): Observable<R, E, A>;
2599
- export function uniqueUntilChanged_<R, E, A, K = A>(
2600
- fa: Observable<R, E, A>,
2594
+ ): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, A>;
2595
+ export function uniqueUntilChanged<A, K = A>(
2601
2596
  E: Eq<K> | ((x: K, y: K) => boolean),
2602
2597
  keySelector: (value: A) => K = Function.identity as (_: A) => K,
2603
- ): Observable<R, E, A> {
2604
- const compare = "equals" in E ? E.equals : E;
2605
- return fa.operate((source, subscriber) => {
2606
- let previousKey: K;
2607
- let first = true;
2608
- source.subscribe(
2609
- operatorSubscriber(subscriber, {
2610
- next: (value) => {
2611
- const currentKey = keySelector(value);
2612
- if (first || !compare(previousKey, currentKey)) {
2613
- first = false;
2614
- previousKey = currentKey;
2615
- subscriber.next(value);
2616
- }
2617
- },
2618
- }),
2619
- );
2620
- });
2598
+ ) {
2599
+ return <R, E>(fa: Observable<R, E, A>): Observable<R, E, A> => {
2600
+ const compare = "equals" in E ? E.equals : E;
2601
+ return fa.operate((source, subscriber, environment) => {
2602
+ let previousKey: K;
2603
+ let first = true;
2604
+ source.provideEnvironment(environment).subscribe(
2605
+ operatorSubscriber(subscriber, {
2606
+ next: (value) => {
2607
+ const currentKey = keySelector(value);
2608
+ if (first || !compare(previousKey, currentKey)) {
2609
+ first = false;
2610
+ previousKey = currentKey;
2611
+ subscriber.next(value);
2612
+ }
2613
+ },
2614
+ }),
2615
+ );
2616
+ });
2617
+ };
2621
2618
  }
2622
2619
 
2623
2620
  /**
2624
- * @tsplus fluent fncts.observable.Observable uniqueUntilKeyChanged
2621
+ * @tsplus pipeable fncts.observable.Observable uniqueUntilKeyChanged
2625
2622
  */
2626
- export function uniqueUntilKeyChanged_<R, E, A, K extends keyof A>(
2627
- fa: Observable<R, E, A>,
2623
+ export function uniqueUntilKeyChanged<A, K extends keyof A>(
2628
2624
  key: K,
2629
2625
  E: Eq<A[K]>,
2630
- ): Observable<R, E, A>;
2631
- export function uniqueUntilKeyChanged_<R, E, A, K extends keyof A>(
2632
- fa: Observable<R, E, A>,
2626
+ ): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, A>;
2627
+ export function uniqueUntilKeyChanged<A, K extends keyof A>(
2633
2628
  key: K,
2634
2629
  equals: (x: A[K], y: A[K]) => boolean,
2635
- ): Observable<R, E, A>;
2636
- export function uniqueUntilKeyChanged_<R, E, A, K extends keyof A>(
2637
- fa: Observable<R, E, A>,
2630
+ ): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, A>;
2631
+ export function uniqueUntilKeyChanged<A, K extends keyof A>(
2638
2632
  key: K,
2639
2633
  equals: Eq<A[K]> | ((x: A[K], y: A[K]) => boolean),
2640
- ): Observable<R, E, A> {
2641
- const compare = "equals" in equals ? equals.equals : equals;
2642
- return fa.uniqueUntilChanged((x, y) => compare(x[key], y[key]));
2634
+ ) {
2635
+ return <R, E>(fa: Observable<R, E, A>): Observable<R, E, A> => {
2636
+ const compare = "equals" in equals ? equals.equals : equals;
2637
+ return fa.uniqueUntilChanged((x, y) => compare(x[key], y[key]));
2638
+ };
2643
2639
  }
2644
2640
 
2645
2641
  function combineLatestInternal(
2646
2642
  subscriber: Subscriber<any, any>,
2643
+ environment: Environment<any>,
2647
2644
  observables: ObservableInput<any, any, any>[],
2648
2645
  scheduler?: SchedulerLike,
2649
2646
  valueTransform: (values: any[]) => any = Function.identity,
@@ -2655,9 +2652,9 @@ function combineLatestInternal(
2655
2652
  let remainingFirstValues = length;
2656
2653
  for (let i = 0; i < length; i++) {
2657
2654
  maybeSchedule(subscriber, scheduler, () => {
2658
- const source = scheduler ? scheduled(observables[i]!, scheduler) : from(observables[i]!);
2655
+ const source = scheduler ? observables[i]!.pipe(scheduled(scheduler)) : from(observables[i]!);
2659
2656
  let hasFirstValue = false;
2660
- source.subscribe(
2657
+ source.provideEnvironment(environment).subscribe(
2661
2658
  operatorSubscriber(subscriber, {
2662
2659
  next: (value) => {
2663
2660
  values[i] = value;
@@ -2684,11 +2681,11 @@ function combineLatestInternal(
2684
2681
  function findInternal<A>(
2685
2682
  predicate: PredicateWithIndex<number, A>,
2686
2683
  emit: "value" | "index",
2687
- ): <R, E>(source: Observable<R, E, A>, subscriber: Subscriber<E, any>) => void {
2684
+ ): <R, E>(source: Observable<R, E, A>, subscriber: Subscriber<E, any>, environment: Environment<R>) => void {
2688
2685
  const findIndex = emit === "index";
2689
- return (source, subscriber) => {
2686
+ return (source, subscriber, environment) => {
2690
2687
  let index = 0;
2691
- source.subscribe(
2688
+ source.provideEnvironment(environment).subscribe(
2692
2689
  operatorSubscriber(subscriber, {
2693
2690
  next: (value) => {
2694
2691
  const i = index++;
@@ -2724,6 +2721,7 @@ function maybeSchedule(subscription: Subscription, scheduler: SchedulerLike | un
2724
2721
  function mergeInternal<R, E, A, R1, E1, B>(
2725
2722
  source: Observable<R, E, A>,
2726
2723
  subscriber: Subscriber<E | E1, B>,
2724
+ environment: Environment<R | R1>,
2727
2725
  f: (i: number, a: A) => ObservableInput<R1, E1, B>,
2728
2726
  concurrent: number,
2729
2727
  onBeforeNext?: (innerValue: B) => void,
@@ -2735,57 +2733,54 @@ function mergeInternal<R, E, A, R1, E1, B>(
2735
2733
  let active = 0;
2736
2734
  let index = 0;
2737
2735
  let isComplete = false;
2738
-
2739
- const checkComplete = () => {
2736
+ const checkComplete = () => {
2740
2737
  if (isComplete && !buffer.length && !active) {
2741
2738
  subscriber.complete();
2742
2739
  }
2743
2740
  };
2744
-
2745
- const outerNext = (a: A) => (active < concurrent ? doInnerSub(a) : buffer.push(a));
2746
-
2741
+ const outerNext = (a: A) => (active < concurrent ? doInnerSub(a) : buffer.push(a));
2747
2742
  const doInnerSub = (a: A) => {
2748
2743
  expand && subscriber.next(a as any);
2749
2744
  active++;
2750
2745
  let innerComplete = false;
2751
- from(f(index++, a)).subscribe(
2752
- new OperatorSubscriber(
2753
- subscriber,
2754
- {
2755
- next: (b) => {
2756
- onBeforeNext?.(b);
2757
-
2758
- if (expand) {
2759
- outerNext(b as any);
2760
- } else {
2761
- subscriber.next(b);
2762
- }
2763
- },
2764
- complete: () => {
2765
- innerComplete = true;
2746
+ from(f(index++, a))
2747
+ .provideEnvironment(environment)
2748
+ .subscribe(
2749
+ new OperatorSubscriber(
2750
+ subscriber,
2751
+ {
2752
+ next: (b) => {
2753
+ onBeforeNext?.(b);
2754
+ if (expand) {
2755
+ outerNext(b as any);
2756
+ } else {
2757
+ subscriber.next(b);
2758
+ }
2759
+ },
2760
+ complete: () => {
2761
+ innerComplete = true;
2762
+ },
2766
2763
  },
2767
- },
2768
- () => {
2769
- if (innerComplete) {
2770
- try {
2771
- active--;
2772
- while (buffer.length && active < concurrent) {
2773
- const bufferedValue = buffer.shift()!;
2774
- innerSubScheduler
2775
- ? subscriber.add(innerSubScheduler.schedule(() => doInnerSub(bufferedValue)))
2776
- : doInnerSub(bufferedValue);
2764
+ () => {
2765
+ if (innerComplete) {
2766
+ try {
2767
+ active--;
2768
+ while (buffer.length && active < concurrent) {
2769
+ const bufferedValue = buffer.shift()!;
2770
+ innerSubScheduler
2771
+ ? subscriber.add(innerSubScheduler.schedule(() => doInnerSub(bufferedValue)))
2772
+ : doInnerSub(bufferedValue);
2773
+ }
2774
+ checkComplete();
2775
+ } catch (err) {
2776
+ subscriber.error(Cause.halt(err));
2777
2777
  }
2778
- checkComplete();
2779
- } catch (err) {
2780
- subscriber.error(Cause.halt(err));
2781
2778
  }
2782
- }
2783
- },
2784
- ),
2785
- );
2779
+ },
2780
+ ),
2781
+ );
2786
2782
  };
2787
-
2788
- source.subscribe(
2783
+ source.provideEnvironment(environment).subscribe(
2789
2784
  new OperatorSubscriber(subscriber, {
2790
2785
  next: outerNext,
2791
2786
  complete: () => {
@@ -2794,7 +2789,6 @@ function mergeInternal<R, E, A, R1, E1, B>(
2794
2789
  },
2795
2790
  }),
2796
2791
  );
2797
-
2798
2792
  return () => {
2799
2793
  additionalTeardown?.();
2800
2794
  };
@@ -2820,12 +2814,12 @@ export function scanInternal<R, E, A, B>(
2820
2814
  hasInitial: boolean,
2821
2815
  emitOnNext: boolean,
2822
2816
  emitBeforeComplete?: undefined | true,
2823
- ): (source: Observable<R, E, A>, subscriber: Subscriber<any, any>) => void {
2824
- return (source, subscriber) => {
2817
+ ): (source: Observable<R, E, A>, subscriber: Subscriber<any, any>, environment: Environment<R>) => void {
2818
+ return (source, subscriber, environment) => {
2825
2819
  let hasState = hasInitial;
2826
2820
  let state: any = initial;
2827
2821
  let index = 0;
2828
- source.subscribe(
2822
+ source.provideEnvironment(environment).subscribe(
2829
2823
  operatorSubscriber(subscriber, {
2830
2824
  next: (value) => {
2831
2825
  const i = index++;