@fncts/observable 0.0.25 → 0.0.27

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