@fncts/observable 0.0.26 → 0.0.28

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 (149) hide show
  1. package/Observable/api/raceWith.d.ts +0 -1
  2. package/Observable/api/repeatWhen.d.ts +1 -1
  3. package/Observable/api/share.d.ts +1 -1
  4. package/Observable/api.d.ts +4 -4
  5. package/Observable/definition.d.ts +1 -4
  6. package/Observable.d.ts +16 -16
  7. package/ObservableRef.d.ts +2 -2
  8. package/Operator.d.ts +3 -3
  9. package/Subject.d.ts +14 -5
  10. package/Subscriber.d.ts +23 -8
  11. package/Subscription.d.ts +2 -2
  12. package/_cjs/Action.cjs +1 -1
  13. package/_cjs/AnimationFrameAction.cjs +2 -2
  14. package/_cjs/AnimationFrameScheduler.cjs +2 -2
  15. package/_cjs/AsyncAction.cjs +4 -4
  16. package/_cjs/AsyncAction.cjs.map +1 -1
  17. package/_cjs/AsyncScheduler.cjs +2 -2
  18. package/_cjs/BehaviorSubject.cjs +2 -2
  19. package/_cjs/BehaviorSubject.cjs.map +1 -1
  20. package/_cjs/Observable/api/connect.cjs +7 -7
  21. package/_cjs/Observable/api/connect.cjs.map +1 -1
  22. package/_cjs/Observable/api/connectable.cjs +4 -4
  23. package/_cjs/Observable/api/connectable.cjs.map +1 -1
  24. package/_cjs/Observable/api/fromCallback.cjs +2 -2
  25. package/_cjs/Observable/api/fromEvent.cjs +1 -1
  26. package/_cjs/Observable/api/race.cjs +4 -4
  27. package/_cjs/Observable/api/race.cjs.map +1 -1
  28. package/_cjs/Observable/api/raceWith.cjs +3 -4
  29. package/_cjs/Observable/api/raceWith.cjs.map +1 -1
  30. package/_cjs/Observable/api/repeatWhen.cjs +9 -8
  31. package/_cjs/Observable/api/repeatWhen.cjs.map +1 -1
  32. package/_cjs/Observable/api/retryWhen.cjs +9 -8
  33. package/_cjs/Observable/api/retryWhen.cjs.map +1 -1
  34. package/_cjs/Observable/api/share.cjs +9 -9
  35. package/_cjs/Observable/api/share.cjs.map +1 -1
  36. package/_cjs/Observable/api/window.cjs +12 -11
  37. package/_cjs/Observable/api/window.cjs.map +1 -1
  38. package/_cjs/Observable/api/windowCount.cjs +12 -10
  39. package/_cjs/Observable/api/windowCount.cjs.map +1 -1
  40. package/_cjs/Observable/api/windowTime.cjs +12 -11
  41. package/_cjs/Observable/api/windowTime.cjs.map +1 -1
  42. package/_cjs/Observable/api/windowToggle.cjs +26 -24
  43. package/_cjs/Observable/api/windowToggle.cjs.map +1 -1
  44. package/_cjs/Observable/api/windowWhen.cjs +17 -15
  45. package/_cjs/Observable/api/windowWhen.cjs.map +1 -1
  46. package/_cjs/Observable/api.cjs +325 -311
  47. package/_cjs/Observable/api.cjs.map +1 -1
  48. package/_cjs/Observable/definition.cjs +7 -14
  49. package/_cjs/Observable/definition.cjs.map +1 -1
  50. package/_cjs/Observable/dom/animationFrames.cjs +3 -3
  51. package/_cjs/Observable/dom/animationFrames.cjs.map +1 -1
  52. package/_cjs/Observable.cjs +64 -64
  53. package/_cjs/Observable.cjs.map +1 -1
  54. package/_cjs/ObservableRef/api.cjs +2 -2
  55. package/_cjs/ObservableRef/atomic.cjs +2 -2
  56. package/_cjs/ObservableRef/definition.cjs +1 -1
  57. package/_cjs/ObservableRef.cjs +8 -8
  58. package/_cjs/ObservableRef.cjs.map +1 -1
  59. package/_cjs/Operator.cjs +9 -14
  60. package/_cjs/Operator.cjs.map +1 -1
  61. package/_cjs/Scheduler.cjs +2 -2
  62. package/_cjs/Subject.cjs +69 -43
  63. package/_cjs/Subject.cjs.map +1 -1
  64. package/_cjs/Subscriber.cjs +122 -70
  65. package/_cjs/Subscriber.cjs.map +1 -1
  66. package/_cjs/Subscription.cjs +7 -7
  67. package/_cjs/Subscription.cjs.map +1 -1
  68. package/_cjs/config.cjs +15 -0
  69. package/_cjs/config.cjs.map +1 -0
  70. package/_cjs/index.cjs +13 -13
  71. package/_cjs/internal/animationFrameProvider.cjs +1 -1
  72. package/_cjs/internal/args.cjs +1 -1
  73. package/_cjs/internal/util.cjs +2 -2
  74. package/_mjs/AsyncAction.mjs +3 -3
  75. package/_mjs/AsyncAction.mjs.map +1 -1
  76. package/_mjs/BehaviorSubject.mjs +1 -1
  77. package/_mjs/BehaviorSubject.mjs.map +1 -1
  78. package/_mjs/Observable/api/connect.mjs +6 -6
  79. package/_mjs/Observable/api/connect.mjs.map +1 -1
  80. package/_mjs/Observable/api/connectable.mjs +1 -1
  81. package/_mjs/Observable/api/connectable.mjs.map +1 -1
  82. package/_mjs/Observable/api/race.mjs +1 -1
  83. package/_mjs/Observable/api/race.mjs.map +1 -1
  84. package/_mjs/Observable/api/raceWith.mjs +3 -4
  85. package/_mjs/Observable/api/raceWith.mjs.map +1 -1
  86. package/_mjs/Observable/api/repeatWhen.mjs +9 -8
  87. package/_mjs/Observable/api/repeatWhen.mjs.map +1 -1
  88. package/_mjs/Observable/api/retryWhen.mjs +9 -8
  89. package/_mjs/Observable/api/retryWhen.mjs.map +1 -1
  90. package/_mjs/Observable/api/share.mjs +8 -8
  91. package/_mjs/Observable/api/share.mjs.map +1 -1
  92. package/_mjs/Observable/api/window.mjs +12 -11
  93. package/_mjs/Observable/api/window.mjs.map +1 -1
  94. package/_mjs/Observable/api/windowCount.mjs +12 -10
  95. package/_mjs/Observable/api/windowCount.mjs.map +1 -1
  96. package/_mjs/Observable/api/windowTime.mjs +11 -10
  97. package/_mjs/Observable/api/windowTime.mjs.map +1 -1
  98. package/_mjs/Observable/api/windowToggle.mjs +25 -23
  99. package/_mjs/Observable/api/windowToggle.mjs.map +1 -1
  100. package/_mjs/Observable/api/windowWhen.mjs +17 -15
  101. package/_mjs/Observable/api/windowWhen.mjs.map +1 -1
  102. package/_mjs/Observable/api.mjs +304 -290
  103. package/_mjs/Observable/api.mjs.map +1 -1
  104. package/_mjs/Observable/definition.mjs +2 -9
  105. package/_mjs/Observable/definition.mjs.map +1 -1
  106. package/_mjs/Observable/dom/animationFrames.mjs +1 -1
  107. package/_mjs/Observable/dom/animationFrames.mjs.map +1 -1
  108. package/_mjs/Observable.mjs +16 -18
  109. package/_mjs/Observable.mjs.map +1 -1
  110. package/_mjs/ObservableRef.mjs +2 -3
  111. package/_mjs/ObservableRef.mjs.map +1 -1
  112. package/_mjs/Operator.mjs +6 -11
  113. package/_mjs/Operator.mjs.map +1 -1
  114. package/_mjs/Subject.mjs +65 -39
  115. package/_mjs/Subject.mjs.map +1 -1
  116. package/_mjs/Subscriber.mjs +119 -67
  117. package/_mjs/Subscriber.mjs.map +1 -1
  118. package/_mjs/Subscription.mjs +6 -6
  119. package/_mjs/Subscription.mjs.map +1 -1
  120. package/_mjs/config.mjs +9 -0
  121. package/_mjs/config.mjs.map +1 -0
  122. package/_src/AsyncAction.ts +3 -3
  123. package/_src/BehaviorSubject.ts +1 -1
  124. package/_src/Observable/api/connect.ts +2 -2
  125. package/_src/Observable/api/connectable.ts +1 -1
  126. package/_src/Observable/api/race.ts +1 -1
  127. package/_src/Observable/api/raceWith.ts +2 -5
  128. package/_src/Observable/api/repeatWhen.ts +4 -4
  129. package/_src/Observable/api/retryWhen.ts +3 -3
  130. package/_src/Observable/api/share.ts +6 -6
  131. package/_src/Observable/api/window.ts +3 -3
  132. package/_src/Observable/api/windowCount.ts +30 -33
  133. package/_src/Observable/api/windowTime.ts +4 -4
  134. package/_src/Observable/api/windowToggle.ts +19 -21
  135. package/_src/Observable/api/windowWhen.ts +10 -13
  136. package/_src/Observable/api.ts +358 -363
  137. package/_src/Observable/definition.ts +2 -17
  138. package/_src/Observable/dom/animationFrames.ts +1 -1
  139. package/_src/Observable.ts +17 -18
  140. package/_src/ObservableRef.ts +2 -3
  141. package/_src/Operator.ts +9 -21
  142. package/_src/Subject.ts +66 -39
  143. package/_src/Subscriber.ts +134 -59
  144. package/_src/Subscription.ts +8 -8
  145. package/_src/config.ts +40 -0
  146. package/_src/global.ts +1 -1
  147. package/config.d.ts +36 -0
  148. package/global.d.ts +1 -1
  149. package/package.json +4 -2
@@ -97,7 +97,7 @@ export function from<R = never, E = never, A = never>(input: ObservableInput<R,
97
97
 
98
98
  export function fromArrayLike<A>(input: ArrayLike<A>): Observable<never, never, A> {
99
99
  return new Observable((s) => {
100
- for (let i = 0; i < input.length && !s.closed; i++) {
100
+ for (let i = 0; i < input.length && !s._closed; i++) {
101
101
  s.next(input[i]!);
102
102
  }
103
103
  s.complete();
@@ -114,7 +114,7 @@ export function fromIterable<A>(iterable: Iterable<A>): Observable<never, never,
114
114
  return new Observable((s) => {
115
115
  for (const value of iterable) {
116
116
  s.next(value);
117
- if (s.closed) {
117
+ if (s._closed) {
118
118
  return;
119
119
  }
120
120
  }
@@ -127,7 +127,7 @@ export function fromPromise<A>(promise: PromiseLike<A>): Observable<never, never
127
127
  promise
128
128
  .then(
129
129
  (value) => {
130
- if (!s.closed) {
130
+ if (!s._closed) {
131
131
  s.next(value);
132
132
  s.complete();
133
133
  }
@@ -195,7 +195,7 @@ export function iterate<S>(options: IterateOptions<S>): Observable<never, never,
195
195
  async function process<A>(asyncIterable: AsyncIterable<A>, subscriber: Subscriber<never, A>) {
196
196
  for await (const value of asyncIterable) {
197
197
  subscriber.next(value);
198
- if (subscriber.closed) {
198
+ if (subscriber._closed) {
199
199
  return;
200
200
  }
201
201
  }
@@ -282,7 +282,7 @@ export function scheduleArray<A>(input: ArrayLike<A>, scheduler: SchedulerLike):
282
282
  s.complete();
283
283
  } else {
284
284
  s.next(input[i++]!);
285
- if (!s.closed) {
285
+ if (!s._closed) {
286
286
  this.schedule();
287
287
  }
288
288
  }
@@ -417,7 +417,7 @@ export function timer(
417
417
  }
418
418
  let n = 0;
419
419
  return scheduler.schedule(function () {
420
- if (!s.closed) {
420
+ if (!s._closed) {
421
421
  s.next(n++);
422
422
  if (0 <= intervalDuration) {
423
423
  this.schedule(undefined, intervalDuration);
@@ -448,7 +448,7 @@ export function makeZip<O extends ReadonlyArray<ObservableInput<any, any>>>(
448
448
  subscriber.add(() => {
449
449
  buffers = completed = null!;
450
450
  });
451
- for (let sourceIndex = 0; !subscriber.closed && sourceIndex < sources.length; sourceIndex++) {
451
+ for (let sourceIndex = 0; !subscriber._closed && sourceIndex < sources.length; sourceIndex++) {
452
452
  from(sources[sourceIndex]!)
453
453
  .provideEnvironment(environment)
454
454
  .subscribe(
@@ -486,7 +486,7 @@ export function fromIO<R, E, A>(io: IO<R, E, A>, scheduler: SchedulerLike = asyn
486
486
  const scheduled = scheduler.schedule(() => {
487
487
  fiber = io.provideEnvironment(env).unsafeRunFiber();
488
488
  fiber.addObserver((exit) => {
489
- if (!s.closed) {
489
+ if (!s._closed) {
490
490
  exit.match(
491
491
  (cause) => s.error(cause),
492
492
  (a) => s.next(a),
@@ -539,12 +539,12 @@ export function ap<A, R1, E1>(fa: Observable<R1, E1, A>) {
539
539
  */
540
540
  export function mapWithIndex<A, B>(f: (i: number, a: A) => B) {
541
541
  return <R, E>(fa: Observable<R, E, A>): Observable<R, E, B> => {
542
- return fa.operate((source, subscriber, environment) => {
542
+ return new Observable((destination, environment) => {
543
543
  let i = 0;
544
- source.provideEnvironment(environment).subscribe(
545
- new OperatorSubscriber(subscriber, {
544
+ return fa.provideEnvironment(environment).subscribe(
545
+ destination.operate({
546
546
  next: (value) => {
547
- subscriber.next(f(i++, value));
547
+ destination.next(f(i++, value));
548
548
  },
549
549
  }),
550
550
  );
@@ -575,9 +575,9 @@ export function as<B>(b: Lazy<B>) {
575
575
  */
576
576
  export function mapError<E, E1>(f: (e: E) => E1) {
577
577
  return <R, A>(fa: Observable<R, E, A>): Observable<R, E1, A> => {
578
- return fa.operate((source, subscriber, environment) => {
579
- source.provideEnvironment(environment).subscribe(
580
- new OperatorSubscriber(subscriber, {
578
+ return new Observable((subscriber, environment) => {
579
+ return fa.provideEnvironment(environment).subscribe(
580
+ subscriber.operate({
581
581
  error: (err) => {
582
582
  subscriber.error(err.map(f));
583
583
  },
@@ -591,9 +591,9 @@ export function mapError<E, E1>(f: (e: E) => E1) {
591
591
  * @tsplus getter fncts.observable.Observable swap
592
592
  */
593
593
  export function swap<R, E, A>(fa: Observable<R, E, A>): Observable<R, A, E> {
594
- return fa.operate((source, subscriber, environment) => {
595
- source.provideEnvironment(environment).subscribe(
596
- new OperatorSubscriber(subscriber, {
594
+ return new Observable((subscriber, environment) => {
595
+ return fa.provideEnvironment(environment).subscribe(
596
+ subscriber.operate({
597
597
  next: (value) => {
598
598
  subscriber.error(Cause.fail(value));
599
599
  },
@@ -623,13 +623,13 @@ export function filterWithIndex<A>(
623
623
  ): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, A>;
624
624
  export function filterWithIndex<A>(predicate: PredicateWithIndex<number, A>) {
625
625
  return <R, E>(fa: Observable<R, E, A>): Observable<R, E, A> => {
626
- return fa.operate((source, subscriber, environment) => {
626
+ return new Observable((subscriber, environment) => {
627
627
  let index = 0;
628
- source
629
- .provideEnvironment(environment)
630
- .subscribe(
631
- operatorSubscriber(subscriber, { next: (value) => predicate(index++, value) && subscriber.next(value) }),
632
- );
628
+ return fa.provideEnvironment(environment).subscribe(
629
+ subscriber.operate({
630
+ next: (value) => predicate(index++, value) && subscriber.next(value),
631
+ }),
632
+ );
633
633
  });
634
634
  };
635
635
  }
@@ -652,10 +652,10 @@ export function filter<A>(predicate: Predicate<A>) {
652
652
  */
653
653
  export function filterMapWithIndex<A, B>(f: (i: number, a: A) => Maybe<B>) {
654
654
  return <R, E>(fa: Observable<R, E, A>): Observable<R, E, B> => {
655
- return fa.operate((source, subscriber, environment) => {
655
+ return new Observable((subscriber, environment) => {
656
656
  let index = 0;
657
- source.provideEnvironment(environment).subscribe(
658
- operatorSubscriber(subscriber, {
657
+ return fa.provideEnvironment(environment).subscribe(
658
+ subscriber.operate({
659
659
  next: (value) =>
660
660
  f(index++, value).match(
661
661
  () => noop,
@@ -712,20 +712,20 @@ export function partition<A>(predicate: Predicate<A>) {
712
712
  export function partitionMapWithIndex<A, B, C>(f: (i: number, a: A) => Either<B, C>) {
713
713
  return <R, E>(fa: Observable<R, E, A>): readonly [Observable<R, E, B>, Observable<R, E, C>] => {
714
714
  return [
715
- fa.operate((source, subscriber, environment) => {
715
+ new Observable((subscriber, environment) => {
716
716
  let index = 0;
717
- source.provideEnvironment(environment).subscribe(
718
- operatorSubscriber(subscriber, {
717
+ return fa.provideEnvironment(environment).subscribe(
718
+ subscriber.operate({
719
719
  next: (value) => {
720
720
  f(index++, value).match((b) => subscriber.next(b), noop);
721
721
  },
722
722
  }),
723
723
  );
724
724
  }),
725
- fa.operate((source, subscriber, environment) => {
725
+ new Observable((subscriber, environment) => {
726
726
  let index = 0;
727
- source.provideEnvironment(environment).subscribe(
728
- operatorSubscriber(subscriber, {
727
+ return fa.provideEnvironment(environment).subscribe(
728
+ subscriber.operate({
729
729
  next: (value) => {
730
730
  f(index++, value).match(noop, (c) => subscriber.next(c));
731
731
  },
@@ -762,7 +762,9 @@ export function mergeMapWithIndex<A, R1, E1, B>(
762
762
  concurrent = Infinity,
763
763
  ) {
764
764
  return <R, E>(ma: Observable<R, E, A>): Observable<R | R1, E | E1, B> => {
765
- return ma.operate((source, sub, environment) => mergeInternal(source, sub, environment, f, concurrent));
765
+ return new Observable((subscriber, environment) => {
766
+ return mergeInternal(ma, subscriber, environment, f, concurrent);
767
+ });
766
768
  };
767
769
  }
768
770
 
@@ -814,7 +816,9 @@ export function flatten<R, E, R1, E1, A>(mma: Observable<R, E, Observable<R1, E1
814
816
  */
815
817
  export function foldLeftWithIndex<A, B>(initial: B, f: (index: number, acc: B, value: A) => B) {
816
818
  return <R, E>(fa: Observable<R, E, A>): Observable<R, E, B> => {
817
- return fa.operate(scanInternal(f, initial, true, false, true));
819
+ return new Observable((subscriber, environment) => {
820
+ return scanInternal(fa, subscriber, environment, f, initial, true, false, true);
821
+ });
818
822
  };
819
823
  }
820
824
 
@@ -845,7 +849,7 @@ export function at(index: number) {
845
849
  */
846
850
  export function audit<A, R1, E1>(durationSelector: (value: A) => ObservableInput<R1, E1, any>) {
847
851
  return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, A> => {
848
- return fa.operate((source, subscriber, environment) => {
852
+ return new Observable((subscriber, environment) => {
849
853
  let lastValue: Maybe<A> = Nothing();
850
854
  let durationSubscriber: Subscriber<any, any> | null = null;
851
855
  let isComplete = false;
@@ -863,7 +867,7 @@ export function audit<A, R1, E1>(durationSelector: (value: A) => ObservableInput
863
867
  durationSubscriber = null;
864
868
  isComplete && subscriber.complete();
865
869
  };
866
- source.provideEnvironment(environment).subscribe(
870
+ return fa.provideEnvironment(environment).subscribe(
867
871
  operatorSubscriber(subscriber, {
868
872
  next: (value) => {
869
873
  lastValue = Just(value);
@@ -880,7 +884,7 @@ export function audit<A, R1, E1>(durationSelector: (value: A) => ObservableInput
880
884
  },
881
885
  complete: () => {
882
886
  isComplete = true;
883
- (lastValue.isNothing() || !durationSubscriber || durationSubscriber.closed) && subscriber.complete();
887
+ (lastValue.isNothing() || !durationSubscriber || durationSubscriber._closed) && subscriber.complete();
884
888
  },
885
889
  }),
886
890
  );
@@ -902,10 +906,10 @@ export function auditTime(duration: number, scheduler: SchedulerLike = asyncSche
902
906
  */
903
907
  export function buffer<R1, E1>(closingNotifier: Observable<R1, E1, any>) {
904
908
  return <R, E, A>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, ReadonlyArray<A>> => {
905
- return fa.operate((source, subscriber, environment) => {
909
+ return new Observable((subscriber, environment) => {
906
910
  let buffer: A[] = [];
907
- source.provideEnvironment(environment).subscribe(
908
- operatorSubscriber(subscriber, {
911
+ fa.provideEnvironment(environment).subscribe(
912
+ subscriber.operate({
909
913
  next: (value) => buffer.push(value),
910
914
  complete: () => {
911
915
  subscriber.next(buffer);
@@ -914,7 +918,7 @@ export function buffer<R1, E1>(closingNotifier: Observable<R1, E1, any>) {
914
918
  }),
915
919
  );
916
920
  closingNotifier.provideEnvironment(environment).subscribe(
917
- operatorSubscriber(subscriber, {
921
+ subscriber.operate({
918
922
  next: () => {
919
923
  const b = buffer;
920
924
  buffer = [];
@@ -936,43 +940,40 @@ export function buffer<R1, E1>(closingNotifier: Observable<R1, E1, any>) {
936
940
  export function bufferCount(bufferSize: number, startBufferEvery?: number) {
937
941
  return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, ReadonlyArray<A>> => {
938
942
  startBufferEvery = startBufferEvery ?? bufferSize;
939
- return fa.operate((source, subscriber, environment) => {
943
+ return new Observable((subscriber, environment) => {
940
944
  let buffers: A[][] = [];
941
945
  let count = 0;
942
- source.provideEnvironment(environment).subscribe(
943
- operatorSubscriber(
944
- subscriber,
945
- {
946
- next: (value) => {
947
- let toEmit: A[][] | null = null;
948
- if (count++ % startBufferEvery! === 0) {
949
- buffers.push([]);
950
- }
951
- for (const buffer of buffers) {
952
- buffer.push(value);
953
- if (bufferSize <= buffer.length) {
954
- toEmit = toEmit ?? [];
955
- toEmit.push(buffer);
956
- }
957
- }
958
- if (toEmit) {
959
- for (const buffer of toEmit) {
960
- arrayRemove(buffers, buffer);
961
- subscriber.next(buffer);
962
- }
946
+ return fa.provideEnvironment(environment).subscribe(
947
+ subscriber.operate({
948
+ next: (value) => {
949
+ let toEmit: A[][] | null = null;
950
+ if (count++ % startBufferEvery! === 0) {
951
+ buffers.push([]);
952
+ }
953
+ for (const buffer of buffers) {
954
+ buffer.push(value);
955
+ if (bufferSize <= buffer.length) {
956
+ toEmit = toEmit ?? [];
957
+ toEmit.push(buffer);
963
958
  }
964
- },
965
- complete: () => {
966
- for (const buffer of buffers) {
959
+ }
960
+ if (toEmit) {
961
+ for (const buffer of toEmit) {
962
+ arrayRemove(buffers, buffer);
967
963
  subscriber.next(buffer);
968
964
  }
969
- subscriber.complete();
970
- },
965
+ }
971
966
  },
972
- () => {
967
+ complete: () => {
968
+ for (const buffer of buffers) {
969
+ subscriber.next(buffer);
970
+ }
971
+ subscriber.complete();
972
+ },
973
+ finalize: () => {
973
974
  buffers = null!;
974
975
  },
975
- ),
976
+ }),
976
977
  );
977
978
  });
978
979
  };
@@ -996,7 +997,7 @@ export function bufferTime(config: BufferTimeConfig) {
996
997
  maxBufferSize = Infinity,
997
998
  scheduler = asyncScheduler,
998
999
  } = config;
999
- return fa.operate((source, subscriber, environment) => {
1000
+ return new Observable((subscriber, environment) => {
1000
1001
  let bufferRecords:
1001
1002
  | {
1002
1003
  buffer: A[];
@@ -1024,38 +1025,40 @@ export function bufferTime(config: BufferTimeConfig) {
1024
1025
  subs.add(scheduler.schedule(() => emit(record), bufferTimeSpan));
1025
1026
  }
1026
1027
  };
1028
+
1027
1029
  bufferCreationInterval !== null && bufferCreationInterval >= 0
1028
1030
  ? subscriber.add(
1029
1031
  scheduler.schedule(function () {
1030
1032
  startBuffer();
1031
- !this.closed && subscriber.add(this.schedule(null, bufferCreationInterval));
1033
+ !this._closed && subscriber.add(this.schedule(null, bufferCreationInterval));
1032
1034
  }, bufferCreationInterval),
1033
1035
  )
1034
1036
  : (restartOnEmit = true);
1037
+
1035
1038
  startBuffer();
1036
- const bufferTimeSubscriber = operatorSubscriber(
1037
- subscriber,
1038
- {
1039
- next: (value: A) => {
1040
- const recordsCopy = bufferRecords!.slice();
1041
- for (const record of recordsCopy) {
1042
- const { buffer } = record;
1043
- buffer.push(value);
1044
- maxBufferSize <= buffer.length && emit(record);
1045
- }
1046
- },
1047
- complete: () => {
1048
- while (bufferRecords?.length) {
1049
- subscriber.next(bufferRecords.shift()!.buffer);
1050
- }
1051
- bufferTimeSubscriber?.unsubscribe();
1052
- subscriber.complete();
1053
- subscriber.unsubscribe();
1054
- },
1039
+
1040
+ const bufferTimeSubscriber = subscriber.operate({
1041
+ next: (value: A) => {
1042
+ const recordsCopy = bufferRecords!.slice();
1043
+ for (const record of recordsCopy) {
1044
+ const { buffer } = record;
1045
+ buffer.push(value);
1046
+ maxBufferSize <= buffer.length && emit(record);
1047
+ }
1055
1048
  },
1056
- () => (bufferRecords = null),
1057
- );
1058
- source.provideEnvironment(environment).subscribe(bufferTimeSubscriber);
1049
+ complete: () => {
1050
+ while (bufferRecords?.length) {
1051
+ subscriber.next(bufferRecords.shift()!.buffer);
1052
+ }
1053
+ bufferTimeSubscriber?.unsubscribe();
1054
+ subscriber.complete();
1055
+ subscriber.unsubscribe();
1056
+ },
1057
+ finalize: () => {
1058
+ bufferRecords = null;
1059
+ },
1060
+ });
1061
+ return fa.provideEnvironment(environment).subscribe(bufferTimeSubscriber);
1059
1062
  });
1060
1063
  };
1061
1064
  }
@@ -1068,7 +1071,7 @@ export function bufferToggle<R1, E1, B, R2, E2>(
1068
1071
  closingSelector: (value: B) => ObservableInput<R2, E2, any>,
1069
1072
  ) {
1070
1073
  return <R, E, A>(fa: Observable<R, E, A>): Observable<R | R1 | R2, E | E1 | E2, ReadonlyArray<A>> => {
1071
- return fa.operate((source, subscriber, environment) => {
1074
+ return new Observable((subscriber, environment) => {
1072
1075
  const buffers: A[][] = [];
1073
1076
  from(openings)
1074
1077
  .provideEnvironment(environment)
@@ -1092,8 +1095,8 @@ export function bufferToggle<R1, E1, B, R2, E2>(
1092
1095
  complete: noop,
1093
1096
  }),
1094
1097
  );
1095
- source.provideEnvironment(environment).subscribe(
1096
- operatorSubscriber(subscriber, {
1098
+ return fa.provideEnvironment(environment).subscribe(
1099
+ subscriber.operate({
1097
1100
  next: (value) => {
1098
1101
  for (const buffer of buffers) {
1099
1102
  buffer.push(value);
@@ -1116,7 +1119,7 @@ export function bufferToggle<R1, E1, B, R2, E2>(
1116
1119
  */
1117
1120
  export function bufferWhen<R1, E1>(closingSelector: () => ObservableInput<R1, E1, any>) {
1118
1121
  return <R, E, A>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, ReadonlyArray<A>> => {
1119
- return fa.operate((source, subscriber, environment) => {
1122
+ return new Observable((subscriber, environment) => {
1120
1123
  let buffer: A[] | null = null;
1121
1124
  let closingSubscriber: Subscriber<E | E1, A> | null = null;
1122
1125
  const openBuffer = () => {
@@ -1129,18 +1132,15 @@ export function bufferWhen<R1, E1>(closingSelector: () => ObservableInput<R1, E1
1129
1132
  .subscribe((closingSubscriber = operatorSubscriber(subscriber, { next: openBuffer, complete: noop })));
1130
1133
  };
1131
1134
  openBuffer();
1132
- source.provideEnvironment(environment).subscribe(
1133
- operatorSubscriber(
1134
- subscriber,
1135
- {
1136
- next: (value) => buffer?.push(value),
1137
- complete: () => {
1138
- buffer && subscriber.next(buffer);
1139
- subscriber.complete();
1140
- },
1135
+ return fa.provideEnvironment(environment).subscribe(
1136
+ subscriber.operate({
1137
+ next: (value) => buffer?.push(value),
1138
+ complete: () => {
1139
+ buffer && subscriber.next(buffer);
1140
+ subscriber.complete();
1141
1141
  },
1142
- () => (buffer = closingSubscriber = null),
1143
- ),
1142
+ finalize: () => (buffer = closingSubscriber = null),
1143
+ }),
1144
1144
  );
1145
1145
  });
1146
1146
  };
@@ -1153,14 +1153,14 @@ export function catchAllCause<R, E, A, R1, E1, B>(
1153
1153
  f: (cause: Cause<E>, caught: Observable<R | R1, E | E1, A | B>) => ObservableInput<R | R1, E1, B>,
1154
1154
  ) {
1155
1155
  return (self: Observable<R, E, A>): Observable<R | R1, E1, A | B> => {
1156
- return self.operate((source, subscriber, environment) => {
1156
+ return new Observable((subscriber, environment) => {
1157
1157
  let innerSub: Subscription | null = null;
1158
1158
  let syncUnsub = false;
1159
1159
  let handledResult: Observable<R | R1, E1, B>;
1160
- innerSub = source.provideEnvironment(environment).subscribe(
1161
- operatorSubscriber(subscriber, {
1160
+ innerSub = self.provideEnvironment(environment).subscribe(
1161
+ subscriber.operate({
1162
1162
  error: (cause) => {
1163
- handledResult = from(f(cause, source.catchAllCause(f)));
1163
+ handledResult = from(f(cause, self.catchAllCause(f)));
1164
1164
  if (innerSub) {
1165
1165
  innerSub.unsubscribe();
1166
1166
  innerSub = null;
@@ -1192,7 +1192,7 @@ export function concatAll<R, E, R1, E1, A>(
1192
1192
  /**
1193
1193
  * @tsplus pipeable fncts.observable.Observable concat
1194
1194
  */
1195
- export function concat<O extends ReadonlyArray<ObservableInput<any, any>>>(...sources: O) {
1195
+ export function concat<O extends ReadonlyArray<ObservableInput<any, any, any>>>(...sources: O) {
1196
1196
  return <R, E, A>(
1197
1197
  fa: Observable<R, E, A>,
1198
1198
  ): Observable<
@@ -1200,8 +1200,8 @@ export function concat<O extends ReadonlyArray<ObservableInput<any, any>>>(...so
1200
1200
  E | Observable.ErrorOf<O[number]>,
1201
1201
  A | Observable.TypeOf<O[number]>
1202
1202
  > => {
1203
- return fa.operate((source, subscriber, environment) => {
1204
- fromArrayLike([source, ...sources])
1203
+ return new Observable((subscriber, environment) => {
1204
+ return fromArrayLike([fa, ...sources])
1205
1205
  .concatAll.provideEnvironment(environment)
1206
1206
  .subscribe(subscriber as Subscriber<any, any>);
1207
1207
  });
@@ -1261,10 +1261,11 @@ export function zipLatest<O extends ReadonlyArray<ObservableInput<any, any, any>
1261
1261
  ]
1262
1262
  > => {
1263
1263
  if (!sources.length) {
1264
- return from(self).unsafeCoerce();
1264
+ return unsafeCoerce(from(self));
1265
1265
  }
1266
- return from(self).operate((source, subscriber, environment) => {
1267
- combineLatestInternal(subscriber, environment, [source, ...sources]);
1266
+
1267
+ return new Observable((subscriber, environment) => {
1268
+ return combineLatestInternal(subscriber, environment, [self, ...sources]);
1268
1269
  });
1269
1270
  };
1270
1271
  }
@@ -1283,7 +1284,7 @@ export function zipWithLatest<A, R1, E1, B, C>(that: ObservableInput<R1, E1, B>,
1283
1284
  */
1284
1285
  export function debounceWith<A, R1, E1>(durationSelector: (value: A) => ObservableInput<R1, E1, any>) {
1285
1286
  return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, A> => {
1286
- return fa.operate((source, subscriber, environment) => {
1287
+ return new Observable((subscriber, environment) => {
1287
1288
  let lastValue: Maybe<A> = Nothing();
1288
1289
  let durationSubscriber: Subscriber<E1, any> | null = null;
1289
1290
  const emit = () => {
@@ -1295,25 +1296,22 @@ export function debounceWith<A, R1, E1>(durationSelector: (value: A) => Observab
1295
1296
  subscriber.next(value);
1296
1297
  }
1297
1298
  };
1298
- source.provideEnvironment(environment).subscribe(
1299
- operatorSubscriber(
1300
- subscriber,
1301
- {
1302
- next: (value) => {
1303
- durationSubscriber?.unsubscribe();
1304
- lastValue = Just(value);
1305
- durationSubscriber = operatorSubscriber(subscriber, { next: emit, complete: noop });
1306
- from(durationSelector(value)).provideEnvironment(environment).subscribe(durationSubscriber);
1307
- },
1308
- complete: () => {
1309
- emit();
1310
- subscriber.complete();
1311
- },
1299
+ return fa.provideEnvironment(environment).subscribe(
1300
+ subscriber.operate({
1301
+ next: (value) => {
1302
+ durationSubscriber?.unsubscribe();
1303
+ lastValue = Just(value);
1304
+ durationSubscriber = subscriber.operate({ next: emit, complete: noop });
1305
+ from(durationSelector(value)).provideEnvironment(environment).subscribe(durationSubscriber);
1312
1306
  },
1313
- () => {
1307
+ complete: () => {
1308
+ emit();
1309
+ subscriber.complete();
1310
+ },
1311
+ finalize: () => {
1314
1312
  lastValue = durationSubscriber = null!;
1315
1313
  },
1316
- ),
1314
+ }),
1317
1315
  );
1318
1316
  });
1319
1317
  };
@@ -1324,7 +1322,7 @@ export function debounceWith<A, R1, E1>(durationSelector: (value: A) => Observab
1324
1322
  */
1325
1323
  export function debounce(dueTime: number, scheduler: SchedulerLike = asyncScheduler) {
1326
1324
  return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A> => {
1327
- return fa.operate((source, subscriber, environment) => {
1325
+ return new Observable((subscriber, environment) => {
1328
1326
  let activeTask: Subscription | null = null;
1329
1327
  let lastValue: A | null = null;
1330
1328
  let lastTime: number | null = null;
@@ -1347,27 +1345,24 @@ export function debounce(dueTime: number, scheduler: SchedulerLike = asyncSchedu
1347
1345
  }
1348
1346
  emit();
1349
1347
  }
1350
- source.provideEnvironment(environment).subscribe(
1351
- operatorSubscriber(
1352
- subscriber,
1353
- {
1354
- next: (value) => {
1355
- lastValue = value;
1356
- lastTime = scheduler.now();
1357
- if (!activeTask) {
1358
- activeTask = scheduler.schedule(emitWhenIdle, dueTime);
1359
- subscriber.add(activeTask);
1360
- }
1361
- },
1362
- complete: () => {
1363
- emit();
1364
- subscriber.complete();
1365
- },
1348
+ return fa.provideEnvironment(environment).subscribe(
1349
+ subscriber.operate({
1350
+ next: (value) => {
1351
+ lastValue = value;
1352
+ lastTime = scheduler.now();
1353
+ if (!activeTask) {
1354
+ activeTask = scheduler.schedule(emitWhenIdle, dueTime);
1355
+ subscriber.add(activeTask);
1356
+ }
1366
1357
  },
1367
- () => {
1358
+ complete: () => {
1359
+ emit();
1360
+ subscriber.complete();
1361
+ },
1362
+ finalize: () => {
1368
1363
  lastValue = activeTask = null;
1369
1364
  },
1370
- ),
1365
+ }),
1371
1366
  );
1372
1367
  });
1373
1368
  };
@@ -1377,9 +1372,9 @@ export function debounce(dueTime: number, scheduler: SchedulerLike = asyncSchedu
1377
1372
  * @tsplus getter fncts.observable.Observable either
1378
1373
  */
1379
1374
  export function either<R, E, A>(fa: Observable<R, E, A>): Observable<R, never, Either<E, A>> {
1380
- return fa.operate((source, subscriber, environment) => {
1381
- source.provideEnvironment(environment).subscribe(
1382
- operatorSubscriber(subscriber, {
1375
+ return new Observable((subscriber, environment) => {
1376
+ return fa.provideEnvironment(environment).subscribe(
1377
+ subscriber.operate({
1383
1378
  next: (value) => {
1384
1379
  subscriber.next(Either.right(value));
1385
1380
  },
@@ -1426,10 +1421,10 @@ export function delay(due: number | Date, scheduler: SchedulerLike = asyncSchedu
1426
1421
  * @tsplus getter fncts.observable.Observable dematerialize
1427
1422
  */
1428
1423
  export function dematerialize<R, E, E1, A>(fa: Observable<R, E, Notification<E1, A>>): Observable<R, E | E1, A> {
1429
- return fa.operate((source, subscriber, environment) => {
1430
- source
1424
+ return new Observable((subscriber, environment) => {
1425
+ return fa
1431
1426
  .provideEnvironment(environment)
1432
- .subscribe(operatorSubscriber(subscriber, { next: (notification) => notification.observe(subscriber) }));
1427
+ .subscribe(subscriber.operate({ next: (notification) => notification.observe(subscriber) }));
1433
1428
  });
1434
1429
  }
1435
1430
 
@@ -1438,9 +1433,9 @@ export function dematerialize<R, E, E1, A>(fa: Observable<R, E, Notification<E1,
1438
1433
  */
1439
1434
  export function ensuring(finalizer: () => void) {
1440
1435
  return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A> => {
1441
- return fa.operate((source, subscriber, environment) => {
1442
- source.provideEnvironment(environment).subscribe(subscriber);
1436
+ return new Observable((subscriber, environment) => {
1443
1437
  subscriber.add(finalizer);
1438
+ return fa.provideEnvironment(environment).subscribe(subscriber);
1444
1439
  });
1445
1440
  };
1446
1441
  }
@@ -1451,17 +1446,17 @@ export function ensuring(finalizer: () => void) {
1451
1446
  export function exhaustAll<R, E, R1, E1, A>(
1452
1447
  ffa: Observable<R, E, ObservableInput<R1, E1, A>>,
1453
1448
  ): Observable<R | R1, E | E1, A> {
1454
- return ffa.operate((source, subscriber, environment) => {
1449
+ return new Observable((subscriber, environment) => {
1455
1450
  let isComplete = false;
1456
1451
  let innerSub: Subscription | null = null;
1457
- source.provideEnvironment(environment).subscribe(
1452
+ return ffa.provideEnvironment(environment).subscribe(
1458
1453
  operatorSubscriber(subscriber, {
1459
1454
  next: (inner) => {
1460
1455
  if (!innerSub) {
1461
1456
  innerSub = from(inner)
1462
1457
  .provideEnvironment(environment)
1463
1458
  .subscribe(
1464
- operatorSubscriber(subscriber, {
1459
+ subscriber.operate({
1465
1460
  complete: () => {
1466
1461
  innerSub = null;
1467
1462
  isComplete && subscriber.complete();
@@ -1484,15 +1479,15 @@ export function exhaustAll<R, E, R1, E1, A>(
1484
1479
  */
1485
1480
  export function exhaustMapWithIndex<A, R1, E1, B>(f: (i: number, a: A) => ObservableInput<R1, E1, B>) {
1486
1481
  return <R, E>(self: Observable<R, E, A>): Observable<R | R1, E | E1, B> => {
1487
- return self.operate((source, subscriber, environment) => {
1482
+ return new Observable((subscriber, environment) => {
1488
1483
  let index = 0;
1489
1484
  let innerSub: Subscriber<E1, B> | null = null;
1490
1485
  let isComplete = false;
1491
- source.provideEnvironment(environment).subscribe(
1492
- operatorSubscriber(subscriber, {
1486
+ self.provideEnvironment(environment).subscribe(
1487
+ subscriber.operate({
1493
1488
  next: (outerValue) => {
1494
1489
  if (!innerSub) {
1495
- innerSub = operatorSubscriber(subscriber, {
1490
+ innerSub = subscriber.operate({
1496
1491
  complete: () => {
1497
1492
  innerSub = null;
1498
1493
  isComplete && subscriber.complete();
@@ -1529,9 +1524,9 @@ export function expandWithIndex<A, R1, E1, B>(
1529
1524
  ) {
1530
1525
  return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, B> => {
1531
1526
  concurrent = (concurrent || 0) < 1 ? Infinity : concurrent;
1532
- return fa.operate((source, subscriber, environment) =>
1533
- mergeInternal(source, subscriber, environment, f, concurrent, undefined, true),
1534
- );
1527
+ return new Observable((subscriber, environment) => {
1528
+ return mergeInternal(fa, subscriber, environment, f, concurrent, undefined, true);
1529
+ });
1535
1530
  };
1536
1531
  }
1537
1532
 
@@ -1555,7 +1550,7 @@ export function findWithIndex<A>(
1555
1550
  ): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, Maybe<A>>;
1556
1551
  export function findWithIndex<A>(predicate: PredicateWithIndex<number, A>) {
1557
1552
  return <R, E>(fa: Observable<R, E, A>): Observable<R, E, Maybe<A>> => {
1558
- return fa.operate(findInternal(predicate, "value"));
1553
+ return new Observable(findInternal(fa, predicate, "value"));
1559
1554
  };
1560
1555
  }
1561
1556
 
@@ -1583,7 +1578,7 @@ export function findIndexWithIndex<A>(
1583
1578
  ): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, number>;
1584
1579
  export function findIndexWithIndex<A>(predicate: PredicateWithIndex<number, A>) {
1585
1580
  return <R, E>(fa: Observable<R, E, A>): Observable<R, E, number> => {
1586
- return fa.operate(findInternal(predicate, "index"));
1581
+ return new Observable(findInternal(fa, predicate, "index"));
1587
1582
  };
1588
1583
  }
1589
1584
 
@@ -1623,7 +1618,7 @@ export function forkJoin<A extends ReadonlyArray<ObservableInput<any, any>>>(
1623
1618
  >;
1624
1619
  export function forkJoin(...args: any[]): Observable<any, any, any> {
1625
1620
  const { args: sources, keys } = arrayOrObject(args);
1626
- return new Observable((s) => {
1621
+ return new Observable((s, environment) => {
1627
1622
  const length = sources.length;
1628
1623
  if (!length) {
1629
1624
  s.complete();
@@ -1634,33 +1629,35 @@ export function forkJoin(...args: any[]): Observable<any, any, any> {
1634
1629
  let remainingEmissions = length;
1635
1630
  for (let sourceIndex = 0; sourceIndex < length; sourceIndex++) {
1636
1631
  let hasValue = false;
1637
- from(sources[sourceIndex]).subscribe(
1638
- operatorSubscriber(s, {
1639
- next: (value: any) => {
1640
- if (!hasValue) {
1641
- hasValue = true;
1642
- remainingEmissions--;
1643
- }
1644
- values[sourceIndex] = value;
1645
- },
1646
- complete: () => {
1647
- if (!--remainingCompletions || !hasValue) {
1648
- if (!remainingEmissions) {
1649
- s.next(
1650
- keys
1651
- ? keys.reduce((b, k, i) => {
1652
- // @ts-expect-error
1653
- b[k] = values[i];
1654
- return b;
1655
- }, {})
1656
- : values,
1657
- );
1632
+ from(sources[sourceIndex])
1633
+ .provideEnvironment(environment)
1634
+ .subscribe(
1635
+ s.operate({
1636
+ next: (value: any) => {
1637
+ if (!hasValue) {
1638
+ hasValue = true;
1639
+ remainingEmissions--;
1658
1640
  }
1659
- s.complete();
1660
- }
1661
- },
1662
- }),
1663
- );
1641
+ values[sourceIndex] = value;
1642
+ },
1643
+ complete: () => {
1644
+ if (!--remainingCompletions || !hasValue) {
1645
+ if (!remainingEmissions) {
1646
+ s.next(
1647
+ keys
1648
+ ? keys.reduce((b, k, i) => {
1649
+ // @ts-expect-error
1650
+ b[k] = values[i];
1651
+ return b;
1652
+ }, {})
1653
+ : values,
1654
+ );
1655
+ }
1656
+ s.complete();
1657
+ }
1658
+ },
1659
+ }),
1660
+ );
1664
1661
  }
1665
1662
  });
1666
1663
  }
@@ -1669,9 +1666,9 @@ export function forkJoin(...args: any[]): Observable<any, any, any> {
1669
1666
  * @tsplus getter fncts.observable.Observable ignore
1670
1667
  */
1671
1668
  export function ignore<R, E, A>(fa: Observable<R, E, A>): Observable<R, E, never> {
1672
- return fa.operate((source, subscriber, environment) => {
1673
- source.provideEnvironment(environment).subscribe(
1674
- operatorSubscriber(subscriber, {
1669
+ return new Observable((subscriber, environment) => {
1670
+ return fa.provideEnvironment(environment).subscribe(
1671
+ subscriber.operate({
1675
1672
  next: noop,
1676
1673
  }),
1677
1674
  );
@@ -1682,9 +1679,9 @@ export function ignore<R, E, A>(fa: Observable<R, E, A>): Observable<R, E, never
1682
1679
  * @tsplus getter fncts.observable.Observable isEmpty
1683
1680
  */
1684
1681
  export function isEmpty<R, E, A>(fa: Observable<R, E, A>): Observable<R, E, boolean> {
1685
- return fa.operate((source, subscriber, environment) => {
1686
- source.provideEnvironment(environment).subscribe(
1687
- operatorSubscriber(subscriber, {
1682
+ return new Observable((subscriber, environment) => {
1683
+ return fa.provideEnvironment(environment).subscribe(
1684
+ subscriber.operate({
1688
1685
  next: () => {
1689
1686
  subscriber.next(false);
1690
1687
  subscriber.complete();
@@ -1702,9 +1699,9 @@ export function isEmpty<R, E, A>(fa: Observable<R, E, A>): Observable<R, E, bool
1702
1699
  * @tsplus getter fncts.observable.Observable materialize
1703
1700
  */
1704
1701
  export function materialize<R, E, A>(fa: Observable<R, E, A>): Observable<R, never, Notification<E, A>> {
1705
- return fa.operate((source, subscriber, environment) => {
1706
- source.provideEnvironment(environment).subscribe(
1707
- operatorSubscriber(subscriber, {
1702
+ return new Observable((subscriber, environment) => {
1703
+ return fa.provideEnvironment(environment).subscribe(
1704
+ subscriber.operate({
1708
1705
  next: (value) => {
1709
1706
  subscriber.next(Notification.next(value));
1710
1707
  },
@@ -1737,10 +1734,10 @@ export function mergeScanWithIndex<A, R1, E1, B>(
1737
1734
  concurrent = Infinity,
1738
1735
  ) {
1739
1736
  return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, B> => {
1740
- return fa.operate((source, subscriber, environment) => {
1737
+ return new Observable((subscriber, environment) => {
1741
1738
  let state = initial;
1742
1739
  return mergeInternal(
1743
- source,
1740
+ fa,
1744
1741
  subscriber,
1745
1742
  environment,
1746
1743
  (index, value) => f(index, state, value),
@@ -1777,10 +1774,10 @@ export function onErrorResumeNext<R, E, A, O extends ReadonlyArray<ObservableInp
1777
1774
  E | Observable.ErrorOf<O[number]>,
1778
1775
  A | Observable.TypeOf<O[number]>
1779
1776
  > {
1780
- return fa.operate((source, subscriber, environment) => {
1781
- const remaining = [source, ...sources];
1777
+ return new Observable((subscriber, environment) => {
1778
+ const remaining = [fa, ...sources];
1782
1779
  const subscribeNext = () => {
1783
- if (!subscriber.closed) {
1780
+ if (!subscriber._closed) {
1784
1781
  if (remaining.length > 0) {
1785
1782
  let nextSource: Observable<
1786
1783
  R | Observable.EnvironmentOf<O[number]>,
@@ -1793,7 +1790,7 @@ export function onErrorResumeNext<R, E, A, O extends ReadonlyArray<ObservableInp
1793
1790
  subscribeNext();
1794
1791
  return;
1795
1792
  }
1796
- const innerSub = operatorSubscriber(subscriber, { error: noop, complete: noop });
1793
+ const innerSub = subscriber.operate({ error: noop, complete: noop });
1797
1794
  subscriber.add(nextSource.provideEnvironment(environment).subscribe(innerSub));
1798
1795
  innerSub.add(subscribeNext);
1799
1796
  } else {
@@ -1810,10 +1807,10 @@ export function onErrorResumeNext<R, E, A, O extends ReadonlyArray<ObservableInp
1810
1807
  */
1811
1808
  export function onEmpty<B>(f: Lazy<B>) {
1812
1809
  return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A | B> => {
1813
- return fa.operate((source, subscriber, environment) => {
1810
+ return new Observable((subscriber, environment) => {
1814
1811
  let hasValue = false;
1815
- source.provideEnvironment(environment).subscribe(
1816
- operatorSubscriber(subscriber, {
1812
+ return fa.provideEnvironment(environment).subscribe(
1813
+ subscriber.operate({
1817
1814
  next: (value) => {
1818
1815
  hasValue = true;
1819
1816
  subscriber.next(value);
@@ -1837,13 +1834,13 @@ export function repeat(count = Infinity) {
1837
1834
  return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A> => {
1838
1835
  return count <= 0
1839
1836
  ? empty()
1840
- : fa.operate((source, subscriber, environment) => {
1837
+ : new Observable((subscriber, environment) => {
1841
1838
  let repeats = 0;
1842
1839
  let innerSub: Subscription | null;
1843
1840
  const loop = () => {
1844
1841
  let syncUnsub = false;
1845
- innerSub = source.provideEnvironment(environment).subscribe(
1846
- operatorSubscriber(subscriber, {
1842
+ innerSub = fa.provideEnvironment(environment).subscribe(
1843
+ subscriber.operate({
1847
1844
  complete: () => {
1848
1845
  if (++repeats < count) {
1849
1846
  if (innerSub) {
@@ -1893,13 +1890,13 @@ export function retry(configOrCount: number | RetryConfig = Infinity) {
1893
1890
  const { count, resetOnSuccess = false } = config;
1894
1891
  return count <= 0
1895
1892
  ? fa
1896
- : fa.operate((source, subscriber, environment) => {
1893
+ : new Observable((subscriber, environment) => {
1897
1894
  let retries = 0;
1898
1895
  let innerSub: Subscription | null;
1899
1896
  const loop = () => {
1900
1897
  let syncUnsub = false;
1901
- innerSub = source.provideEnvironment(environment).subscribe(
1902
- operatorSubscriber(subscriber, {
1898
+ innerSub = fa.provideEnvironment(environment).subscribe(
1899
+ subscriber.operate({
1903
1900
  next: (value) => {
1904
1901
  if (resetOnSuccess) {
1905
1902
  retries = 0;
@@ -1937,11 +1934,11 @@ export function retry(configOrCount: number | RetryConfig = Infinity) {
1937
1934
  */
1938
1935
  export function sample<R1, E1>(notifier: Observable<R1, E1, any>) {
1939
1936
  return <R, E, A>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, A> => {
1940
- return fa.operate((source, subscriber, environment) => {
1937
+ return new Observable((subscriber, environment) => {
1941
1938
  let hasValue = false;
1942
1939
  let lastValue: A | null = null;
1943
- source.provideEnvironment(environment).subscribe(
1944
- operatorSubscriber(subscriber, {
1940
+ fa.provideEnvironment(environment).subscribe(
1941
+ subscriber.operate({
1945
1942
  next: (value) => {
1946
1943
  hasValue = true;
1947
1944
  lastValue = value;
@@ -1956,9 +1953,7 @@ export function sample<R1, E1>(notifier: Observable<R1, E1, any>) {
1956
1953
  subscriber.next(value);
1957
1954
  }
1958
1955
  };
1959
- notifier
1960
- .provideEnvironment(environment)
1961
- .subscribe(operatorSubscriber(subscriber, { next: emit, complete: noop }));
1956
+ notifier.provideEnvironment(environment).subscribe(subscriber.operate({ next: emit, complete: noop }));
1962
1957
  });
1963
1958
  };
1964
1959
  }
@@ -1977,7 +1972,9 @@ export function sampleTime(period: number, scheduler: SchedulerLike = asyncSched
1977
1972
  */
1978
1973
  export function scanLeftWithIndex<A, B>(initial: B, f: (index: number, acc: B, value: A) => B) {
1979
1974
  return <R, E>(fa: Observable<R, E, A>): Observable<R, E, B> => {
1980
- return fa.operate(scanInternal(f, initial, true, true));
1975
+ return new Observable((subscriber, environment) =>
1976
+ scanInternal(fa, subscriber, environment, f, initial, true, true),
1977
+ );
1981
1978
  };
1982
1979
  }
1983
1980
 
@@ -2030,11 +2027,11 @@ export function skipLast(skipCount: number) {
2030
2027
  return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A> => {
2031
2028
  return skipCount <= 0
2032
2029
  ? fa
2033
- : fa.operate((source, subscriber, environment) => {
2030
+ : new Observable((subscriber, environment) => {
2034
2031
  let ring: A[] = new Array(skipCount);
2035
2032
  let seen = 0;
2036
- source.provideEnvironment(environment).subscribe(
2037
- operatorSubscriber(subscriber, {
2033
+ fa.provideEnvironment(environment).subscribe(
2034
+ subscriber.operate({
2038
2035
  next: (value) => {
2039
2036
  const valueIndex = seen++;
2040
2037
  if (valueIndex < skipCount) {
@@ -2060,9 +2057,9 @@ export function skipLast(skipCount: number) {
2060
2057
  */
2061
2058
  export function skipUntil<R1, E1>(notifier: Observable<R1, E1, any>) {
2062
2059
  return <R, E, A>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, A> => {
2063
- return fa.operate((source, subscriber, environment) => {
2060
+ return new Observable((subscriber, environment) => {
2064
2061
  let taking = false;
2065
- const skipSubscriber = operatorSubscriber(subscriber, {
2062
+ const skipSubscriber = subscriber.operate({
2066
2063
  next: () => {
2067
2064
  skipSubscriber?.unsubscribe();
2068
2065
  taking = true;
@@ -2070,8 +2067,8 @@ export function skipUntil<R1, E1>(notifier: Observable<R1, E1, any>) {
2070
2067
  complete: noop,
2071
2068
  });
2072
2069
  from(notifier).provideEnvironment(environment).subscribe(skipSubscriber);
2073
- source.provideEnvironment(environment).subscribe(
2074
- operatorSubscriber(subscriber, {
2070
+ fa.provideEnvironment(environment).subscribe(
2071
+ subscriber.operate({
2075
2072
  next: (value) => taking && subscriber.next(value),
2076
2073
  }),
2077
2074
  );
@@ -2084,11 +2081,11 @@ export function skipUntil<R1, E1>(notifier: Observable<R1, E1, any>) {
2084
2081
  */
2085
2082
  export function skipWhile<A>(predicate: PredicateWithIndex<number, A>) {
2086
2083
  return <R, E>(fa: Observable<R, E, A>): Observable<R, E, A> => {
2087
- return fa.operate((source, subscriber, environment) => {
2084
+ return new Observable((subscriber, environment) => {
2088
2085
  let taking = false;
2089
2086
  let index = 0;
2090
- source.provideEnvironment(environment).subscribe(
2091
- operatorSubscriber(subscriber, {
2087
+ return fa.provideEnvironment(environment).subscribe(
2088
+ subscriber.operate({
2092
2089
  next: (value) => (taking || (taking = !predicate(index++, value))) && subscriber.next(value),
2093
2090
  }),
2094
2091
  );
@@ -2100,10 +2097,10 @@ export function skipWhile<A>(predicate: PredicateWithIndex<number, A>) {
2100
2097
  * @tsplus pipeable fncts.observable.Observable startWith
2101
2098
  */
2102
2099
  export function startWith<B extends ReadonlyArray<unknown>>(...values: B) {
2103
- return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A | B[number]> => {
2104
- return fa.operate((source, subscriber) => {
2100
+ return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A | Observable.TypeOf<B>> => {
2101
+ return new Observable((subscriber, environment) => {
2105
2102
  // @ts-expect-error
2106
- source.concat(values).subscribe(subscriber);
2103
+ return fa.concat(values).provideEnvironment(environment).subscribe(subscriber);
2107
2104
  });
2108
2105
  };
2109
2106
  }
@@ -2113,8 +2110,8 @@ export function startWith<B extends ReadonlyArray<unknown>>(...values: B) {
2113
2110
  */
2114
2111
  export function subscribeOn(scheduler: SchedulerLike, delay = 0) {
2115
2112
  return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A> => {
2116
- return fa.operate((source, subscriber, environment) => {
2117
- subscriber.add(scheduler.schedule(() => source.provideEnvironment(environment).subscribe(subscriber), delay));
2113
+ return new Observable((subscriber, environment) => {
2114
+ subscriber.add(scheduler.schedule(() => fa.provideEnvironment(environment).subscribe(subscriber), delay));
2118
2115
  });
2119
2116
  };
2120
2117
  }
@@ -2133,36 +2130,34 @@ export function switchAll<R, E, R1, E1, A>(
2133
2130
  */
2134
2131
  export function switchMapWithIndex<A, R1, E1, B>(f: (index: number, value: A) => ObservableInput<R1, E1, B>) {
2135
2132
  return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, B> => {
2136
- return fa.operate((source, subscriber, environment) => {
2133
+ return new Observable((destination, environment) => {
2137
2134
  let innerSubscriber: Subscriber<E | E1, B> | null = null;
2138
2135
  let index = 0;
2139
2136
  let isComplete = false;
2140
- const checkComplete = () => isComplete && !innerSubscriber && subscriber.complete();
2141
- source.provideEnvironment(environment).subscribe(
2142
- operatorSubscriber(
2143
- subscriber,
2144
- {
2145
- next: (value) => {
2146
- innerSubscriber?.unsubscribe();
2147
- const outerIndex = index++;
2148
- from(f(outerIndex, value))
2149
- .provideEnvironment(environment)
2150
- .subscribe(
2151
- (innerSubscriber = operatorSubscriber(subscriber, {
2152
- next: (innerValue) => subscriber.next(innerValue),
2153
- complete: () => {
2154
- innerSubscriber = null!;
2155
- checkComplete();
2156
- },
2157
- })),
2158
- );
2159
- },
2137
+ const checkComplete = () => isComplete && !innerSubscriber && destination.complete();
2138
+
2139
+ fa.provideEnvironment(environment).subscribe(
2140
+ destination.operate({
2141
+ next: (value) => {
2142
+ innerSubscriber?.unsubscribe();
2143
+ const outerIndex = index++;
2144
+ from(f(outerIndex, value))
2145
+ .provideEnvironment(environment)
2146
+ .subscribe(
2147
+ (innerSubscriber = destination.operate({
2148
+ next: (innerValue) => destination.next(innerValue),
2149
+ complete: () => {
2150
+ innerSubscriber = null!;
2151
+ checkComplete();
2152
+ },
2153
+ })),
2154
+ );
2160
2155
  },
2161
- () => {
2156
+ complete: () => {
2162
2157
  isComplete = true;
2163
2158
  checkComplete();
2164
2159
  },
2165
- ),
2160
+ }),
2166
2161
  );
2167
2162
  });
2168
2163
  };
@@ -2185,10 +2180,9 @@ export function switchScanWithIndex<A, R1, E1, B>(
2185
2180
  f: (index: number, acc: B, value: A) => ObservableInput<R1, E1, B>,
2186
2181
  ) {
2187
2182
  return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, B> => {
2188
- return fa.operate((source, subscriber, environment) => {
2183
+ return new Observable((subscriber, environment) => {
2189
2184
  let state = initial;
2190
- source
2191
- .switchMapWithIndex((index, value) => from(f(index, state, value)).map((b) => ((state = b), b)))
2185
+ fa.switchMapWithIndex((index, value) => from(f(index, state, value)).map((b) => ((state = b), b)))
2192
2186
  .provideEnvironment(environment)
2193
2187
  .subscribe(subscriber);
2194
2188
  return () => {
@@ -2214,10 +2208,10 @@ export function take(count: number) {
2214
2208
  return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A> => {
2215
2209
  return count <= 0
2216
2210
  ? empty()
2217
- : fa.operate((source, sub, environment) => {
2211
+ : new Observable((sub, environment) => {
2218
2212
  let seen = 0;
2219
- source.provideEnvironment(environment).subscribe(
2220
- new OperatorSubscriber(sub, {
2213
+ fa.provideEnvironment(environment).subscribe(
2214
+ sub.operate({
2221
2215
  next: (value) => {
2222
2216
  if (++seen <= count) {
2223
2217
  sub.next(value);
@@ -2239,27 +2233,24 @@ export function takeLast(count: number) {
2239
2233
  return <R, E, A>(fa: Observable<R, E, A>): Observable<R, E, A> => {
2240
2234
  return count <= 0
2241
2235
  ? empty()
2242
- : fa.operate((source, subscriber, environment) => {
2236
+ : new Observable((subscriber, environment) => {
2243
2237
  let buffer: A[] = [];
2244
- source.provideEnvironment(environment).subscribe(
2245
- operatorSubscriber(
2246
- subscriber,
2247
- {
2248
- next: (value) => {
2249
- buffer.push(value);
2250
- count < buffer.length && buffer.shift();
2251
- },
2252
- complete: () => {
2253
- for (const value of buffer) {
2254
- subscriber.next(value);
2255
- }
2256
- subscriber.complete();
2257
- },
2238
+ fa.provideEnvironment(environment).subscribe(
2239
+ subscriber.operate({
2240
+ next: (value) => {
2241
+ buffer.push(value);
2242
+ count < buffer.length && buffer.shift();
2258
2243
  },
2259
- () => {
2244
+ complete: () => {
2245
+ for (const value of buffer) {
2246
+ subscriber.next(value);
2247
+ }
2248
+ subscriber.complete();
2249
+ },
2250
+ finalize: () => {
2260
2251
  buffer = null!;
2261
2252
  },
2262
- ),
2253
+ }),
2263
2254
  );
2264
2255
  });
2265
2256
  };
@@ -2270,11 +2261,11 @@ export function takeLast(count: number) {
2270
2261
  */
2271
2262
  export function takeUntil<R1, E1>(notifier: ObservableInput<R1, E1, any>) {
2272
2263
  return <R, E, A>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, A> => {
2273
- return fa.operate((source, subscriber, environment) => {
2264
+ return new Observable((subscriber, environment) => {
2274
2265
  from(notifier)
2275
2266
  .provideEnvironment(environment)
2276
- .subscribe(operatorSubscriber(subscriber, { next: () => subscriber.complete(), complete: noop }));
2277
- !subscriber.closed && source.provideEnvironment(environment).subscribe(subscriber);
2267
+ .subscribe(subscriber.operate({ next: () => subscriber.complete(), complete: noop }));
2268
+ !subscriber._closed && fa.provideEnvironment(environment).subscribe(subscriber);
2278
2269
  });
2279
2270
  };
2280
2271
  }
@@ -2292,10 +2283,10 @@ export function takeWhileWithIndex<A>(
2292
2283
  ): <R, E>(fa: Observable<R, E, A>) => Observable<R, E, A>;
2293
2284
  export function takeWhileWithIndex<A>(predicate: PredicateWithIndex<number, A>, inclusive?: boolean) {
2294
2285
  return <R, E>(fa: Observable<R, E, A>): Observable<R, E, A> => {
2295
- return fa.operate((source, subscriber, environment) => {
2286
+ return new Observable((subscriber, environment) => {
2296
2287
  let index = 0;
2297
- source.provideEnvironment(environment).subscribe(
2298
- operatorSubscriber(subscriber, {
2288
+ fa.provideEnvironment(environment).subscribe(
2289
+ subscriber.operate({
2299
2290
  next: (value) => {
2300
2291
  const result = predicate(index++, value);
2301
2292
  (result || inclusive) && subscriber.next(value);
@@ -2329,9 +2320,9 @@ export function takeWhile<A>(predicate: Predicate<A>, inclusive?: boolean) {
2329
2320
  */
2330
2321
  export function tap<E, A>(observer: Partial<Observer<E, A>>) {
2331
2322
  return <R>(fa: Observable<R, E, A>): Observable<R, E, A> => {
2332
- return fa.operate((source, subscriber, environment) => {
2333
- source.provideEnvironment(environment).subscribe(
2334
- operatorSubscriber(subscriber, {
2323
+ return new Observable((subscriber, environment) => {
2324
+ fa.provideEnvironment(environment).subscribe(
2325
+ subscriber.operate({
2335
2326
  next: (value) => {
2336
2327
  observer.next?.(value);
2337
2328
  subscriber.next(value);
@@ -2368,7 +2359,7 @@ export function throttle<A, R1, E1>(
2368
2359
  { leading, trailing }: ThrottleConfig = defaultThrottleConfig,
2369
2360
  ) {
2370
2361
  return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, A> => {
2371
- return fa.operate((source, subscriber, environment) => {
2362
+ return new Observable((subscriber, environment) => {
2372
2363
  let sendValue: Maybe<A> = Nothing();
2373
2364
  let throttled: Subscription | null = null;
2374
2365
  let isComplete = false;
@@ -2387,7 +2378,7 @@ export function throttle<A, R1, E1>(
2387
2378
  const startThrottling = (value: A) =>
2388
2379
  (throttled = from(durationSelector(value))
2389
2380
  .provideEnvironment(environment)
2390
- .subscribe(operatorSubscriber(subscriber, { next: endThrottling, complete: cleanupThrottling })));
2381
+ .subscribe(subscriber.operate({ next: endThrottling, complete: cleanupThrottling })));
2391
2382
  const send = () => {
2392
2383
  if (sendValue.isJust()) {
2393
2384
  const { value } = sendValue;
@@ -2396,15 +2387,15 @@ export function throttle<A, R1, E1>(
2396
2387
  !isComplete && startThrottling(value);
2397
2388
  }
2398
2389
  };
2399
- source.provideEnvironment(environment).subscribe(
2400
- operatorSubscriber(subscriber, {
2390
+ fa.provideEnvironment(environment).subscribe(
2391
+ subscriber.operate({
2401
2392
  next: (value) => {
2402
2393
  sendValue = Just(value);
2403
- !(throttled && !throttled.closed) && (leading ? send() : startThrottling(value));
2394
+ !(throttled && !throttled._closed) && (leading ? send() : startThrottling(value));
2404
2395
  },
2405
2396
  complete: () => {
2406
2397
  isComplete = true;
2407
- !(trailing && sendValue.isJust() && throttled && !throttled.closed) && subscriber.complete();
2398
+ !(trailing && sendValue.isJust() && throttled && !throttled._closed) && subscriber.complete();
2408
2399
  },
2409
2400
  }),
2410
2401
  );
@@ -2476,7 +2467,7 @@ export function timeout(config: any) {
2476
2467
  scheduler = asyncScheduler,
2477
2468
  meta = null!,
2478
2469
  } = config as TimeoutConfig<R, E1, A, B, M>;
2479
- return fa.operate((source, subscriber, environment) => {
2470
+ return new Observable((subscriber, environment) => {
2480
2471
  // eslint-disable-next-line prefer-const
2481
2472
  let originalSourceSubscription: Subscription;
2482
2473
  let timerSubscription: Subscription;
@@ -2501,25 +2492,22 @@ export function timeout(config: any) {
2501
2492
  delay,
2502
2493
  );
2503
2494
  };
2504
- originalSourceSubscription = source.provideEnvironment(environment).subscribe(
2505
- operatorSubscriber(
2506
- subscriber,
2507
- {
2508
- next: (value) => {
2509
- timerSubscription?.unsubscribe();
2510
- seen++;
2511
- lastValue = Just(value);
2512
- subscriber.next(value);
2513
- each! > 0 && startTimer(each!);
2514
- },
2495
+ originalSourceSubscription = fa.provideEnvironment(environment).subscribe(
2496
+ subscriber.operate({
2497
+ next: (value) => {
2498
+ timerSubscription?.unsubscribe();
2499
+ seen++;
2500
+ lastValue = Just(value);
2501
+ subscriber.next(value);
2502
+ each! > 0 && startTimer(each!);
2515
2503
  },
2516
- () => {
2517
- if (!timerSubscription?.closed) {
2504
+ finalize: () => {
2505
+ if (!timerSubscription?._closed) {
2518
2506
  timerSubscription?.unsubscribe();
2519
2507
  }
2520
2508
  lastValue = Nothing();
2521
2509
  },
2522
- ),
2510
+ }),
2523
2511
  );
2524
2512
  startTimer(first != null ? (typeof first === "number" ? first : +first - scheduler.now()) : each!);
2525
2513
  });
@@ -2538,9 +2526,8 @@ function toArrayAccumulator(arr: any[], value: any) {
2538
2526
  * @tsplus getter fncts.observable.Observable toArray
2539
2527
  */
2540
2528
  export function toArray<R, E, A>(fa: Observable<R, E, A>): Observable<R, E, ReadonlyArray<A>> {
2541
- return fa.operate((source, subscriber, environment) => {
2542
- source
2543
- .foldLeft([] as A[], toArrayAccumulator)
2529
+ return new Observable((subscriber, environment) => {
2530
+ fa.foldLeft([] as A[], toArrayAccumulator)
2544
2531
  .provideEnvironment(environment)
2545
2532
  .subscribe(subscriber);
2546
2533
  });
@@ -2551,10 +2538,10 @@ export function toArray<R, E, A>(fa: Observable<R, E, A>): Observable<R, E, Read
2551
2538
  */
2552
2539
  export function unique<A, K, R1, E1 = never>(toKey?: (value: A) => K, flushes?: Observable<R1, E1, any>) {
2553
2540
  return <R, E>(fa: Observable<R, E, A>): Observable<R | R1, E | E1, A> => {
2554
- return fa.operate((source, subscriber, environment) => {
2541
+ return new Observable((subscriber, environment) => {
2555
2542
  let distinctKeys = HashSet.empty<A | K>();
2556
- source.provideEnvironment(environment).subscribe(
2557
- operatorSubscriber(subscriber, {
2543
+ fa.provideEnvironment(environment).subscribe(
2544
+ subscriber.operate({
2558
2545
  next: (value) => {
2559
2546
  const key = toKey ? toKey(value) : value;
2560
2547
  if (!distinctKeys.has(key)) {
@@ -2566,7 +2553,7 @@ export function unique<A, K, R1, E1 = never>(toKey?: (value: A) => K, flushes?:
2566
2553
  );
2567
2554
  flushes
2568
2555
  ?.provideEnvironment(environment)
2569
- .subscribe(operatorSubscriber(subscriber, { next: () => (distinctKeys = HashSet.empty()), complete: noop }));
2556
+ .subscribe(subscriber.operate({ next: () => (distinctKeys = HashSet.empty()), complete: noop }));
2570
2557
  });
2571
2558
  };
2572
2559
  }
@@ -2592,11 +2579,11 @@ export function uniqueUntilChanged<A, K = A>(
2592
2579
  ) {
2593
2580
  return <R, E>(fa: Observable<R, E, A>): Observable<R, E, A> => {
2594
2581
  const compare = "equals" in E ? E.equals : E;
2595
- return fa.operate((source, subscriber, environment) => {
2582
+ return new Observable((subscriber, environment) => {
2596
2583
  let previousKey: K;
2597
2584
  let first = true;
2598
- source.provideEnvironment(environment).subscribe(
2599
- operatorSubscriber(subscriber, {
2585
+ fa.provideEnvironment(environment).subscribe(
2586
+ subscriber.operate({
2600
2587
  next: (value) => {
2601
2588
  const currentKey = keySelector(value);
2602
2589
  if (first || !compare(previousKey, currentKey)) {
@@ -2652,7 +2639,7 @@ function combineLatestInternal(
2652
2639
  const source = scheduler ? observables[i]!.pipe(scheduled(scheduler)) : from(observables[i]!);
2653
2640
  let hasFirstValue = false;
2654
2641
  source.provideEnvironment(environment).subscribe(
2655
- operatorSubscriber(subscriber, {
2642
+ subscriber.operate({
2656
2643
  next: (value) => {
2657
2644
  values[i] = value;
2658
2645
  if (!hasFirstValue) {
@@ -2675,15 +2662,16 @@ function combineLatestInternal(
2675
2662
  });
2676
2663
  }
2677
2664
 
2678
- function findInternal<A>(
2665
+ function findInternal<R, E, A>(
2666
+ source: Observable<R, E, A>,
2679
2667
  predicate: PredicateWithIndex<number, A>,
2680
2668
  emit: "value" | "index",
2681
- ): <R, E>(source: Observable<R, E, A>, subscriber: Subscriber<E, any>, environment: Environment<R>) => void {
2669
+ ): (subscriber: Subscriber<E, any>, environment: Environment<R>) => void {
2682
2670
  const findIndex = emit === "index";
2683
- return (source, subscriber, environment) => {
2671
+ return (subscriber, environment) => {
2684
2672
  let index = 0;
2685
2673
  source.provideEnvironment(environment).subscribe(
2686
- operatorSubscriber(subscriber, {
2674
+ subscriber.operate({
2687
2675
  next: (value) => {
2688
2676
  const i = index++;
2689
2677
  if (predicate(index++, value)) {
@@ -2792,44 +2780,51 @@ function mergeInternal<R, E, A, R1, E1, B>(
2792
2780
  }
2793
2781
 
2794
2782
  export function scanInternal<R, E, A, B>(
2783
+ source: Observable<R, E, A>,
2784
+ subscriber: Subscriber<any, any>,
2785
+ environment: Environment<R>,
2795
2786
  f: (index: number, acc: A, value: A) => B,
2796
2787
  initial: B,
2797
2788
  hasInitial: false,
2798
2789
  emitOnNext: boolean,
2799
2790
  emitBeforeComplete?: undefined | true,
2800
- ): (source: Observable<R, E, A>, subscriber: Subscriber<any, any>) => void;
2791
+ ): Subscription;
2801
2792
  export function scanInternal<R, E, A, B>(
2793
+ source: Observable<R, E, A>,
2794
+ subscriber: Subscriber<any, any>,
2795
+ environment: Environment<R>,
2802
2796
  f: (index: number, acc: B, value: A) => B,
2803
2797
  initial: B,
2804
2798
  hasInitial: true,
2805
2799
  emitOnNext: boolean,
2806
2800
  emitBeforeComplete?: undefined | true,
2807
- ): (source: Observable<R, E, A>, subscriber: Subscriber<any, any>) => void;
2801
+ ): Subscription;
2808
2802
  export function scanInternal<R, E, A, B>(
2803
+ source: Observable<R, E, A>,
2804
+ subscriber: Subscriber<any, any>,
2805
+ environment: Environment<R>,
2809
2806
  f: (index: number, acc: A | B, value: A) => B,
2810
2807
  initial: B,
2811
2808
  hasInitial: boolean,
2812
2809
  emitOnNext: boolean,
2813
2810
  emitBeforeComplete?: undefined | true,
2814
- ): (source: Observable<R, E, A>, subscriber: Subscriber<any, any>, environment: Environment<R>) => void {
2815
- return (source, subscriber, environment) => {
2816
- let hasState = hasInitial;
2817
- let state: any = initial;
2818
- let index = 0;
2819
- source.provideEnvironment(environment).subscribe(
2820
- operatorSubscriber(subscriber, {
2821
- next: (value) => {
2822
- const i = index++;
2823
- state = hasState ? f(i, state, value) : ((hasState = true), value);
2824
- emitOnNext && subscriber.next(state);
2825
- },
2826
- complete:
2827
- emitBeforeComplete &&
2828
- (() => {
2829
- hasState && subscriber.next(state);
2830
- subscriber.complete();
2831
- }),
2832
- }),
2833
- );
2834
- };
2811
+ ): Subscription {
2812
+ let hasState = hasInitial;
2813
+ let state: any = initial;
2814
+ let index = 0;
2815
+ return source.provideEnvironment(environment).subscribe(
2816
+ subscriber.operate({
2817
+ next: (value) => {
2818
+ const i = index++;
2819
+ state = hasState ? f(i, state, value) : ((hasState = true), value);
2820
+ emitOnNext && subscriber.next(state);
2821
+ },
2822
+ complete:
2823
+ emitBeforeComplete &&
2824
+ (() => {
2825
+ hasState && subscriber.next(state);
2826
+ subscriber.complete();
2827
+ }),
2828
+ }),
2829
+ );
2835
2830
  }