@fncts/observable 0.0.2 → 0.0.5

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 (92) hide show
  1. package/BehaviorSubject.d.ts +1 -1
  2. package/Notification.d.ts +1 -1
  3. package/Observable/api/connect.d.ts +1 -1
  4. package/Observable/api/connectable.d.ts +5 -5
  5. package/Observable/api/fromCallback.d.ts +2 -2
  6. package/Observable/api/fromEvent.d.ts +1 -1
  7. package/Observable/api/race.d.ts +2 -2
  8. package/Observable/api/raceWith.d.ts +1 -1
  9. package/Observable/api/repeatWhen.d.ts +2 -2
  10. package/Observable/api/retryWhen.d.ts +3 -3
  11. package/Observable/api/share.d.ts +5 -6
  12. package/Observable/api/window.d.ts +2 -2
  13. package/Observable/api/windowCount.d.ts +1 -1
  14. package/Observable/api/windowTime.d.ts +3 -3
  15. package/Observable/api/windowToggle.d.ts +2 -2
  16. package/Observable/api/windowWhen.d.ts +2 -2
  17. package/Observable/api.d.ts +204 -163
  18. package/Observable/definition.d.ts +24 -15
  19. package/Observable/dom/animationFrames.d.ts +1 -1
  20. package/Observer.d.ts +1 -1
  21. package/Operator.d.ts +4 -3
  22. package/Subject.d.ts +10 -9
  23. package/Subscriber.d.ts +1 -1
  24. package/_cjs/BehaviorSubject.cjs.map +1 -1
  25. package/_cjs/Observable/api/connect.cjs.map +1 -1
  26. package/_cjs/Observable/api/connectable.cjs.map +1 -1
  27. package/_cjs/Observable/api/fromCallback.cjs.map +1 -1
  28. package/_cjs/Observable/api/race.cjs.map +1 -1
  29. package/_cjs/Observable/api/raceWith.cjs.map +1 -1
  30. package/_cjs/Observable/api/repeatWhen.cjs.map +1 -1
  31. package/_cjs/Observable/api/retryWhen.cjs.map +1 -1
  32. package/_cjs/Observable/api/share.cjs +2 -11
  33. package/_cjs/Observable/api/share.cjs.map +1 -1
  34. package/_cjs/Observable/api/window.cjs.map +1 -1
  35. package/_cjs/Observable/api/windowTime.cjs.map +1 -1
  36. package/_cjs/Observable/api/windowToggle.cjs.map +1 -1
  37. package/_cjs/Observable/api/windowWhen.cjs.map +1 -1
  38. package/_cjs/Observable/api.cjs +325 -308
  39. package/_cjs/Observable/api.cjs.map +1 -1
  40. package/_cjs/Observable/definition.cjs +41 -15
  41. package/_cjs/Observable/definition.cjs.map +1 -1
  42. package/_cjs/Operator.cjs.map +1 -1
  43. package/_cjs/Subject.cjs +2 -2
  44. package/_cjs/Subject.cjs.map +1 -1
  45. package/_cjs/global.cjs +3 -1
  46. package/_cjs/global.cjs.map +1 -1
  47. package/_mjs/BehaviorSubject.mjs.map +1 -1
  48. package/_mjs/Observable/api/connect.mjs.map +1 -1
  49. package/_mjs/Observable/api/connectable.mjs.map +1 -1
  50. package/_mjs/Observable/api/fromCallback.mjs.map +1 -1
  51. package/_mjs/Observable/api/race.mjs.map +1 -1
  52. package/_mjs/Observable/api/raceWith.mjs.map +1 -1
  53. package/_mjs/Observable/api/repeatWhen.mjs.map +1 -1
  54. package/_mjs/Observable/api/retryWhen.mjs.map +1 -1
  55. package/_mjs/Observable/api/share.mjs +1 -6
  56. package/_mjs/Observable/api/share.mjs.map +1 -1
  57. package/_mjs/Observable/api/window.mjs.map +1 -1
  58. package/_mjs/Observable/api/windowTime.mjs.map +1 -1
  59. package/_mjs/Observable/api/windowToggle.mjs.map +1 -1
  60. package/_mjs/Observable/api/windowWhen.mjs.map +1 -1
  61. package/_mjs/Observable/api.mjs +301 -293
  62. package/_mjs/Observable/api.mjs.map +1 -1
  63. package/_mjs/Observable/definition.mjs +36 -14
  64. package/_mjs/Observable/definition.mjs.map +1 -1
  65. package/_mjs/Operator.mjs.map +1 -1
  66. package/_mjs/Subject.mjs +2 -2
  67. package/_mjs/Subject.mjs.map +1 -1
  68. package/_mjs/global.mjs +1 -1
  69. package/_mjs/global.mjs.map +1 -1
  70. package/_src/BehaviorSubject.ts +1 -1
  71. package/_src/Observable/api/connect.ts +5 -5
  72. package/_src/Observable/api/connectable.ts +7 -7
  73. package/_src/Observable/api/fromCallback.ts +8 -5
  74. package/_src/Observable/api/fromEvent.ts +1 -1
  75. package/_src/Observable/api/race.ts +2 -2
  76. package/_src/Observable/api/raceWith.ts +7 -3
  77. package/_src/Observable/api/repeatWhen.ts +8 -8
  78. package/_src/Observable/api/retryWhen.ts +8 -8
  79. package/_src/Observable/api/share.ts +10 -16
  80. package/_src/Observable/api/window.ts +5 -5
  81. package/_src/Observable/api/windowCount.ts +5 -5
  82. package/_src/Observable/api/windowTime.ts +18 -18
  83. package/_src/Observable/api/windowToggle.ts +8 -8
  84. package/_src/Observable/api/windowWhen.ts +6 -6
  85. package/_src/Observable/api.ts +524 -429
  86. package/_src/Observable/definition.ts +45 -21
  87. package/_src/Observable/dom/animationFrames.ts +2 -2
  88. package/_src/Operator.ts +6 -6
  89. package/_src/Subject.ts +9 -9
  90. package/_src/global.ts +5 -46
  91. package/global.d.ts +5 -45
  92. package/package.json +6 -2
@@ -1,40 +1,34 @@
1
1
  import { popNumber } from "@fncts/observable/internal/args";
2
2
  import { arrayOrObject, arrayRemove, readableStreamToAsyncGenerator } from "@fncts/observable/internal/util";
3
3
  import { Notification } from "@fncts/observable/Notification";
4
- import { EMPTY } from "@fncts/observable/Observable/definition";
4
+ import { EMPTY, EnvironmentWith, Observable } from "@fncts/observable/Observable/definition";
5
5
  import { caughtSchedule } from "@fncts/observable/Scheduler";
6
6
 
7
7
  export interface Subscribable<E, A> {
8
8
  subscribe(observer: Partial<Observer<E, A>>): Unsubscribable;
9
9
  }
10
10
 
11
- export type ObservableInput<E = never, A = never> =
12
- | Observable<E, A>
11
+ export type ObservableInput<R = never, E = never, A = never> =
12
+ | Observable<R, E, A>
13
13
  | Subscribable<E, A>
14
14
  | AsyncIterable<A>
15
15
  | PromiseLike<A>
16
16
  | ArrayLike<A>
17
17
  | Iterable<A>
18
18
  | ReadableStreamLike<A>
19
- | IO<never, E, A>;
20
-
21
- /*
22
- * -------------------------------------------------------------------------------------------------
23
- * constructors
24
- * -------------------------------------------------------------------------------------------------
25
- */
19
+ | IO<R, E, A>;
26
20
 
27
21
  /**
28
22
  * @tsplus static fncts.observable.ObservableOps halt
29
23
  */
30
- export function halt(defect: unknown): Observable<never, never> {
24
+ export function halt(defect: unknown): Observable<never, never, never> {
31
25
  return new Observable((s) => s.error(Cause.halt(defect)));
32
26
  }
33
27
 
34
28
  /**
35
29
  * @tsplus static fncts.observable.ObservableOps defer
36
30
  */
37
- export function defer<E, A>(observable: Lazy<ObservableInput<E, A>>): Observable<E, A> {
31
+ export function defer<R, E, A>(observable: Lazy<ObservableInput<R, E, A>>): Observable<R, E, A> {
38
32
  return new Observable((s) => {
39
33
  from(observable()).subscribe(s);
40
34
  });
@@ -43,28 +37,37 @@ export function defer<E, A>(observable: Lazy<ObservableInput<E, A>>): Observable
43
37
  /**
44
38
  * @tsplus static fncts.observable.ObservableOps empty
45
39
  */
46
- export function empty<A>(): Observable<never, A> {
40
+ export function empty<A>(): Observable<never, never, A> {
47
41
  return EMPTY;
48
42
  }
49
43
 
44
+ /**
45
+ * @tsplus static fncts.observable.ObservableOps environmentWithObservable
46
+ */
47
+ export function environmentWithObservable<R0, R, E, A>(
48
+ f: (environment: Environment<R0>) => Observable<R, E, A>,
49
+ ): Observable<R0 | R, E, A> {
50
+ return new EnvironmentWith(f);
51
+ }
52
+
50
53
  /**
51
54
  * @tsplus static fncts.observable.ObservableOps failCause
52
55
  */
53
- export function failCause<E>(cause: Cause<E>): Observable<E, never> {
56
+ export function failCause<E>(cause: Cause<E>): Observable<never, E, never> {
54
57
  return new Observable((s) => s.error(cause));
55
58
  }
56
59
 
57
60
  /**
58
61
  * @tsplus static fncts.observable.ObservableOps fail
59
62
  */
60
- export function fail<E>(e: E): Observable<E, never> {
63
+ export function fail<E>(e: E): Observable<never, E, never> {
61
64
  return new Observable((s) => s.error(Cause.fail(e)));
62
65
  }
63
66
 
64
67
  /**
65
68
  * @tsplus static fncts.observable.ObservableOps from
66
69
  */
67
- export function from<E = never, A = never>(input: ObservableInput<E, A>): Observable<E, A> {
70
+ export function from<R = never, E = never, A = never>(input: ObservableInput<R, E, A>): Observable<R, E, A> {
68
71
  if (input instanceof Observable) {
69
72
  return input;
70
73
  }
@@ -92,7 +95,7 @@ export function from<E = never, A = never>(input: ObservableInput<E, A>): Observ
92
95
  throw new TypeError("Invalid Observable input");
93
96
  }
94
97
 
95
- export function fromArrayLike<A>(input: ArrayLike<A>): Observable<never, A> {
98
+ export function fromArrayLike<A>(input: ArrayLike<A>): Observable<never, never, A> {
96
99
  return new Observable((s) => {
97
100
  for (let i = 0; i < input.length && !s.closed; i++) {
98
101
  s.next(input[i]!);
@@ -101,13 +104,13 @@ export function fromArrayLike<A>(input: ArrayLike<A>): Observable<never, A> {
101
104
  });
102
105
  }
103
106
 
104
- export function fromAsyncIterable<A>(asyncIterable: AsyncIterable<A>): Observable<never, A> {
107
+ export function fromAsyncIterable<A>(asyncIterable: AsyncIterable<A>): Observable<never, never, A> {
105
108
  return new Observable((s) => {
106
109
  process(asyncIterable, s).catch((err) => s.error(Cause.halt(err)));
107
110
  });
108
111
  }
109
112
 
110
- export function fromIterable<A>(iterable: Iterable<A>): Observable<never, A> {
113
+ export function fromIterable<A>(iterable: Iterable<A>): Observable<never, never, A> {
111
114
  return new Observable((s) => {
112
115
  for (const value of iterable) {
113
116
  s.next(value);
@@ -119,7 +122,7 @@ export function fromIterable<A>(iterable: Iterable<A>): Observable<never, A> {
119
122
  });
120
123
  }
121
124
 
122
- export function fromPromise<A>(promise: PromiseLike<A>): Observable<never, A> {
125
+ export function fromPromise<A>(promise: PromiseLike<A>): Observable<never, never, A> {
123
126
  return new Observable((s) => {
124
127
  promise
125
128
  .then(
@@ -135,14 +138,14 @@ export function fromPromise<A>(promise: PromiseLike<A>): Observable<never, A> {
135
138
  });
136
139
  }
137
140
 
138
- export function fromReadableStreamLike<A>(readableStream: ReadableStreamLike<A>): Observable<never, A> {
141
+ export function fromReadableStreamLike<A>(readableStream: ReadableStreamLike<A>): Observable<never, never, A> {
139
142
  return fromAsyncIterable(readableStreamToAsyncGenerator(readableStream));
140
143
  }
141
144
 
142
145
  /**
143
146
  * @tsplus static fncts.observable.ObservableOps fromSubscribable
144
147
  */
145
- export function fromSubscribable<E, A>(subscribable: Subscribable<E, A>): Observable<E, A> {
148
+ export function fromSubscribable<E, A>(subscribable: Subscribable<E, A>): Observable<never, E, A> {
146
149
  return new Observable((subscriber) => subscribable.subscribe(subscriber));
147
150
  }
148
151
 
@@ -152,7 +155,7 @@ export function fromInterop<A>(subscribable: {
152
155
  error: (err: unknown) => void;
153
156
  complete: () => void;
154
157
  }) => Unsubscribable;
155
- }): Observable<unknown, A> {
158
+ }): Observable<never, unknown, A> {
156
159
  return new Observable((subscriber) =>
157
160
  subscribable.subscribe({
158
161
  next: (value) => subscriber.next(value),
@@ -162,12 +165,12 @@ export function fromInterop<A>(subscribable: {
162
165
  );
163
166
  }
164
167
 
165
- function _if<E, A, E1, B>(
168
+ function _if<R, E, A, R1, E1, B>(
166
169
  condition: () => boolean,
167
- onTrue: ObservableInput<E, A>,
168
- onFalse: ObservableInput<E1, B>,
169
- ): Observable<E | E1, A | B> {
170
- return defer<E | E1, A | B>(() => (condition() ? onTrue : onFalse));
170
+ onTrue: ObservableInput<R, E, A>,
171
+ onFalse: ObservableInput<R1, E1, B>,
172
+ ): Observable<R | R1, E | E1, A | B> {
173
+ return defer<R | R1, E | E1, A | B>(() => (condition() ? onTrue : onFalse));
171
174
  }
172
175
 
173
176
  export { _if as if };
@@ -179,7 +182,7 @@ export interface IterateOptions<S> {
179
182
  readonly scheduler?: SchedulerLike;
180
183
  }
181
184
 
182
- export function iterate<S>(options: IterateOptions<S>): Observable<never, S> {
185
+ export function iterate<S>(options: IterateOptions<S>): Observable<never, never, S> {
183
186
  const { initialState, cont, iterate, scheduler } = options;
184
187
 
185
188
  function* gen() {
@@ -204,7 +207,7 @@ async function process<A>(asyncIterable: AsyncIterable<A>, subscriber: Subscribe
204
207
  /**
205
208
  * @tsplus static fncts.obervable.ObservableOps interval
206
209
  */
207
- export function interval(period = 0, scheduler: SchedulerLike = asyncScheduler): Observable<never, number> {
210
+ export function interval(period = 0, scheduler: SchedulerLike = asyncScheduler): Observable<never, never, number> {
208
211
  if (period < 0) {
209
212
  // eslint-disable-next-line no-param-reassign
210
213
  period = 0;
@@ -218,13 +221,13 @@ export function interval(period = 0, scheduler: SchedulerLike = asyncScheduler):
218
221
  */
219
222
  export function merge<O extends ReadonlyArray<ObservableInput<any, any>>>(
220
223
  ...sources: O
221
- ): Observable<Observable.ErrorOf<O[number]>, Observable.TypeOf<O[number]>>;
224
+ ): Observable<Observable.EnvironmentOf<O[number]>, Observable.ErrorOf<O[number]>, Observable.TypeOf<O[number]>>;
222
225
  export function merge<O extends ReadonlyArray<ObservableInput<any, any>>>(
223
226
  ...sources: [...O, number?]
224
- ): Observable<Observable.ErrorOf<O[number]>, Observable.TypeOf<O[number]>>;
227
+ ): Observable<Observable.EnvironmentOf<O[number]>, Observable.ErrorOf<O[number]>, Observable.TypeOf<O[number]>>;
225
228
  export function merge<O extends ReadonlyArray<ObservableInput<any, any>>>(
226
229
  ...sources: [...O, number?]
227
- ): Observable<Observable.ErrorOf<O[number]>, Observable.TypeOf<O[number]>> {
230
+ ): Observable<Observable.EnvironmentOf<O[number]>, Observable.ErrorOf<O[number]>, Observable.TypeOf<O[number]>> {
228
231
  const concurrency = popNumber(sources, Infinity);
229
232
  return !sources.length
230
233
  ? empty()
@@ -236,14 +239,14 @@ export function merge<O extends ReadonlyArray<ObservableInput<any, any>>>(
236
239
  /**
237
240
  * @tsplus static fncts.observable.ObservableOps of
238
241
  */
239
- export function of<A>(...items: ReadonlyArray<A>): Observable<never, A> {
242
+ export function of<A>(...items: ReadonlyArray<A>): Observable<never, never, A> {
240
243
  return fromArrayLike(items);
241
244
  }
242
245
 
243
246
  /**
244
247
  * @tsplus static fncts.observable.ObservableOps single
245
248
  */
246
- export function single<A>(a: A): Observable<never, A> {
249
+ export function single<A>(a: A): Observable<never, never, A> {
247
250
  return new Observable((s) => {
248
251
  s.next(a);
249
252
  s.complete();
@@ -254,7 +257,7 @@ export function single<A>(a: A): Observable<never, A> {
254
257
  * @tsplus fluent fncts.observable.Observable scheduled
255
258
  * @tsplus static fncts.observable.ObservableOps scheduled
256
259
  */
257
- export function scheduled<E, A>(input: ObservableInput<E, A>, scheduler: SchedulerLike): Observable<E, A> {
260
+ export function scheduled<R, E, A>(input: ObservableInput<R, E, A>, scheduler: SchedulerLike): Observable<R, E, A> {
258
261
  if (isArrayLike(input)) {
259
262
  return scheduleArray(input, scheduler);
260
263
  }
@@ -273,8 +276,8 @@ export function scheduled<E, A>(input: ObservableInput<E, A>, scheduler: Schedul
273
276
  return scheduleObservable(from(input), scheduler);
274
277
  }
275
278
 
276
- export function scheduleArray<A>(input: ArrayLike<A>, scheduler: SchedulerLike): Observable<never, A> {
277
- return new Observable<never, A>((s) => {
279
+ export function scheduleArray<A>(input: ArrayLike<A>, scheduler: SchedulerLike): Observable<never, never, A> {
280
+ return new Observable<never, never, A>((s) => {
278
281
  let i = 0;
279
282
  return scheduler.schedule(function () {
280
283
  if (i === input.length) {
@@ -289,7 +292,10 @@ export function scheduleArray<A>(input: ArrayLike<A>, scheduler: SchedulerLike):
289
292
  });
290
293
  }
291
294
 
292
- export function scheduleAsyncIterable<A>(input: AsyncIterable<A>, scheduler: SchedulerLike): Observable<never, A> {
295
+ export function scheduleAsyncIterable<A>(
296
+ input: AsyncIterable<A>,
297
+ scheduler: SchedulerLike,
298
+ ): Observable<never, never, A> {
293
299
  return new Observable((subscriber) => {
294
300
  const sub = new Subscription();
295
301
  sub.add(
@@ -313,7 +319,7 @@ export function scheduleAsyncIterable<A>(input: AsyncIterable<A>, scheduler: Sch
313
319
  });
314
320
  }
315
321
 
316
- export function scheduleIterable<A>(input: Iterable<A>, scheduler: SchedulerLike): Observable<never, A> {
322
+ export function scheduleIterable<A>(input: Iterable<A>, scheduler: SchedulerLike): Observable<never, never, A> {
317
323
  return new Observable((s) => {
318
324
  let iterator: Iterator<A, A>;
319
325
  s.add(
@@ -335,7 +341,7 @@ export function scheduleIterable<A>(input: Iterable<A>, scheduler: SchedulerLike
335
341
  });
336
342
  }
337
343
 
338
- export function scheduleObservable<E, A>(input: Observable<E, A>, scheduler: SchedulerLike): Observable<E, A> {
344
+ export function scheduleObservable<R, E, A>(input: Observable<R, E, A>, scheduler: SchedulerLike): Observable<R, E, A> {
339
345
  return new Observable((subscriber) => {
340
346
  const sub = new Subscription();
341
347
  sub.add(
@@ -358,7 +364,7 @@ export function scheduleObservable<E, A>(input: Observable<E, A>, scheduler: Sch
358
364
  });
359
365
  }
360
366
 
361
- export function schedulePromise<A>(input: PromiseLike<A>, scheduler: SchedulerLike): Observable<never, A> {
367
+ export function schedulePromise<A>(input: PromiseLike<A>, scheduler: SchedulerLike): Observable<never, never, A> {
362
368
  return new Observable((subscriber) => {
363
369
  return scheduler.schedule(() => {
364
370
  input.then(
@@ -381,20 +387,24 @@ export function schedulePromise<A>(input: PromiseLike<A>, scheduler: SchedulerLi
381
387
  export function scheduleReadableStreamLike<A>(
382
388
  input: ReadableStreamLike<A>,
383
389
  scheduler: SchedulerLike,
384
- ): Observable<never, A> {
390
+ ): Observable<never, never, A> {
385
391
  return scheduleAsyncIterable(readableStreamToAsyncGenerator(input), scheduler);
386
392
  }
387
393
 
388
394
  /**
389
395
  * @tsplus static fncts.observable.ObservableOps timer
390
396
  */
391
- export function timer(time: number | Date, interval?: number, scheduler?: SchedulerLike): Observable<never, number>;
392
- export function timer(time: number | Date, scheduler?: SchedulerLike): Observable<never, number>;
397
+ export function timer(
398
+ time: number | Date,
399
+ interval?: number,
400
+ scheduler?: SchedulerLike,
401
+ ): Observable<never, never, number>;
402
+ export function timer(time: number | Date, scheduler?: SchedulerLike): Observable<never, never, number>;
393
403
  export function timer(
394
404
  time: number | Date = 0,
395
405
  intervalOrScheduler?: number | SchedulerLike,
396
406
  scheduler: SchedulerLike = asyncScheduler,
397
- ): Observable<never, number> {
407
+ ): Observable<never, never, number> {
398
408
  let intervalDuration = -1;
399
409
  if (intervalOrScheduler != null) {
400
410
  if (isScheduler(intervalOrScheduler)) {
@@ -428,7 +438,11 @@ export function timer(
428
438
  */
429
439
  export function makeZip<O extends ReadonlyArray<ObservableInput<any, any>>>(
430
440
  ...sources: O
431
- ): Observable<Observable.ErrorOf<O[number]>, { [K in keyof O]: Observable.TypeOf<O[K]> }> {
441
+ ): Observable<
442
+ Observable.EnvironmentOf<O[number]>,
443
+ Observable.ErrorOf<O[number]>,
444
+ { [K in keyof O]: Observable.TypeOf<O[K]> }
445
+ > {
432
446
  return sources.length
433
447
  ? new Observable((subscriber) => {
434
448
  let buffers: unknown[][] = sources.map(() => []);
@@ -466,11 +480,11 @@ export function makeZip<O extends ReadonlyArray<ObservableInput<any, any>>>(
466
480
  /**
467
481
  * @tsplus static fncts.observable.ObservableOps fromIO
468
482
  */
469
- export function fromIO<E, A>(io: IO<never, E, A>, scheduler: SchedulerLike = asyncScheduler): Observable<E, A> {
470
- return new Observable((s) => {
483
+ export function fromIO<R, E, A>(io: IO<R, E, A>, scheduler: SchedulerLike = asyncScheduler): Observable<R, E, A> {
484
+ return new Observable((s, env) => {
471
485
  let fiber: FiberContext<E, A>;
472
486
  const scheduled = scheduler.schedule(() => {
473
- fiber = io.unsafeRunFiber();
487
+ fiber = io.provideEnvironment(env).unsafeRunFiber();
474
488
  fiber.unsafeOnDone((exit) => {
475
489
  if (!s.closed) {
476
490
  exit.flatten.match(
@@ -488,58 +502,46 @@ export function fromIO<E, A>(io: IO<never, E, A>, scheduler: SchedulerLike = asy
488
502
  });
489
503
  }
490
504
 
491
- /*
492
- * -------------------------------------------------------------------------------------------------
493
- * Applicative
494
- * -------------------------------------------------------------------------------------------------
495
- */
496
-
497
505
  /**
498
506
  * @tsplus static fncts.observable.ObservableOps unit
499
507
  */
500
- export const unit: Observable<never, void> = Observable.single(undefined);
501
-
502
- /*
503
- * -------------------------------------------------------------------------------------------------
504
- * Apply
505
- * -------------------------------------------------------------------------------------------------
506
- */
508
+ export const unit: Observable<never, never, void> = Observable.single(undefined);
507
509
 
508
510
  /**
509
511
  * @tsplus fluent fncts.observable.Observable zipWith
510
512
  */
511
- export function zipWith<E, A, E1, B, C>(
512
- fa: Observable<E, A>,
513
- fb: Observable<E1, B>,
513
+ export function zipWith<R, E, A, R1, E1, B, C>(
514
+ fa: Observable<R, E, A>,
515
+ fb: Observable<R1, E1, B>,
514
516
  f: (a: A, b: B) => C,
515
- ): Observable<E | E1, C> {
517
+ ): Observable<R | R1, E | E1, C> {
516
518
  return fa.mergeMap((a) => fb.map((b) => f(a, b)));
517
519
  }
518
520
 
519
521
  /**
520
522
  * @tsplus fluent fncts.observable.Observable zip
521
523
  */
522
- export function zip<E, A, E1, B>(fa: Observable<E, A>, fb: Observable<E1, B>): Observable<E | E1, readonly [A, B]> {
524
+ export function zip<R, E, A, R1, E1, B>(
525
+ fa: Observable<R, E, A>,
526
+ fb: Observable<R1, E1, B>,
527
+ ): Observable<R | R1, E | E1, readonly [A, B]> {
523
528
  return zipWith(fa, fb, Function.tuple);
524
529
  }
525
530
 
526
531
  /**
527
532
  * @tsplus fluent fncts.observable.Observable ap
528
533
  */
529
- export function ap<E, A, E1, B>(fab: Observable<E, (a: A) => B>, fa: Observable<E1, A>): Observable<E | E1, B> {
534
+ export function ap<R, E, A, R1, E1, B>(
535
+ fab: Observable<R, E, (a: A) => B>,
536
+ fa: Observable<R1, E1, A>,
537
+ ): Observable<R | R1, E | E1, B> {
530
538
  return zipWith(fab, fa, (f, a) => f(a));
531
539
  }
532
540
 
533
- /*
534
- * -------------------------------------------------------------------------------------------------
535
- * Functor
536
- * -------------------------------------------------------------------------------------------------
537
- */
538
-
539
541
  /**
540
542
  * @tsplus fluent fncts.observable.Observable mapWithIndex
541
543
  */
542
- export function mapWithIndex<E, A, B>(fa: Observable<E, A>, f: (i: number, a: A) => B): Observable<E, B> {
544
+ export function mapWithIndex<R, E, A, B>(fa: Observable<R, E, A>, f: (i: number, a: A) => B): Observable<R, E, B> {
543
545
  return fa.operate((source, subscriber) => {
544
546
  let i = 0;
545
547
  source.subscribe(
@@ -555,27 +557,21 @@ export function mapWithIndex<E, A, B>(fa: Observable<E, A>, f: (i: number, a: A)
555
557
  /**
556
558
  * @tsplus fluent fncts.observable.Observable map
557
559
  */
558
- export function map_<E, A, B>(fa: Observable<E, A>, f: (a: A) => B): Observable<E, B> {
560
+ export function map_<R, E, A, B>(fa: Observable<R, E, A>, f: (a: A) => B): Observable<R, E, B> {
559
561
  return fa.mapWithIndex((_, a) => f(a));
560
562
  }
561
563
 
562
564
  /**
563
565
  * @tsplus fluent fncts.observable.Observable as
564
566
  */
565
- export function as_<E, A, B>(fa: Observable<E, A>, b: Lazy<B>): Observable<E, B> {
567
+ export function as_<R, E, A, B>(fa: Observable<R, E, A>, b: Lazy<B>): Observable<R, E, B> {
566
568
  return map_(fa, b);
567
569
  }
568
570
 
569
- /*
570
- * -------------------------------------------------------------------------------------------------
571
- * Bifunctor
572
- * -------------------------------------------------------------------------------------------------
573
- */
574
-
575
571
  /**
576
572
  * @tsplus fluent fncts.observable.Observable mapError
577
573
  */
578
- export function mapError_<E, A, E1>(fa: Observable<E, A>, f: (e: E) => E1): Observable<E1, A> {
574
+ export function mapError_<R, E, A, E1>(fa: Observable<R, E, A>, f: (e: E) => E1): Observable<R, E1, A> {
579
575
  return fa.operate((source, subscriber) => {
580
576
  source.subscribe(
581
577
  new OperatorSubscriber(subscriber, {
@@ -590,7 +586,7 @@ export function mapError_<E, A, E1>(fa: Observable<E, A>, f: (e: E) => E1): Obse
590
586
  /**
591
587
  * @tsplus getter fncts.observable.Observable swap
592
588
  */
593
- export function swap<E, A>(fa: Observable<E, A>): Observable<A, E> {
589
+ export function swap<R, E, A>(fa: Observable<R, E, A>): Observable<R, A, E> {
594
590
  return operate_(fa, (source, subscriber) => {
595
591
  source.subscribe(
596
592
  new OperatorSubscriber(subscriber, {
@@ -612,27 +608,21 @@ export function swap<E, A>(fa: Observable<E, A>): Observable<A, E> {
612
608
  });
613
609
  }
614
610
 
615
- /*
616
- * -------------------------------------------------------------------------------------------------
617
- * Filterable
618
- * -------------------------------------------------------------------------------------------------
619
- */
620
-
621
611
  /**
622
612
  * @tsplus fluent fncts.observable.Observable filterWithIndex
623
613
  */
624
- export function filterWithIndex_<E, A, B extends A>(
625
- fa: Observable<E, A>,
614
+ export function filterWithIndex_<R, E, A, B extends A>(
615
+ fa: Observable<R, E, A>,
626
616
  refinement: RefinementWithIndex<number, A, B>,
627
- ): Observable<E, B>;
628
- export function filterWithIndex_<E, A>(
629
- fa: Observable<E, A>,
617
+ ): Observable<R, E, B>;
618
+ export function filterWithIndex_<R, E, A>(
619
+ fa: Observable<R, E, A>,
630
620
  predicate: PredicateWithIndex<number, A>,
631
- ): Observable<E, A>;
632
- export function filterWithIndex_<E, A>(
633
- fa: Observable<E, A>,
621
+ ): Observable<R, E, A>;
622
+ export function filterWithIndex_<R, E, A>(
623
+ fa: Observable<R, E, A>,
634
624
  predicate: PredicateWithIndex<number, A>,
635
- ): Observable<E, A> {
625
+ ): Observable<R, E, A> {
636
626
  return operate_(fa, (source, subscriber) => {
637
627
  let index = 0;
638
628
  source.subscribe(
@@ -644,16 +634,22 @@ export function filterWithIndex_<E, A>(
644
634
  /**
645
635
  * @tsplus fluent fncts.observable.Observable filter
646
636
  */
647
- export function filter_<E, A, B extends A>(fa: Observable<E, A>, refinement: Refinement<A, B>): Observable<E, B>;
648
- export function filter_<E, A>(fa: Observable<E, A>, predicate: Predicate<A>): Observable<E, A>;
649
- export function filter_<E, A>(fa: Observable<E, A>, predicate: Predicate<A>): Observable<E, A> {
637
+ export function filter_<R, E, A, B extends A>(
638
+ fa: Observable<R, E, A>,
639
+ refinement: Refinement<A, B>,
640
+ ): Observable<R, E, B>;
641
+ export function filter_<R, E, A>(fa: Observable<R, E, A>, predicate: Predicate<A>): Observable<R, E, A>;
642
+ export function filter_<R, E, A>(fa: Observable<R, E, A>, predicate: Predicate<A>): Observable<R, E, A> {
650
643
  return fa.filterWithIndex((_, a) => predicate(a));
651
644
  }
652
645
 
653
646
  /**
654
647
  * @tsplus fluent fncts.observable.Observable filterMapWithIndex
655
648
  */
656
- export function filterMapWithIndex<E, A, B>(fa: Observable<E, A>, f: (i: number, a: A) => Maybe<B>): Observable<E, B> {
649
+ export function filterMapWithIndex<R, E, A, B>(
650
+ fa: Observable<R, E, A>,
651
+ f: (i: number, a: A) => Maybe<B>,
652
+ ): Observable<R, E, B> {
657
653
  return operate_(fa, (source, subscriber) => {
658
654
  let index = 0;
659
655
  source.subscribe(
@@ -671,53 +667,53 @@ export function filterMapWithIndex<E, A, B>(fa: Observable<E, A>, f: (i: number,
671
667
  /**
672
668
  * @tsplus fluent fncts.observable.Observable filterMap
673
669
  */
674
- export function filterMap_<E, A, B>(fa: Observable<E, A>, f: (a: A) => Maybe<B>): Observable<E, B> {
670
+ export function filterMap_<R, E, A, B>(fa: Observable<R, E, A>, f: (a: A) => Maybe<B>): Observable<R, E, B> {
675
671
  return fa.filterMapWithIndex((_, a) => f(a));
676
672
  }
677
673
 
678
674
  /**
679
675
  * @tsplus fluent fncts.observable.Observable partitionWithIndex
680
676
  */
681
- export function partitionWithIndex<E, A, B extends A>(
682
- fa: Observable<E, A>,
677
+ export function partitionWithIndex<R, E, A, B extends A>(
678
+ fa: Observable<R, E, A>,
683
679
  refinement: RefinementWithIndex<number, A, B>,
684
- ): readonly [Observable<E, Exclude<A, B>>, Observable<E, B>];
685
- export function partitionWithIndex<E, A>(
686
- fa: Observable<E, A>,
680
+ ): readonly [Observable<R, E, Exclude<A, B>>, Observable<R, E, B>];
681
+ export function partitionWithIndex<R, E, A>(
682
+ fa: Observable<R, E, A>,
687
683
  predicate: PredicateWithIndex<number, A>,
688
- ): readonly [Observable<E, A>, Observable<E, A>];
689
- export function partitionWithIndex<E, A>(
690
- fa: Observable<E, A>,
684
+ ): readonly [Observable<R, E, A>, Observable<R, E, A>];
685
+ export function partitionWithIndex<R, E, A>(
686
+ fa: Observable<R, E, A>,
691
687
  predicate: PredicateWithIndex<number, A>,
692
- ): readonly [Observable<E, A>, Observable<E, A>] {
688
+ ): readonly [Observable<R, E, A>, Observable<R, E, A>] {
693
689
  return [fa.filterWithIndex((i, a) => !predicate(i, a)), fa.filterWithIndex(predicate)];
694
690
  }
695
691
 
696
692
  /**
697
693
  * @tsplus fluent fncts.observable.Observable partition
698
694
  */
699
- export function partition_<E, A, B extends A>(
700
- fa: Observable<E, A>,
695
+ export function partition_<R, E, A, B extends A>(
696
+ fa: Observable<R, E, A>,
701
697
  refinement: Refinement<A, B>,
702
- ): readonly [Observable<E, Exclude<A, B>>, Observable<E, B>];
703
- export function partition_<E, A>(
704
- fa: Observable<E, A>,
698
+ ): readonly [Observable<R, E, Exclude<A, B>>, Observable<R, E, B>];
699
+ export function partition_<R, E, A>(
700
+ fa: Observable<R, E, A>,
705
701
  predicate: Predicate<A>,
706
- ): readonly [Observable<E, A>, Observable<E, A>];
707
- export function partition_<E, A>(
708
- fa: Observable<E, A>,
702
+ ): readonly [Observable<R, E, A>, Observable<R, E, A>];
703
+ export function partition_<R, E, A>(
704
+ fa: Observable<R, E, A>,
709
705
  predicate: Predicate<A>,
710
- ): readonly [Observable<E, A>, Observable<E, A>] {
706
+ ): readonly [Observable<R, E, A>, Observable<R, E, A>] {
711
707
  return fa.partitionWithIndex((_, a) => predicate(a));
712
708
  }
713
709
 
714
710
  /**
715
711
  * @tsplus fluent fncts.observable.Observable partitionMapWithIndex
716
712
  */
717
- export function partitionMapWithIndex_<E, A, B, C>(
718
- fa: Observable<E, A>,
713
+ export function partitionMapWithIndex_<R, E, A, B, C>(
714
+ fa: Observable<R, E, A>,
719
715
  f: (i: number, a: A) => Either<B, C>,
720
- ): readonly [Observable<E, B>, Observable<E, C>] {
716
+ ): readonly [Observable<R, E, B>, Observable<R, E, C>] {
721
717
  return [
722
718
  operate_(fa, (source, subscriber) => {
723
719
  let index = 0;
@@ -745,102 +741,119 @@ export function partitionMapWithIndex_<E, A, B, C>(
745
741
  /**
746
742
  * @tsplus fluent fncts.observable.Observable partitionMap
747
743
  */
748
- export function partitionMap_<E, A, B, C>(
749
- fa: Observable<E, A>,
744
+ export function partitionMap_<R, E, A, B, C>(
745
+ fa: Observable<R, E, A>,
750
746
  f: (a: A) => Either<B, C>,
751
- ): readonly [Observable<E, B>, Observable<E, C>] {
747
+ ): readonly [Observable<R, E, B>, Observable<R, E, C>] {
752
748
  return fa.partitionMapWithIndex((_, a) => f(a));
753
749
  }
754
750
 
755
- /*
756
- * -------------------------------------------------------------------------------------------------
757
- * Monad
758
- * -------------------------------------------------------------------------------------------------
751
+ /**
752
+ * @tsplus fluent fncts.observable.Observable provideEnvironment
759
753
  */
754
+ export function provideEnvironment<R, E, A>(
755
+ self: Observable<R, E, A>,
756
+ environment: Environment<R>,
757
+ ): Observable<never, E, A> {
758
+ return self.provide(environment);
759
+ }
760
+
761
+ /**
762
+ * @tsplus fluent fncts.observable.Observable provideService
763
+ */
764
+ export function provideService<R, E, A, S>(
765
+ self: Observable<R, E, A>,
766
+ service: S,
767
+ /** @tsplus auto */ tag: Tag<S>,
768
+ ): Observable<Exclude<R, S>, E, A> {
769
+ return self.contramapEnvironment((environment) => environment.add(service, tag) as Environment<R>);
770
+ }
760
771
 
761
772
  /**
762
773
  * @tsplus fluent fncts.observable.Observable mergeMapWithIndex
763
774
  */
764
- export function mergeMapWithIndex<E, A, E1, B>(
765
- ma: Observable<E, A>,
766
- f: (i: number, a: A) => ObservableInput<E1, B>,
775
+ export function mergeMapWithIndex<R, E, A, R1, E1, B>(
776
+ ma: Observable<R, E, A>,
777
+ f: (i: number, a: A) => ObservableInput<R1, E1, B>,
767
778
  concurrent = Infinity,
768
- ): Observable<E | E1, B> {
779
+ ): Observable<R | R1, E | E1, B> {
769
780
  return operate_(ma, (source, sub) => mergeInternal(source, sub, f, concurrent));
770
781
  }
771
782
 
772
783
  /**
773
784
  * @tsplus fluent fncts.observable.Observable mergeMap
774
785
  */
775
- export function mergeMap_<E, A, E1, B>(
776
- ma: Observable<E, A>,
777
- f: (a: A) => ObservableInput<E1, B>,
786
+ export function mergeMap_<R, E, A, R1, E1, B>(
787
+ ma: Observable<R, E, A>,
788
+ f: (a: A) => ObservableInput<R1, E1, B>,
778
789
  concurrent = Infinity,
779
- ): Observable<E | E1, B> {
790
+ ): Observable<R | R1, E | E1, B> {
780
791
  return ma.mergeMapWithIndex((_, a) => f(a), concurrent);
781
792
  }
782
793
 
783
794
  /**
784
795
  * @tsplus fluent fncts.observable.Observable concatMapWithIndex
785
796
  */
786
- export function concatMapWithIndex<E, A, E1, B>(
787
- ma: Observable<E, A>,
788
- f: (i: number, a: A) => ObservableInput<E1, B>,
789
- ): Observable<E | E1, B> {
797
+ export function concatMapWithIndex<R, E, A, R1, E1, B>(
798
+ ma: Observable<R, E, A>,
799
+ f: (i: number, a: A) => ObservableInput<R1, E1, B>,
800
+ ): Observable<R | R1, E | E1, B> {
790
801
  return ma.mergeMapWithIndex(f, 1);
791
802
  }
792
803
 
793
804
  /**
794
805
  * @tsplus fluent fncts.observable.Observable concatMap
795
806
  */
796
- export function concatMap_<E, A, E1, B>(
797
- ma: Observable<E, A>,
798
- f: (a: A) => ObservableInput<E1, B>,
799
- ): Observable<E | E1, B> {
807
+ export function concatMap_<R, E, A, R1, E1, B>(
808
+ ma: Observable<R, E, A>,
809
+ f: (a: A) => ObservableInput<R1, E1, B>,
810
+ ): Observable<R | R1, E | E1, B> {
800
811
  return ma.mergeMapWithIndex((_, a) => f(a), 1);
801
812
  }
802
813
 
803
814
  /**
804
- * @tsplus getter fncts.observable.Observable flatten
815
+ * @tsplus fluent fncts.observable.Observable contramapEnvironment
805
816
  */
806
- export function flatten<E, E1, A>(mma: Observable<E, Observable<E1, A>>): Observable<E | E1, A> {
807
- return mma.concatAll;
817
+ export function contramapEnvironment<R, E, A, R0>(
818
+ self: Observable<R, E, A>,
819
+ f: (r0: Environment<R0>) => Environment<R>,
820
+ ): Observable<R0, E, A> {
821
+ return Observable.environmentWithObservable((environment) => self.provide(f(environment)));
808
822
  }
809
823
 
810
- /*
811
- * -------------------------------------------------------------------------------------------------
812
- * Foldable
813
- * -------------------------------------------------------------------------------------------------
824
+ /**
825
+ * @tsplus getter fncts.observable.Observable flatten
814
826
  */
827
+ export function flatten<R, E, R1, E1, A>(mma: Observable<R, E, Observable<R1, E1, A>>): Observable<R | R1, E | E1, A> {
828
+ return mma.concatAll;
829
+ }
815
830
 
816
831
  /**
817
832
  * @tsplus fluent fncts.observable.Observable foldLeftWithIndex
818
833
  */
819
- export function foldLeftWithIndex<E, A, B>(
820
- fa: Observable<E, A>,
834
+ export function foldLeftWithIndex<R, E, A, B>(
835
+ fa: Observable<R, E, A>,
821
836
  initial: B,
822
837
  f: (index: number, acc: B, value: A) => B,
823
- ): Observable<E, B> {
838
+ ): Observable<R, E, B> {
824
839
  return fa.operate(scanInternal(f, initial, true, false, true));
825
840
  }
826
841
 
827
842
  /**
828
843
  * @tsplus fluent fncts.observable.Observable foldLeft
829
844
  */
830
- export function foldLeft<E, A, B>(fa: Observable<E, A>, initial: B, f: (acc: B, value: A) => B): Observable<E, B> {
845
+ export function foldLeft<R, E, A, B>(
846
+ fa: Observable<R, E, A>,
847
+ initial: B,
848
+ f: (acc: B, value: A) => B,
849
+ ): Observable<R, E, B> {
831
850
  return fa.foldLeftWithIndex(initial, (_, b, a) => f(b, a));
832
851
  }
833
852
 
834
- /*
835
- * -------------------------------------------------------------------------------------------------
836
- * combinators
837
- * -------------------------------------------------------------------------------------------------
838
- */
839
-
840
853
  /**
841
854
  * @tsplus fluent fncts.observable.Observable at
842
855
  */
843
- export function at_<E, A>(fa: Observable<E, A>, index: number): Observable<E, Maybe<A>> {
856
+ export function at_<R, E, A>(fa: Observable<R, E, A>, index: number): Observable<R, E, Maybe<A>> {
844
857
  return fa
845
858
  .filterWithIndex((i) => i === index)
846
859
  .take(1)
@@ -851,10 +864,10 @@ export function at_<E, A>(fa: Observable<E, A>, index: number): Observable<E, Ma
851
864
  /**
852
865
  * @tsplus fluent fncts.observable.Observable audit
853
866
  */
854
- export function audit_<E, A, E1>(
855
- fa: Observable<E, A>,
856
- durationSelector: (value: A) => ObservableInput<E1, any>,
857
- ): Observable<E | E1, A> {
867
+ export function audit_<R, E, A, R1, E1>(
868
+ fa: Observable<R, E, A>,
869
+ durationSelector: (value: A) => ObservableInput<R1, E1, any>,
870
+ ): Observable<R | R1, E | E1, A> {
858
871
  return fa.operate((source, subscriber) => {
859
872
  let lastValue: Maybe<A> = Nothing();
860
873
  let durationSubscriber: Subscriber<any, any> | null = null;
@@ -897,21 +910,21 @@ export function audit_<E, A, E1>(
897
910
  /**
898
911
  * @tsplus fluent fncts.observable.Observable auditTime
899
912
  */
900
- export function auditTime_<E, A>(
901
- fa: Observable<E, A>,
913
+ export function auditTime_<R, E, A>(
914
+ fa: Observable<R, E, A>,
902
915
  duration: number,
903
916
  scheduler: SchedulerLike = asyncScheduler,
904
- ): Observable<E, A> {
917
+ ): Observable<R, E, A> {
905
918
  return fa.audit(() => timer(duration, scheduler));
906
919
  }
907
920
 
908
921
  /**
909
922
  * @tsplus fluent fncts.observable.Observable buffer
910
923
  */
911
- export function buffer_<E, A, E1>(
912
- fa: Observable<E, A>,
913
- closingNotifier: Observable<E1, any>,
914
- ): Observable<E | E1, ReadonlyArray<A>> {
924
+ export function buffer_<R, E, A, R1, E1>(
925
+ fa: Observable<R, E, A>,
926
+ closingNotifier: Observable<R1, E1, any>,
927
+ ): Observable<R | R1, E | E1, ReadonlyArray<A>> {
915
928
  return fa.operate((source, subscriber) => {
916
929
  let buffer: A[] = [];
917
930
  source.subscribe(
@@ -942,11 +955,11 @@ export function buffer_<E, A, E1>(
942
955
  /**
943
956
  * @tsplus fluent fncts.observable.Observable bufferCount
944
957
  */
945
- export function bufferCount_<E, A>(
946
- fa: Observable<E, A>,
958
+ export function bufferCount_<R, E, A>(
959
+ fa: Observable<R, E, A>,
947
960
  bufferSize: number,
948
961
  startBufferEvery?: number,
949
- ): Observable<E, ReadonlyArray<A>> {
962
+ ): Observable<R, E, ReadonlyArray<A>> {
950
963
  // eslint-disable-next-line no-param-reassign
951
964
  startBufferEvery = startBufferEvery ?? bufferSize;
952
965
  return fa.operate((source, subscriber) => {
@@ -1000,7 +1013,10 @@ export interface BufferTimeConfig {
1000
1013
  /**
1001
1014
  * @tsplus fluent fncts.observable.Observable bufferTime
1002
1015
  */
1003
- export function bufferTime_<E, A>(fa: Observable<E, A>, config: BufferTimeConfig): Observable<E, ReadonlyArray<A>> {
1016
+ export function bufferTime_<R, E, A>(
1017
+ fa: Observable<R, E, A>,
1018
+ config: BufferTimeConfig,
1019
+ ): Observable<R, E, ReadonlyArray<A>> {
1004
1020
  const {
1005
1021
  bufferTimeSpan,
1006
1022
  bufferCreationInterval = null,
@@ -1068,11 +1084,11 @@ export function bufferTime_<E, A>(fa: Observable<E, A>, config: BufferTimeConfig
1068
1084
  /**
1069
1085
  * @tsplus fluent fncts.observable.Observable bufferToggle
1070
1086
  */
1071
- export function bufferToggle_<E, A, E1, B, E2>(
1072
- fa: Observable<E, A>,
1073
- openings: ObservableInput<E1, B>,
1074
- closingSelector: (value: B) => ObservableInput<E2, any>,
1075
- ): Observable<E | E1 | E2, ReadonlyArray<A>> {
1087
+ export function bufferToggle_<R, E, A, R1, E1, B, R2, E2>(
1088
+ fa: Observable<R, E, A>,
1089
+ openings: ObservableInput<R1, E1, B>,
1090
+ closingSelector: (value: B) => ObservableInput<R2, E2, any>,
1091
+ ): Observable<R | R1 | R2, E | E1 | E2, ReadonlyArray<A>> {
1076
1092
  return fa.operate((source, subscriber) => {
1077
1093
  const buffers: A[][] = [];
1078
1094
  from(openings).subscribe(
@@ -1116,10 +1132,10 @@ export function bufferToggle_<E, A, E1, B, E2>(
1116
1132
  /**
1117
1133
  * @tsplus fluent fncts.observable.Observable bufferWhen
1118
1134
  */
1119
- export function bufferWhen_<E, A, E1>(
1120
- fa: Observable<E, A>,
1121
- closingSelector: () => ObservableInput<E1, any>,
1122
- ): Observable<E | E1, ReadonlyArray<A>> {
1135
+ export function bufferWhen_<R, E, A, R1, E1>(
1136
+ fa: Observable<R, E, A>,
1137
+ closingSelector: () => ObservableInput<R1, E1, any>,
1138
+ ): Observable<R | R1, E | E1, ReadonlyArray<A>> {
1123
1139
  return fa.operate((source, subscriber) => {
1124
1140
  let buffer: A[] | null = null;
1125
1141
  let closingSubscriber: Subscriber<E | E1, A> | null = null;
@@ -1149,23 +1165,17 @@ export function bufferWhen_<E, A, E1>(
1149
1165
  });
1150
1166
  }
1151
1167
 
1152
- export function bufferWhen<E1>(
1153
- closingSelector: () => ObservableInput<E1, any>,
1154
- ): <E, A>(fa: Observable<E, A>) => Observable<E | E1, ReadonlyArray<A>> {
1155
- return (fa) => bufferWhen_(fa, closingSelector);
1156
- }
1157
-
1158
1168
  /**
1159
1169
  * @tsplus fluent fncts.observable.Observable catchAllCause
1160
1170
  */
1161
- export function catchAllCause<E, A, E1, B>(
1162
- self: Observable<E, A>,
1163
- f: (cause: Cause<E>, caught: Observable<E | E1, A | B>) => ObservableInput<E1, B>,
1164
- ): Observable<E1, A | B> {
1171
+ export function catchAllCause<R, E, A, R1, E1, B>(
1172
+ self: Observable<R, E, A>,
1173
+ f: (cause: Cause<E>, caught: Observable<R | R1, E | E1, A | B>) => ObservableInput<R | R1, E1, B>,
1174
+ ): Observable<R | R1, E1, A | B> {
1165
1175
  return self.operate((source, subscriber) => {
1166
1176
  let innerSub: Subscription | null = null;
1167
1177
  let syncUnsub = false;
1168
- let handledResult: Observable<E1, B>;
1178
+ let handledResult: Observable<R | R1, E1, B>;
1169
1179
  innerSub = source.subscribe(
1170
1180
  operatorSubscriber(subscriber, {
1171
1181
  error: (cause) => {
@@ -1191,17 +1201,23 @@ export function catchAllCause<E, A, E1, B>(
1191
1201
  /**
1192
1202
  * @tsplus getter fncts.observable.Observable concatAll
1193
1203
  */
1194
- export function concatAll<E, E1, A>(ffa: Observable<E, ObservableInput<E1, A>>): Observable<E | E1, A> {
1204
+ export function concatAll<R, E, R1, E1, A>(
1205
+ ffa: Observable<R, E, ObservableInput<R1, E1, A>>,
1206
+ ): Observable<R | R1, E | E1, A> {
1195
1207
  return mergeAll_(ffa, 1);
1196
1208
  }
1197
1209
 
1198
1210
  /**
1199
1211
  * @tsplus fluent fncts.observable.Observable concat
1200
1212
  */
1201
- export function concat_<E, A, O extends ReadonlyArray<ObservableInput<any, any>>>(
1202
- fa: Observable<E, A>,
1213
+ export function concat_<R, E, A, O extends ReadonlyArray<ObservableInput<any, any>>>(
1214
+ fa: Observable<R, E, A>,
1203
1215
  ...sources: O
1204
- ): Observable<E | Observable.ErrorOf<O[number]>, A | Observable.TypeOf<O[number]>> {
1216
+ ): Observable<
1217
+ R | Observable.EnvironmentOf<O[number]>,
1218
+ E | Observable.ErrorOf<O[number]>,
1219
+ A | Observable.TypeOf<O[number]>
1220
+ > {
1205
1221
  return fa.operate((source, subscriber) => {
1206
1222
  fromArrayLike([source, ...sources]).concatAll.subscribe(subscriber);
1207
1223
  });
@@ -1210,33 +1226,33 @@ export function concat_<E, A, O extends ReadonlyArray<ObservableInput<any, any>>
1210
1226
  /**
1211
1227
  * @tsplus getter fncts.observable.Observable count
1212
1228
  */
1213
- export function count<E, A>(fa: Observable<E, A>): Observable<E, number> {
1229
+ export function count<R, E, A>(fa: Observable<R, E, A>): Observable<R, E, number> {
1214
1230
  return fa.foldLeft(0, (total, _) => total + 1);
1215
1231
  }
1216
1232
 
1217
1233
  /**
1218
1234
  * @tsplus fluent fncts.observable.Observable countWithIndex
1219
1235
  */
1220
- export function countWithIndex<E, A>(
1221
- fa: Observable<E, A>,
1236
+ export function countWithIndex<R, E, A>(
1237
+ fa: Observable<R, E, A>,
1222
1238
  predicate: PredicateWithIndex<number, A>,
1223
- ): Observable<E, number> {
1239
+ ): Observable<R, E, number> {
1224
1240
  return fa.foldLeftWithIndex(0, (i, total, v) => (predicate(i, v) ? total + 1 : total));
1225
1241
  }
1226
1242
 
1227
1243
  /**
1228
1244
  * @tsplus fluent fncts.observable.Observable countWith
1229
1245
  */
1230
- export function countWith_<E, A>(fa: Observable<E, A>, predicate: Predicate<A>): Observable<E, number> {
1246
+ export function countWith_<R, E, A>(fa: Observable<R, E, A>, predicate: Predicate<A>): Observable<R, E, number> {
1231
1247
  return fa.countWithIndex((_, a) => predicate(a));
1232
1248
  }
1233
1249
 
1234
1250
  /**
1235
1251
  * @tsplus getter fncts.observable.Observable combineLatestAll
1236
1252
  */
1237
- export function combineLatestAll<E, E1, A>(
1238
- fa: Observable<E, ObservableInput<E1, A>>,
1239
- ): Observable<E | E1, ReadonlyArray<A>> {
1253
+ export function combineLatestAll<R, E, R1, E1, A>(
1254
+ fa: Observable<R, E, ObservableInput<R1, E1, A>>,
1255
+ ): Observable<R | R1, E | E1, ReadonlyArray<A>> {
1240
1256
  return joinAllInternal(fa, (sources) =>
1241
1257
  !sources.length ? empty() : (combineLatest_(sources[0]!, ...sources.slice(1)) as any),
1242
1258
  );
@@ -1245,10 +1261,14 @@ export function combineLatestAll<E, E1, A>(
1245
1261
  /**
1246
1262
  * @tsplus fluent fncts.observable.Observable combineLatest
1247
1263
  */
1248
- export function combineLatest_<E, A, O extends ReadonlyArray<ObservableInput<any, any>>>(
1249
- self: ObservableInput<E, A>,
1264
+ export function combineLatest_<R, E, A, O extends ReadonlyArray<ObservableInput<any, any, any>>>(
1265
+ self: ObservableInput<R, E, A>,
1250
1266
  ...sources: O
1251
- ): Observable<E | Observable.ErrorOf<O[number]>, [A, ...{ [K in keyof O]: Observable.TypeOf<O[K]> }]> {
1267
+ ): Observable<
1268
+ R | Observable.EnvironmentOf<O[number]>,
1269
+ E | Observable.ErrorOf<O[number]>,
1270
+ [A, ...{ [K in keyof O]: Observable.TypeOf<O[K]> }]
1271
+ > {
1252
1272
  if (!sources.length) {
1253
1273
  return from(self).unsafeCoerce();
1254
1274
  }
@@ -1260,10 +1280,10 @@ export function combineLatest_<E, A, O extends ReadonlyArray<ObservableInput<any
1260
1280
  /**
1261
1281
  * @tsplus fluent fncts.observable.Observable debounceWith
1262
1282
  */
1263
- export function debounceWith_<E, A, E1>(
1264
- fa: Observable<E, A>,
1265
- durationSelector: (value: A) => ObservableInput<E1, any>,
1266
- ): Observable<E | E1, A> {
1283
+ export function debounceWith_<R, E, A, R1, E1>(
1284
+ fa: Observable<R, E, A>,
1285
+ durationSelector: (value: A) => ObservableInput<R1, E1, any>,
1286
+ ): Observable<R | R1, E | E1, A> {
1267
1287
  return fa.operate((source, subscriber) => {
1268
1288
  let lastValue: Maybe<A> = Nothing();
1269
1289
  let durationSubscriber: Subscriber<E1, any> | null = null;
@@ -1302,11 +1322,11 @@ export function debounceWith_<E, A, E1>(
1302
1322
  /**
1303
1323
  * @tsplus fluent fncts.observable.Observable debounce
1304
1324
  */
1305
- export function debounce_<E, A>(
1306
- fa: Observable<E, A>,
1325
+ export function debounce_<R, E, A>(
1326
+ fa: Observable<R, E, A>,
1307
1327
  dueTime: number,
1308
1328
  scheduler: SchedulerLike = asyncScheduler,
1309
- ): Observable<E, A> {
1329
+ ): Observable<R, E, A> {
1310
1330
  return fa.operate((source, subscriber) => {
1311
1331
  let activeTask: Subscription | null = null;
1312
1332
  let lastValue: A | null = null;
@@ -1359,7 +1379,7 @@ export function debounce_<E, A>(
1359
1379
  /**
1360
1380
  * @tsplus getter fncts.observable.Observable either
1361
1381
  */
1362
- export function either<E, A>(fa: Observable<E, A>): Observable<never, Either<E, A>> {
1382
+ export function either<R, E, A>(fa: Observable<R, E, A>): Observable<R, never, Either<E, A>> {
1363
1383
  return fa.operate((source, subscriber) => {
1364
1384
  source.subscribe(
1365
1385
  operatorSubscriber(subscriber, {
@@ -1380,31 +1400,31 @@ export function either<E, A>(fa: Observable<E, A>): Observable<never, Either<E,
1380
1400
  /**
1381
1401
  * @tsplus fluent fncts.observable.Observable delayWithIndex
1382
1402
  */
1383
- export function delayWithIndex<E, A, E1>(
1384
- fa: Observable<E, A>,
1385
- f: (index: number, value: A) => Observable<E1, any>,
1386
- ): Observable<E | E1, A> {
1403
+ export function delayWithIndex<R, E, A, R1, E1>(
1404
+ fa: Observable<R, E, A>,
1405
+ f: (index: number, value: A) => Observable<R1, E1, any>,
1406
+ ): Observable<R | R1, E | E1, A> {
1387
1407
  return fa.mergeMapWithIndex((i, a) => f(i, a).take(1).as(a));
1388
1408
  }
1389
1409
 
1390
1410
  /**
1391
1411
  * @tsplus fluent fncts.observable.Observable delayWith
1392
1412
  */
1393
- export function delayWith_<E, A, E1>(
1394
- fa: Observable<E, A>,
1395
- f: (value: A) => Observable<E1, any>,
1396
- ): Observable<E | E1, A> {
1413
+ export function delayWith_<R, E, A, R1, E1>(
1414
+ fa: Observable<R, E, A>,
1415
+ f: (value: A) => Observable<R1, E1, any>,
1416
+ ): Observable<R | R1, E | E1, A> {
1397
1417
  return fa.delayWithIndex((_, a) => f(a));
1398
1418
  }
1399
1419
 
1400
1420
  /**
1401
1421
  * @tsplus fluent fncts.observable.Observable delay
1402
1422
  */
1403
- export function delay_<E, A>(
1404
- fa: Observable<E, A>,
1423
+ export function delay_<R, E, A>(
1424
+ fa: Observable<R, E, A>,
1405
1425
  due: number | Date,
1406
1426
  scheduler: SchedulerLike = asyncScheduler,
1407
- ): Observable<E, A> {
1427
+ ): Observable<R, E, A> {
1408
1428
  const duration = timer(due, scheduler);
1409
1429
  return delayWith_(fa, () => duration);
1410
1430
  }
@@ -1412,7 +1432,7 @@ export function delay_<E, A>(
1412
1432
  /**
1413
1433
  * @tsplus getter fncts.observable.Observable dematerialize
1414
1434
  */
1415
- export function dematerialize<E, E1, A>(fa: Observable<E, Notification<E1, A>>): Observable<E | E1, A> {
1435
+ export function dematerialize<R, E, E1, A>(fa: Observable<R, E, Notification<E1, A>>): Observable<R, E | E1, A> {
1416
1436
  return fa.operate((source, subscriber) => {
1417
1437
  source.subscribe(operatorSubscriber(subscriber, { next: (notification) => notification.observe(subscriber) }));
1418
1438
  });
@@ -1421,7 +1441,7 @@ export function dematerialize<E, E1, A>(fa: Observable<E, Notification<E1, A>>):
1421
1441
  /**
1422
1442
  * @tsplus fluent fncts.observable.Observable ensuring
1423
1443
  */
1424
- export function ensuring_<E, A>(fa: Observable<E, A>, finalizer: () => void): Observable<E, A> {
1444
+ export function ensuring_<R, E, A>(fa: Observable<R, E, A>, finalizer: () => void): Observable<R, E, A> {
1425
1445
  return fa.operate((source, subscriber) => {
1426
1446
  source.subscribe(subscriber);
1427
1447
  subscriber.add(finalizer);
@@ -1431,7 +1451,9 @@ export function ensuring_<E, A>(fa: Observable<E, A>, finalizer: () => void): Ob
1431
1451
  /**
1432
1452
  * @tsplus getter fncts.observable.Observable exhaustAll
1433
1453
  */
1434
- export function exhaustAll<E, E1, A>(ffa: Observable<E, ObservableInput<E1, A>>): Observable<E | E1, A> {
1454
+ export function exhaustAll<R, E, R1, E1, A>(
1455
+ ffa: Observable<R, E, ObservableInput<R1, E1, A>>,
1456
+ ): Observable<R | R1, E | E1, A> {
1435
1457
  return ffa.operate((source, subscriber) => {
1436
1458
  let isComplete = false;
1437
1459
  let innerSub: Subscription | null = null;
@@ -1461,10 +1483,10 @@ export function exhaustAll<E, E1, A>(ffa: Observable<E, ObservableInput<E1, A>>)
1461
1483
  /**
1462
1484
  * @tsplus fluent fncts.observable.Observable exhaustMapWithIndex
1463
1485
  */
1464
- export function exhaustMapWithIndex<E, A, E1, B>(
1465
- self: Observable<E, A>,
1466
- f: (i: number, a: A) => ObservableInput<E1, B>,
1467
- ): Observable<E | E1, B> {
1486
+ export function exhaustMapWithIndex<R, E, A, R1, E1, B>(
1487
+ self: Observable<R, E, A>,
1488
+ f: (i: number, a: A) => ObservableInput<R1, E1, B>,
1489
+ ): Observable<R | R1, E | E1, B> {
1468
1490
  return self.operate((source, subscriber) => {
1469
1491
  let index = 0;
1470
1492
  let innerSub: Subscriber<E1, B> | null = null;
@@ -1494,21 +1516,21 @@ export function exhaustMapWithIndex<E, A, E1, B>(
1494
1516
  /**
1495
1517
  * @tsplus fluent fncts.observable.Observable exhaustMap
1496
1518
  */
1497
- export function exhaustMap_<E, A, E1, B>(
1498
- self: Observable<E, A>,
1499
- f: (a: A) => ObservableInput<E1, B>,
1500
- ): Observable<E | E1, B> {
1519
+ export function exhaustMap_<R, E, A, R1, E1, B>(
1520
+ self: Observable<R, E, A>,
1521
+ f: (a: A) => ObservableInput<R1, E1, B>,
1522
+ ): Observable<R | R1, E | E1, B> {
1501
1523
  return self.exhaustMapWithIndex((_, a) => f(a));
1502
1524
  }
1503
1525
 
1504
1526
  /**
1505
1527
  * @tsplus fluent fncts.observable.Observable expandWithIndex
1506
1528
  */
1507
- export function expandWithIndex<E, A, E1, B>(
1508
- fa: Observable<E, A>,
1509
- f: (i: number, a: A) => ObservableInput<E1, B>,
1529
+ export function expandWithIndex<R, E, A, R1, E1, B>(
1530
+ fa: Observable<R, E, A>,
1531
+ f: (i: number, a: A) => ObservableInput<R1, E1, B>,
1510
1532
  concurrent = Infinity,
1511
- ): Observable<E | E1, B> {
1533
+ ): Observable<R | R1, E | E1, B> {
1512
1534
  // eslint-disable-next-line no-param-reassign
1513
1535
  concurrent = (concurrent || 0) < 1 ? Infinity : concurrent;
1514
1536
  return fa.operate((source, subscriber) => mergeInternal(source, subscriber, f, concurrent, undefined, true));
@@ -1517,68 +1539,71 @@ export function expandWithIndex<E, A, E1, B>(
1517
1539
  /**
1518
1540
  * @tsplus fluent fncts.observable.Observable expand
1519
1541
  */
1520
- export function expand_<E, A, E1, B>(
1521
- fa: Observable<E, A>,
1522
- f: (a: A) => ObservableInput<E1, B>,
1542
+ export function expand_<R, E, A, R1, E1, B>(
1543
+ fa: Observable<R, E, A>,
1544
+ f: (a: A) => ObservableInput<R1, E1, B>,
1523
1545
  concurrent = Infinity,
1524
- ): Observable<E | E1, B> {
1546
+ ): Observable<R | R1, E | E1, B> {
1525
1547
  return fa.expandWithIndex((_, a) => f(a), concurrent);
1526
1548
  }
1527
1549
 
1528
1550
  /**
1529
1551
  * @tsplus fluent fncts.observable.Observable findWithIndex
1530
1552
  */
1531
- export function findWithIndex<E, A, B extends A>(
1532
- fa: Observable<E, A>,
1553
+ export function findWithIndex<R, E, A, B extends A>(
1554
+ fa: Observable<R, E, A>,
1533
1555
  refinement: RefinementWithIndex<number, A, B>,
1534
- ): Observable<E, Maybe<B>>;
1535
- export function findWithIndex<E, A>(
1536
- fa: Observable<E, A>,
1556
+ ): Observable<R, E, Maybe<B>>;
1557
+ export function findWithIndex<R, E, A>(
1558
+ fa: Observable<R, E, A>,
1537
1559
  predicate: PredicateWithIndex<number, A>,
1538
- ): Observable<E, Maybe<A>>;
1539
- export function findWithIndex<E, A>(
1540
- fa: Observable<E, A>,
1560
+ ): Observable<R, E, Maybe<A>>;
1561
+ export function findWithIndex<R, E, A>(
1562
+ fa: Observable<R, E, A>,
1541
1563
  predicate: PredicateWithIndex<number, A>,
1542
- ): Observable<E, Maybe<A>> {
1564
+ ): Observable<R, E, Maybe<A>> {
1543
1565
  return fa.operate(findInternal(predicate, "value"));
1544
1566
  }
1545
1567
 
1546
1568
  /**
1547
1569
  * @tsplus fluent fncts.observable.Observable find
1548
1570
  */
1549
- export function find_<E, A, B extends A>(fa: Observable<E, A>, refinement: Refinement<A, B>): Observable<E, Maybe<B>>;
1550
- export function find_<E, A>(fa: Observable<E, A>, predicate: Predicate<A>): Observable<E, Maybe<A>>;
1551
- export function find_<E, A>(fa: Observable<E, A>, predicate: Predicate<A>): Observable<E, Maybe<A>> {
1571
+ export function find_<R, E, A, B extends A>(
1572
+ fa: Observable<R, E, A>,
1573
+ refinement: Refinement<A, B>,
1574
+ ): Observable<R, E, Maybe<B>>;
1575
+ export function find_<R, E, A>(fa: Observable<R, E, A>, predicate: Predicate<A>): Observable<R, E, Maybe<A>>;
1576
+ export function find_<R, E, A>(fa: Observable<R, E, A>, predicate: Predicate<A>): Observable<R, E, Maybe<A>> {
1552
1577
  return fa.findWithIndex((_, a) => predicate(a));
1553
1578
  }
1554
1579
 
1555
1580
  /**
1556
1581
  * @tsplus fluent fncts.observable.Observable findIndexWithIndex
1557
1582
  */
1558
- export function findIndexWithIndex<E, A, B extends A>(
1559
- fa: Observable<E, A>,
1583
+ export function findIndexWithIndex<R, E, A, B extends A>(
1584
+ fa: Observable<R, E, A>,
1560
1585
  refinement: RefinementWithIndex<number, A, B>,
1561
- ): Observable<E, number>;
1562
- export function findIndexWithIndex<E, A>(
1563
- fa: Observable<E, A>,
1586
+ ): Observable<R, E, number>;
1587
+ export function findIndexWithIndex<R, E, A>(
1588
+ fa: Observable<R, E, A>,
1564
1589
  predicate: PredicateWithIndex<number, A>,
1565
- ): Observable<E, number>;
1566
- export function findIndexWithIndex<E, A>(
1567
- fa: Observable<E, A>,
1590
+ ): Observable<R, E, number>;
1591
+ export function findIndexWithIndex<R, E, A>(
1592
+ fa: Observable<R, E, A>,
1568
1593
  predicate: PredicateWithIndex<number, A>,
1569
- ): Observable<E, number> {
1594
+ ): Observable<R, E, number> {
1570
1595
  return fa.operate(findInternal(predicate, "index"));
1571
1596
  }
1572
1597
 
1573
1598
  /**
1574
1599
  * @tsplus fluent fncts.observable.Observable findIndex
1575
1600
  */
1576
- export function findIndex_<E, A, B extends A>(
1577
- fa: Observable<E, A>,
1601
+ export function findIndex_<R, E, A, B extends A>(
1602
+ fa: Observable<R, E, A>,
1578
1603
  refinement: Refinement<A, B>,
1579
- ): Observable<E, number>;
1580
- export function findIndex_<E, A>(fa: Observable<E, A>, predicate: Predicate<A>): Observable<E, number>;
1581
- export function findIndex_<E, A>(fa: Observable<E, A>, predicate: Predicate<A>): Observable<E, number> {
1604
+ ): Observable<R, E, number>;
1605
+ export function findIndex_<R, E, A>(fa: Observable<R, E, A>, predicate: Predicate<A>): Observable<R, E, number>;
1606
+ export function findIndex_<R, E, A>(fa: Observable<R, E, A>, predicate: Predicate<A>): Observable<R, E, number> {
1582
1607
  return findIndexWithIndex(fa, (_, a) => predicate(a));
1583
1608
  }
1584
1609
 
@@ -1587,11 +1612,19 @@ export function findIndex_<E, A>(fa: Observable<E, A>, predicate: Predicate<A>):
1587
1612
  */
1588
1613
  export function forkJoin<S extends Record<string, ObservableInput<any, any>>>(
1589
1614
  sources: S,
1590
- ): Observable<Observable.ErrorOf<S[keyof S]>, { [K in keyof S]: Observable.TypeOf<S[K]> }>;
1615
+ ): Observable<
1616
+ Observable.EnvironmentOf<S[keyof S]>,
1617
+ Observable.ErrorOf<S[keyof S]>,
1618
+ { [K in keyof S]: Observable.TypeOf<S[K]> }
1619
+ >;
1591
1620
  export function forkJoin<A extends ReadonlyArray<ObservableInput<any, any>>>(
1592
1621
  ...sources: A
1593
- ): Observable<Observable.ErrorOf<A[number]>, { [K in keyof A]: Observable.TypeOf<A[K]> }>;
1594
- export function forkJoin(...args: any[]): Observable<any, any> {
1622
+ ): Observable<
1623
+ Observable.EnvironmentOf<A[number]>,
1624
+ Observable.ErrorOf<A[number]>,
1625
+ { [K in keyof A]: Observable.TypeOf<A[K]> }
1626
+ >;
1627
+ export function forkJoin(...args: any[]): Observable<any, any, any> {
1595
1628
  const { args: sources, keys } = arrayOrObject(args);
1596
1629
  return new Observable((s) => {
1597
1630
  const length = sources.length;
@@ -1637,7 +1670,7 @@ export function forkJoin(...args: any[]): Observable<any, any> {
1637
1670
  /**
1638
1671
  * @tsplus getter fncts.observable.Observable ignore
1639
1672
  */
1640
- export function ignore<E, A>(fa: Observable<E, A>): Observable<E, never> {
1673
+ export function ignore<R, E, A>(fa: Observable<R, E, A>): Observable<R, E, never> {
1641
1674
  return fa.operate((source, subscriber) => {
1642
1675
  source.subscribe(
1643
1676
  operatorSubscriber(subscriber, {
@@ -1650,7 +1683,7 @@ export function ignore<E, A>(fa: Observable<E, A>): Observable<E, never> {
1650
1683
  /**
1651
1684
  * @tsplus getter fncts.observable.Observable isEmpty
1652
1685
  */
1653
- export function isEmpty<E, A>(fa: Observable<E, A>): Observable<E, boolean> {
1686
+ export function isEmpty<R, E, A>(fa: Observable<R, E, A>): Observable<R, E, boolean> {
1654
1687
  return fa.operate((source, subscriber) => {
1655
1688
  source.subscribe(
1656
1689
  operatorSubscriber(subscriber, {
@@ -1670,7 +1703,7 @@ export function isEmpty<E, A>(fa: Observable<E, A>): Observable<E, boolean> {
1670
1703
  /**
1671
1704
  * @tsplus getter fncts.observable.Observable materialize
1672
1705
  */
1673
- export function materialize<E, A>(fa: Observable<E, A>): Observable<never, Notification<E, A>> {
1706
+ export function materialize<R, E, A>(fa: Observable<R, E, A>): Observable<R, never, Notification<E, A>> {
1674
1707
  return fa.operate((source, subscriber) => {
1675
1708
  source.subscribe(
1676
1709
  operatorSubscriber(subscriber, {
@@ -1691,22 +1724,22 @@ export function materialize<E, A>(fa: Observable<E, A>): Observable<never, Notif
1691
1724
  /**
1692
1725
  * @tsplus fluent fncts.observable.Observable mergeAll
1693
1726
  */
1694
- export function mergeAll_<E, E1, A>(
1695
- self: Observable<E, ObservableInput<E1, A>>,
1727
+ export function mergeAll_<R, E, R1, E1, A>(
1728
+ self: Observable<R, E, ObservableInput<R1, E1, A>>,
1696
1729
  concurrent = Infinity,
1697
- ): Observable<E | E1, A> {
1730
+ ): Observable<R | R1, E | E1, A> {
1698
1731
  return self.mergeMap(Function.identity, concurrent);
1699
1732
  }
1700
1733
 
1701
1734
  /**
1702
1735
  * @tsplus fluent fncts.observable.Observable mergeScanWithIndex
1703
1736
  */
1704
- export function mergeScanWithIndex<E, A, E1, B>(
1705
- fa: Observable<E, A>,
1737
+ export function mergeScanWithIndex<R, E, A, R1, E1, B>(
1738
+ fa: Observable<R, E, A>,
1706
1739
  initial: B,
1707
- f: (index: number, acc: B, value: A) => ObservableInput<E1, B>,
1740
+ f: (index: number, acc: B, value: A) => ObservableInput<R1, E1, B>,
1708
1741
  concurrent = Infinity,
1709
- ): Observable<E | E1, B> {
1742
+ ): Observable<R | R1, E | E1, B> {
1710
1743
  return fa.operate((source, subscriber) => {
1711
1744
  let state = initial;
1712
1745
  return mergeInternal(
@@ -1727,25 +1760,33 @@ export function mergeScanWithIndex<E, A, E1, B>(
1727
1760
  /**
1728
1761
  * @tsplus fluent fncts.observable.Observable mergeScan
1729
1762
  */
1730
- export function mergeScan_<E, A, E1, B>(
1731
- fa: Observable<E, A>,
1763
+ export function mergeScan_<R, E, A, R1, E1, B>(
1764
+ fa: Observable<R, E, A>,
1732
1765
  initial: B,
1733
- f: (acc: B, value: A) => ObservableInput<E1, B>,
1766
+ f: (acc: B, value: A) => ObservableInput<R1, E1, B>,
1734
1767
  concurrent = Infinity,
1735
- ): Observable<E | E1, B> {
1768
+ ): Observable<R | R1, E | E1, B> {
1736
1769
  return fa.mergeScanWithIndex(initial, (_, b, a) => f(b, a), concurrent);
1737
1770
  }
1738
1771
 
1739
- export function onErrorResumeNext<E, A, O extends ReadonlyArray<ObservableInput<any, any>>>(
1740
- fa: Observable<E, A>,
1772
+ export function onErrorResumeNext<R, E, A, O extends ReadonlyArray<ObservableInput<any, any>>>(
1773
+ fa: Observable<R, E, A>,
1741
1774
  ...sources: O
1742
- ): Observable<E | Observable.ErrorOf<O[number]>, A | Observable.TypeOf<O[number]>> {
1775
+ ): Observable<
1776
+ R | Observable.EnvironmentOf<O[number]>,
1777
+ E | Observable.ErrorOf<O[number]>,
1778
+ A | Observable.TypeOf<O[number]>
1779
+ > {
1743
1780
  return fa.operate((source, subscriber) => {
1744
1781
  const remaining = [source, ...sources];
1745
1782
  const subscribeNext = () => {
1746
1783
  if (!subscriber.closed) {
1747
1784
  if (remaining.length > 0) {
1748
- let nextSource: Observable<E | Observable.ErrorOf<O[number]>, A | Observable.TypeOf<O[number]>>;
1785
+ let nextSource: Observable<
1786
+ R | Observable.EnvironmentOf<O[number]>,
1787
+ E | Observable.ErrorOf<O[number]>,
1788
+ A | Observable.TypeOf<O[number]>
1789
+ >;
1749
1790
  try {
1750
1791
  nextSource = from(remaining.shift()!);
1751
1792
  } catch (err) {
@@ -1767,7 +1808,7 @@ export function onErrorResumeNext<E, A, O extends ReadonlyArray<ObservableInput<
1767
1808
  /**
1768
1809
  * @tsplus fluent fncts.observable.Observable onEmpty
1769
1810
  */
1770
- export function onEmpty_<E, A, B>(fa: Observable<E, A>, f: Lazy<B>): Observable<E, A | B> {
1811
+ export function onEmpty_<R, E, A, B>(fa: Observable<R, E, A>, f: Lazy<B>): Observable<R, E, A | B> {
1771
1812
  return fa.operate((source, subscriber) => {
1772
1813
  let hasValue = false;
1773
1814
  source.subscribe(
@@ -1790,7 +1831,7 @@ export function onEmpty_<E, A, B>(fa: Observable<E, A>, f: Lazy<B>): Observable<
1790
1831
  /**
1791
1832
  * @tsplus fluent fncts.observable.Observable repeat
1792
1833
  */
1793
- export function repeat_<E, A>(fa: Observable<E, A>, count = Infinity): Observable<E, A> {
1834
+ export function repeat_<R, E, A>(fa: Observable<R, E, A>, count = Infinity): Observable<R, E, A> {
1794
1835
  return count <= 0
1795
1836
  ? empty()
1796
1837
  : fa.operate((source, subscriber) => {
@@ -1834,9 +1875,12 @@ export interface RetryConfig {
1834
1875
  /**
1835
1876
  * @tsplus fluent fncts.observable.Observable retry
1836
1877
  */
1837
- export function retry_<E, A>(fa: Observable<E, A>, count?: number): Observable<E, A>;
1838
- export function retry_<E, A>(fa: Observable<E, A>, config: RetryConfig): Observable<E, A>;
1839
- export function retry_<E, A>(fa: Observable<E, A>, configOrCount: number | RetryConfig = Infinity): Observable<E, A> {
1878
+ export function retry_<R, E, A>(fa: Observable<R, E, A>, count?: number): Observable<R, E, A>;
1879
+ export function retry_<R, E, A>(fa: Observable<R, E, A>, config: RetryConfig): Observable<R, E, A>;
1880
+ export function retry_<R, E, A>(
1881
+ fa: Observable<R, E, A>,
1882
+ configOrCount: number | RetryConfig = Infinity,
1883
+ ): Observable<R, E, A> {
1840
1884
  let config: RetryConfig;
1841
1885
  if (configOrCount && typeof configOrCount === "object") {
1842
1886
  config = configOrCount;
@@ -1891,7 +1935,10 @@ export function retry_<E, A>(fa: Observable<E, A>, configOrCount: number | Retry
1891
1935
  /**
1892
1936
  * @tsplus fluent fncts.observable.Observable sample
1893
1937
  */
1894
- export function sample_<E, A, E1>(fa: Observable<E, A>, notifier: Observable<E1, any>): Observable<E | E1, A> {
1938
+ export function sample_<R, E, A, R1, E1>(
1939
+ fa: Observable<R, E, A>,
1940
+ notifier: Observable<R1, E1, any>,
1941
+ ): Observable<R | R1, E | E1, A> {
1895
1942
  return fa.operate((source, subscriber) => {
1896
1943
  let hasValue = false;
1897
1944
  let lastValue: A | null = null;
@@ -1918,43 +1965,71 @@ export function sample_<E, A, E1>(fa: Observable<E, A>, notifier: Observable<E1,
1918
1965
  /**
1919
1966
  * @tsplus fluent fncts.observable.Observable sampleTime
1920
1967
  */
1921
- export function sampleTime_<E, A>(
1922
- fa: Observable<E, A>,
1968
+ export function sampleTime_<R, E, A>(
1969
+ fa: Observable<R, E, A>,
1923
1970
  period: number,
1924
1971
  scheduler: SchedulerLike = asyncScheduler,
1925
- ): Observable<E, A> {
1972
+ ): Observable<R, E, A> {
1926
1973
  return sample_(fa, interval(period, scheduler));
1927
1974
  }
1928
1975
 
1929
1976
  /**
1930
1977
  * @tsplus fluent fncts.observable.Observable scanLeftWithIndex
1931
1978
  */
1932
- export function scanLeftWithIndex<E, A, B>(
1933
- fa: Observable<E, A>,
1979
+ export function scanLeftWithIndex<R, E, A, B>(
1980
+ fa: Observable<R, E, A>,
1934
1981
  initial: B,
1935
1982
  f: (index: number, acc: B, value: A) => B,
1936
- ): Observable<E, B> {
1983
+ ): Observable<R, E, B> {
1937
1984
  return fa.operate(scanInternal(f, initial, true, true));
1938
1985
  }
1939
1986
 
1940
1987
  /**
1941
1988
  * @tsplus fluent fncts.observable.Observable scanLeft
1942
1989
  */
1943
- export function scanLeft<E, A, B>(fa: Observable<E, A>, initial: B, f: (acc: B, value: A) => B): Observable<E, B> {
1990
+ export function scanLeft<R, E, A, B>(
1991
+ fa: Observable<R, E, A>,
1992
+ initial: B,
1993
+ f: (acc: B, value: A) => B,
1994
+ ): Observable<R, E, B> {
1944
1995
  return fa.scanLeftWithIndex(initial, (_, b, a) => f(b, a));
1945
1996
  }
1946
1997
 
1998
+ /**
1999
+ * @tsplus static fncts.observable.ObservableOps service
2000
+ */
2001
+ export function service<S>(/** @tsplus auto */ tag: Tag<S>): Observable<S, never, S> {
2002
+ return Observable.serviceWithObservable((service) => Observable.of(service), tag);
2003
+ }
2004
+
2005
+ /**
2006
+ * @tsplus static fncts.observable.ObservableOps serviceWith
2007
+ */
2008
+ export function serviceWith<S, A>(f: (service: S) => A, /** @tsplus auto */ tag: Tag<S>): Observable<S, never, A> {
2009
+ return Observable.serviceWithObservable((service) => Observable.of(f(service)), tag);
2010
+ }
2011
+
2012
+ /**
2013
+ * @tsplus static fncts.observable.ObservableOps serviceWithObservable
2014
+ */
2015
+ export function serviceWithObservable<S, R, E, A>(
2016
+ f: (service: S) => Observable<R, E, A>,
2017
+ /** @tsplus auto */ tag: Tag<S>,
2018
+ ): Observable<S | R, E, A> {
2019
+ return Observable.environmentWithObservable((environment) => f(environment.unsafeGet(tag)));
2020
+ }
2021
+
1947
2022
  /**
1948
2023
  * @tsplus fluent fncts.observable.Observable skip
1949
2024
  */
1950
- export function skip_<E, A>(fa: Observable<E, A>, count: number): Observable<E, A> {
2025
+ export function skip_<R, E, A>(fa: Observable<R, E, A>, count: number): Observable<R, E, A> {
1951
2026
  return fa.filterWithIndex((index, _) => count <= index);
1952
2027
  }
1953
2028
 
1954
2029
  /**
1955
2030
  * @tsplus fluent fncts.observable.Observable skipLast
1956
2031
  */
1957
- export function skipLast_<E, A>(fa: Observable<E, A>, skipCount: number): Observable<E, A> {
2032
+ export function skipLast_<R, E, A>(fa: Observable<R, E, A>, skipCount: number): Observable<R, E, A> {
1958
2033
  return skipCount <= 0
1959
2034
  ? fa
1960
2035
  : fa.operate((source, subscriber) => {
@@ -1985,7 +2060,10 @@ export function skipLast_<E, A>(fa: Observable<E, A>, skipCount: number): Observ
1985
2060
  /**
1986
2061
  * @tsplus fluent fncts.observable.Observable skipUntil
1987
2062
  */
1988
- export function skipUntil_<E, A, E1>(fa: Observable<E, A>, notifier: Observable<E1, any>): Observable<E | E1, A> {
2063
+ export function skipUntil_<R, E, A, R1, E1>(
2064
+ fa: Observable<R, E, A>,
2065
+ notifier: Observable<R1, E1, any>,
2066
+ ): Observable<R | R1, E | E1, A> {
1989
2067
  return fa.operate((source, subscriber) => {
1990
2068
  let taking = false;
1991
2069
  const skipSubscriber = operatorSubscriber(subscriber, {
@@ -2009,7 +2087,10 @@ export function skipUntil_<E, A, E1>(fa: Observable<E, A>, notifier: Observable<
2009
2087
  /**
2010
2088
  * @tsplus fluent fncts.observable.Observable skipWhile
2011
2089
  */
2012
- export function skipWhile_<E, A>(fa: Observable<E, A>, predicate: PredicateWithIndex<number, A>): Observable<E, A> {
2090
+ export function skipWhile_<R, E, A>(
2091
+ fa: Observable<R, E, A>,
2092
+ predicate: PredicateWithIndex<number, A>,
2093
+ ): Observable<R, E, A> {
2013
2094
  return fa.operate((source, subscriber) => {
2014
2095
  let taking = false;
2015
2096
  let index = 0;
@@ -2024,11 +2105,11 @@ export function skipWhile_<E, A>(fa: Observable<E, A>, predicate: PredicateWithI
2024
2105
  /**
2025
2106
  * @tsplus fluent fncts.observable.Observable startWith
2026
2107
  */
2027
- export function startWith_<E, A, B extends ReadonlyArray<unknown>>(
2028
- fa: Observable<E, A>,
2108
+ export function startWith_<R, E, A, B extends ReadonlyArray<unknown>>(
2109
+ fa: Observable<R, E, A>,
2029
2110
  ...values: B
2030
- ): Observable<E, A | B[number]> {
2031
- return operate_(fa, (source, subscriber) => {
2111
+ ): Observable<R, E, A | B[number]> {
2112
+ return fa.operate((source, subscriber) => {
2032
2113
  // @ts-expect-error
2033
2114
  source.concat(values).subscribe(subscriber);
2034
2115
  });
@@ -2037,7 +2118,11 @@ export function startWith_<E, A, B extends ReadonlyArray<unknown>>(
2037
2118
  /**
2038
2119
  * @tsplus fluent fncts.observable.Observable subscribeOn
2039
2120
  */
2040
- export function subscribeOn_<E, A>(fa: Observable<E, A>, scheduler: SchedulerLike, delay = 0): Observable<E, A> {
2121
+ export function subscribeOn_<R, E, A>(
2122
+ fa: Observable<R, E, A>,
2123
+ scheduler: SchedulerLike,
2124
+ delay = 0,
2125
+ ): Observable<R, E, A> {
2041
2126
  return fa.operate((source, subscriber) => {
2042
2127
  subscriber.add(scheduler.schedule(() => source.subscribe(subscriber), delay));
2043
2128
  });
@@ -2046,17 +2131,19 @@ export function subscribeOn_<E, A>(fa: Observable<E, A>, scheduler: SchedulerLik
2046
2131
  /**
2047
2132
  * @tsplus getter fncts.observable.Observable switchAll
2048
2133
  */
2049
- export function switchAll<E, E1, A>(ffa: Observable<E, ObservableInput<E1, A>>): Observable<E | E1, A> {
2134
+ export function switchAll<R, E, R1, E1, A>(
2135
+ ffa: Observable<R, E, ObservableInput<R1, E1, A>>,
2136
+ ): Observable<R | R1, E | E1, A> {
2050
2137
  return switchMap_(ffa, Function.identity);
2051
2138
  }
2052
2139
 
2053
2140
  /**
2054
2141
  * @tsplus fluent fncts.observable.Observable switchMapWithIndex
2055
2142
  */
2056
- export function switchMapWithIndex<E, A, E1, B>(
2057
- fa: Observable<E, A>,
2058
- f: (index: number, value: A) => ObservableInput<E1, B>,
2059
- ): Observable<E | E1, B> {
2143
+ export function switchMapWithIndex<R, E, A, R1, E1, B>(
2144
+ fa: Observable<R, E, A>,
2145
+ f: (index: number, value: A) => ObservableInput<R1, E1, B>,
2146
+ ): Observable<R | R1, E | E1, B> {
2060
2147
  return operate_(fa, (source, subscriber) => {
2061
2148
  let innerSubscriber: Subscriber<E | E1, B> | null = null;
2062
2149
  let index = 0;
@@ -2094,21 +2181,21 @@ export function switchMapWithIndex<E, A, E1, B>(
2094
2181
  /**
2095
2182
  * @tsplus fluent fncts.observable.Observable switchMap
2096
2183
  */
2097
- export function switchMap_<E, A, E1, B>(
2098
- fa: Observable<E, A>,
2099
- f: (value: A) => ObservableInput<E1, B>,
2100
- ): Observable<E | E1, B> {
2184
+ export function switchMap_<R, E, A, R1, E1, B>(
2185
+ fa: Observable<R, E, A>,
2186
+ f: (value: A) => ObservableInput<R1, E1, B>,
2187
+ ): Observable<R | R1, E | E1, B> {
2101
2188
  return fa.switchMapWithIndex((_, a) => f(a));
2102
2189
  }
2103
2190
 
2104
2191
  /**
2105
2192
  * @tsplus fluent fncts.observable.Observable switchScanWithIndex
2106
2193
  */
2107
- export function switchScanWithIndex<E, A, E1, B>(
2108
- fa: Observable<E, A>,
2194
+ export function switchScanWithIndex<R, E, A, R1, E1, B>(
2195
+ fa: Observable<R, E, A>,
2109
2196
  initial: B,
2110
- f: (index: number, acc: B, value: A) => ObservableInput<E1, B>,
2111
- ): Observable<E | E1, B> {
2197
+ f: (index: number, acc: B, value: A) => ObservableInput<R1, E1, B>,
2198
+ ): Observable<R | R1, E | E1, B> {
2112
2199
  return operate_(fa, (source, subscriber) => {
2113
2200
  let state = initial;
2114
2201
  switchMapWithIndex(source, (index, value) => from(f(index, state, value)).map((b) => ((state = b), b))).subscribe(
@@ -2123,18 +2210,18 @@ export function switchScanWithIndex<E, A, E1, B>(
2123
2210
  /**
2124
2211
  * @tsplus fluent fncts.observable.Observable switchScan
2125
2212
  */
2126
- export function switchScan_<E, A, E1, B>(
2127
- fa: Observable<E, A>,
2213
+ export function switchScan_<R, E, A, R1, E1, B>(
2214
+ fa: Observable<R, E, A>,
2128
2215
  initial: B,
2129
- f: (acc: B, value: A) => ObservableInput<E1, B>,
2130
- ): Observable<E | E1, B> {
2216
+ f: (acc: B, value: A) => ObservableInput<R1, E1, B>,
2217
+ ): Observable<R | R1, E | E1, B> {
2131
2218
  return fa.switchScanWithIndex(initial, (_, b, a) => f(b, a));
2132
2219
  }
2133
2220
 
2134
2221
  /**
2135
2222
  * @tsplus fluent fncts.observable.Observable take
2136
2223
  */
2137
- export function take_<E, A>(fa: Observable<E, A>, count: number): Observable<E, A> {
2224
+ export function take_<R, E, A>(fa: Observable<R, E, A>, count: number): Observable<R, E, A> {
2138
2225
  return count <= 0
2139
2226
  ? empty()
2140
2227
  : fa.operate((source, sub) => {
@@ -2157,7 +2244,7 @@ export function take_<E, A>(fa: Observable<E, A>, count: number): Observable<E,
2157
2244
  /**
2158
2245
  * @tsplus fluent fncts.observable.Observable takeLast
2159
2246
  */
2160
- export function takeLast_<E, A>(fa: Observable<E, A>, count: number): Observable<E, A> {
2247
+ export function takeLast_<R, E, A>(fa: Observable<R, E, A>, count: number): Observable<R, E, A> {
2161
2248
  return count <= 0
2162
2249
  ? empty()
2163
2250
  : fa.operate((source, subscriber) => {
@@ -2188,7 +2275,10 @@ export function takeLast_<E, A>(fa: Observable<E, A>, count: number): Observable
2188
2275
  /**
2189
2276
  * @tsplus fluent fncts.observable.Observable takeUntil
2190
2277
  */
2191
- export function takeUntil_<E, A, E1>(fa: Observable<E, A>, notifier: ObservableInput<E1, any>): Observable<E | E1, A> {
2278
+ export function takeUntil_<R, E, A, R1, E1>(
2279
+ fa: Observable<R, E, A>,
2280
+ notifier: ObservableInput<R1, E1, any>,
2281
+ ): Observable<R | R1, E | E1, A> {
2192
2282
  return fa.operate((source, subscriber) => {
2193
2283
  from(notifier).subscribe(operatorSubscriber(subscriber, { next: () => subscriber.complete(), complete: noop }));
2194
2284
  !subscriber.closed && source.subscribe(subscriber);
@@ -2198,21 +2288,21 @@ export function takeUntil_<E, A, E1>(fa: Observable<E, A>, notifier: ObservableI
2198
2288
  /**
2199
2289
  * @tsplus fluent fncts.observable.Observable takeWhileWithIndex
2200
2290
  */
2201
- export function takeWhileWithIndex<E, A, B extends A>(
2202
- fa: Observable<E, A>,
2291
+ export function takeWhileWithIndex<R, E, A, B extends A>(
2292
+ fa: Observable<R, E, A>,
2203
2293
  refinement: RefinementWithIndex<number, A, B>,
2204
2294
  inclusive?: boolean,
2205
- ): Observable<E, B>;
2206
- export function takeWhileWithIndex<E, A>(
2207
- fa: Observable<E, A>,
2295
+ ): Observable<R, E, B>;
2296
+ export function takeWhileWithIndex<R, E, A>(
2297
+ fa: Observable<R, E, A>,
2208
2298
  predicate: PredicateWithIndex<number, A>,
2209
2299
  inclusive?: boolean,
2210
- ): Observable<E, A>;
2211
- export function takeWhileWithIndex<E, A>(
2212
- fa: Observable<E, A>,
2300
+ ): Observable<R, E, A>;
2301
+ export function takeWhileWithIndex<R, E, A>(
2302
+ fa: Observable<R, E, A>,
2213
2303
  predicate: PredicateWithIndex<number, A>,
2214
2304
  inclusive?: boolean,
2215
- ): Observable<E, A> {
2305
+ ): Observable<R, E, A> {
2216
2306
  return fa.operate((source, subscriber) => {
2217
2307
  let index = 0;
2218
2308
  source.subscribe(
@@ -2230,20 +2320,28 @@ export function takeWhileWithIndex<E, A>(
2230
2320
  /**
2231
2321
  * @tsplus fluent fncts.observable.Observable takeWhile
2232
2322
  */
2233
- export function takeWhile_<E, A, B extends A>(
2234
- fa: Observable<E, A>,
2323
+ export function takeWhile_<R, E, A, B extends A>(
2324
+ fa: Observable<R, E, A>,
2235
2325
  refinement: Refinement<A, B>,
2236
2326
  inclusive?: boolean,
2237
- ): Observable<E, B>;
2238
- export function takeWhile_<E, A>(fa: Observable<E, A>, predicate: Predicate<A>, inclusive?: boolean): Observable<E, A>;
2239
- export function takeWhile_<E, A>(fa: Observable<E, A>, predicate: Predicate<A>, inclusive?: boolean): Observable<E, A> {
2327
+ ): Observable<R, E, B>;
2328
+ export function takeWhile_<R, E, A>(
2329
+ fa: Observable<R, E, A>,
2330
+ predicate: Predicate<A>,
2331
+ inclusive?: boolean,
2332
+ ): Observable<R, E, A>;
2333
+ export function takeWhile_<R, E, A>(
2334
+ fa: Observable<R, E, A>,
2335
+ predicate: Predicate<A>,
2336
+ inclusive?: boolean,
2337
+ ): Observable<R, E, A> {
2240
2338
  return fa.takeWhileWithIndex((_, a) => predicate(a), inclusive);
2241
2339
  }
2242
2340
 
2243
2341
  /**
2244
2342
  * @tsplus fluent fncts.observable.Observable tap
2245
2343
  */
2246
- export function tap_<E, A>(fa: Observable<E, A>, observer: Partial<Observer<E, A>>): Observable<E, A> {
2344
+ export function tap_<R, E, A>(fa: Observable<R, E, A>, observer: Partial<Observer<E, A>>): Observable<R, E, A> {
2247
2345
  return fa.operate((source, subscriber) => {
2248
2346
  source.subscribe(
2249
2347
  operatorSubscriber(subscriber, {
@@ -2277,11 +2375,11 @@ export const defaultThrottleConfig: ThrottleConfig = {
2277
2375
  /**
2278
2376
  * @tsplus fluent fncts.observable.Observable throttle
2279
2377
  */
2280
- export function throttle_<E, A, E1>(
2281
- fa: Observable<E, A>,
2282
- durationSelector: (a: A) => ObservableInput<E1, any>,
2378
+ export function throttle_<R, E, A, R1, E1>(
2379
+ fa: Observable<R, E, A>,
2380
+ durationSelector: (a: A) => ObservableInput<R1, E1, any>,
2283
2381
  { leading, trailing }: ThrottleConfig = defaultThrottleConfig,
2284
- ): Observable<E | E1, A> {
2382
+ ): Observable<R | R1, E | E1, A> {
2285
2383
  return fa.operate((source, subscriber) => {
2286
2384
  let sendValue: Maybe<A> = Nothing();
2287
2385
  let throttled: Subscription | null = null;
@@ -2333,22 +2431,22 @@ export function throttle_<E, A, E1>(
2333
2431
  /**
2334
2432
  * @tsplus fluent fncts.observable.Observable throttleTime
2335
2433
  */
2336
- export function throttleTime_<E, A>(
2337
- fa: Observable<E, A>,
2434
+ export function throttleTime_<R, E, A>(
2435
+ fa: Observable<R, E, A>,
2338
2436
  duration: number,
2339
2437
  scheduler: SchedulerLike = asyncScheduler,
2340
2438
  config = defaultThrottleConfig,
2341
- ): Observable<E, A> {
2439
+ ): Observable<R, E, A> {
2342
2440
  const duration$ = timer(duration, scheduler);
2343
2441
  return throttle_(fa, () => duration$, config);
2344
2442
  }
2345
2443
 
2346
- export type TimeoutConfig<A, E, B, M = unknown> = (
2444
+ export type TimeoutConfig<R, E, A, B, M = unknown> = (
2347
2445
  | { readonly each: number; readonly first?: number | Date }
2348
2446
  | { readonly each?: number; readonly first: number | Date }
2349
2447
  ) & {
2350
2448
  readonly scheduler?: SchedulerLike;
2351
- readonly with?: (info: TimeoutInfo<A, M>) => ObservableInput<E, B>;
2449
+ readonly with?: (info: TimeoutInfo<A, M>) => ObservableInput<R, E, B>;
2352
2450
  meta?: M;
2353
2451
  };
2354
2452
 
@@ -2368,25 +2466,25 @@ export class TimeoutError<A, M> extends Error {
2368
2466
  /**
2369
2467
  * @tsplus fluent fncts.observable.Observable timeout
2370
2468
  */
2371
- export function timeout_<E, A, E1, B, M = unknown>(
2372
- fa: Observable<E, A>,
2373
- config: TimeoutConfig<A, E1, B, M> & { readonly with: (info: TimeoutInfo<A, M>) => ObservableInput<E1, B> },
2374
- ): Observable<E | E1, A | B>;
2375
- export function timeout_<E, A, M = unknown>(
2376
- fa: Observable<E, A>,
2377
- config: Omit<TimeoutConfig<A, never, any, M>, "with">,
2378
- ): Observable<E | TimeoutError<A, M>, A>;
2379
- export function timeout_<E, A, E1, B, M = unknown>(
2380
- fa: Observable<E, A>,
2469
+ export function timeout_<R, E, A, R1, E1, B, M = unknown>(
2470
+ fa: Observable<R, E, A>,
2471
+ config: TimeoutConfig<R1, E1, A, B, M> & { readonly with: (info: TimeoutInfo<A, M>) => ObservableInput<R1, E1, B> },
2472
+ ): Observable<R | R1, E | E1, A | B>;
2473
+ export function timeout_<R, E, A, M = unknown>(
2474
+ fa: Observable<R, E, A>,
2475
+ config: Omit<TimeoutConfig<never, never, A, any, M>, "with">,
2476
+ ): Observable<R, E | TimeoutError<A, M>, A>;
2477
+ export function timeout_<R, E, A, R1, E1, B, M = unknown>(
2478
+ fa: Observable<R, E, A>,
2381
2479
  config: any,
2382
- ): Observable<E | E1 | TimeoutError<A, M>, A | B> {
2480
+ ): Observable<R | R1, E | E1 | TimeoutError<A, M>, A | B> {
2383
2481
  const {
2384
2482
  first,
2385
2483
  each,
2386
2484
  with: _with = timeoutError,
2387
2485
  scheduler = asyncScheduler,
2388
2486
  meta = null!,
2389
- } = config as TimeoutConfig<A, E1, B, M>;
2487
+ } = config as TimeoutConfig<R, E1, A, B, M>;
2390
2488
  return operate_(fa, (source, subscriber) => {
2391
2489
  // eslint-disable-next-line prefer-const
2392
2490
  let originalSourceSubscription: Subscription;
@@ -2399,7 +2497,7 @@ export function timeout_<E, A, E1, B, M = unknown>(
2399
2497
  scheduler,
2400
2498
  () => {
2401
2499
  originalSourceSubscription.unsubscribe();
2402
- from<E1 | TimeoutError<A, M>, B>(
2500
+ from<R | R1, E1 | TimeoutError<A, M>, B>(
2403
2501
  _with({
2404
2502
  meta,
2405
2503
  lastValue,
@@ -2436,7 +2534,7 @@ export function timeout_<E, A, E1, B, M = unknown>(
2436
2534
  });
2437
2535
  }
2438
2536
 
2439
- function timeoutError<A, M>(info: TimeoutInfo<A, M>): Observable<TimeoutError<A, M>, never> {
2537
+ function timeoutError<R, A, M>(info: TimeoutInfo<A, M>): Observable<R, TimeoutError<A, M>, never> {
2440
2538
  return fail(new TimeoutError(info));
2441
2539
  }
2442
2540
 
@@ -2447,7 +2545,7 @@ function toArrayAccumulator(arr: any[], value: any) {
2447
2545
  /**
2448
2546
  * @tsplus getter fncts.observable.Observable toArray
2449
2547
  */
2450
- export function toArray<E, A>(fa: Observable<E, A>): Observable<E, ReadonlyArray<A>> {
2548
+ export function toArray<R, E, A>(fa: Observable<R, E, A>): Observable<R, E, ReadonlyArray<A>> {
2451
2549
  return operate_(fa, (source, subscriber) => {
2452
2550
  source.foldLeft([] as A[], toArrayAccumulator).subscribe(subscriber);
2453
2551
  });
@@ -2456,11 +2554,11 @@ export function toArray<E, A>(fa: Observable<E, A>): Observable<E, ReadonlyArray
2456
2554
  /**
2457
2555
  * @tsplus fluent fncts.observable.Observable unique
2458
2556
  */
2459
- export function unique_<E, A, K, E1 = never>(
2460
- fa: Observable<E, A>,
2557
+ export function unique_<R, E, A, K, R1, E1 = never>(
2558
+ fa: Observable<R, E, A>,
2461
2559
  toKey?: (value: A) => K,
2462
- flushes?: Observable<E1, any>,
2463
- ): Observable<E | E1, A> {
2560
+ flushes?: Observable<R1, E1, any>,
2561
+ ): Observable<R | R1, E | E1, A> {
2464
2562
  return operate_(fa, (source, subscriber) => {
2465
2563
  let distinctKeys = HashSet.makeDefault<A | K>();
2466
2564
  source.subscribe(
@@ -2483,23 +2581,26 @@ export function unique_<E, A, K, E1 = never>(
2483
2581
  /**
2484
2582
  * @tsplus fluent fncts.observable.Observable uniqueUntilChanged
2485
2583
  */
2486
- export function uniqueUntilChanged_<E, A, K>(
2487
- fa: Observable<E, A>,
2584
+ export function uniqueUntilChanged_<R, E, A, K>(
2585
+ fa: Observable<R, E, A>,
2488
2586
  E: Eq<K>,
2489
2587
  keySelector: (value: A) => K,
2490
- ): Observable<E, A>;
2491
- export function uniqueUntilChanged_<E, A, K>(
2492
- fa: Observable<E, A>,
2588
+ ): Observable<R, E, A>;
2589
+ export function uniqueUntilChanged_<R, E, A, K>(
2590
+ fa: Observable<R, E, A>,
2493
2591
  equals: (x: K, y: K) => boolean,
2494
2592
  keySelector: (value: A) => K,
2495
- ): Observable<E, A>;
2496
- export function uniqueUntilChanged_<E, A>(fa: Observable<E, A>, E: Eq<A>): Observable<E, A>;
2497
- export function uniqueUntilChanged_<E, A>(fa: Observable<E, A>, equals: (x: A, y: A) => boolean): Observable<E, A>;
2498
- export function uniqueUntilChanged_<E, A, K = A>(
2499
- fa: Observable<E, A>,
2593
+ ): Observable<R, E, A>;
2594
+ export function uniqueUntilChanged_<R, E, A>(fa: Observable<R, E, A>, E: Eq<A>): Observable<R, E, A>;
2595
+ export function uniqueUntilChanged_<R, E, A>(
2596
+ fa: Observable<R, E, A>,
2597
+ equals: (x: A, y: A) => boolean,
2598
+ ): Observable<R, E, A>;
2599
+ export function uniqueUntilChanged_<R, E, A, K = A>(
2600
+ fa: Observable<R, E, A>,
2500
2601
  E: Eq<K> | ((x: K, y: K) => boolean),
2501
2602
  keySelector: (value: A) => K = Function.identity as (_: A) => K,
2502
- ): Observable<E, A> {
2603
+ ): Observable<R, E, A> {
2503
2604
  const compare = "equals" in E ? E.equals : E;
2504
2605
  return fa.operate((source, subscriber) => {
2505
2606
  let previousKey: K;
@@ -2522,34 +2623,28 @@ export function uniqueUntilChanged_<E, A, K = A>(
2522
2623
  /**
2523
2624
  * @tsplus fluent fncts.observable.Observable uniqueUntilKeyChanged
2524
2625
  */
2525
- export function uniqueUntilKeyChanged_<E, A, K extends keyof A>(
2526
- fa: Observable<E, A>,
2626
+ export function uniqueUntilKeyChanged_<R, E, A, K extends keyof A>(
2627
+ fa: Observable<R, E, A>,
2527
2628
  key: K,
2528
2629
  E: Eq<A[K]>,
2529
- ): Observable<E, A>;
2530
- export function uniqueUntilKeyChanged_<E, A, K extends keyof A>(
2531
- fa: Observable<E, A>,
2630
+ ): Observable<R, E, A>;
2631
+ export function uniqueUntilKeyChanged_<R, E, A, K extends keyof A>(
2632
+ fa: Observable<R, E, A>,
2532
2633
  key: K,
2533
2634
  equals: (x: A[K], y: A[K]) => boolean,
2534
- ): Observable<E, A>;
2535
- export function uniqueUntilKeyChanged_<E, A, K extends keyof A>(
2536
- fa: Observable<E, A>,
2635
+ ): Observable<R, E, A>;
2636
+ export function uniqueUntilKeyChanged_<R, E, A, K extends keyof A>(
2637
+ fa: Observable<R, E, A>,
2537
2638
  key: K,
2538
2639
  equals: Eq<A[K]> | ((x: A[K], y: A[K]) => boolean),
2539
- ): Observable<E, A> {
2640
+ ): Observable<R, E, A> {
2540
2641
  const compare = "equals" in equals ? equals.equals : equals;
2541
2642
  return fa.uniqueUntilChanged((x, y) => compare(x[key], y[key]));
2542
2643
  }
2543
2644
 
2544
- /*
2545
- * -------------------------------------------------------------------------------------------------
2546
- * internal
2547
- * -------------------------------------------------------------------------------------------------
2548
- */
2549
-
2550
2645
  function combineLatestInternal(
2551
2646
  subscriber: Subscriber<any, any>,
2552
- observables: ObservableInput<any, any>[],
2647
+ observables: ObservableInput<any, any, any>[],
2553
2648
  scheduler?: SchedulerLike,
2554
2649
  valueTransform: (values: any[]) => any = Function.identity,
2555
2650
  ) {
@@ -2589,7 +2684,7 @@ function combineLatestInternal(
2589
2684
  function findInternal<A>(
2590
2685
  predicate: PredicateWithIndex<number, A>,
2591
2686
  emit: "value" | "index",
2592
- ): <E>(source: Observable<E, A>, subscriber: Subscriber<E, any>) => void {
2687
+ ): <R, E>(source: Observable<R, E, A>, subscriber: Subscriber<E, any>) => void {
2593
2688
  const findIndex = emit === "index";
2594
2689
  return (source, subscriber) => {
2595
2690
  let index = 0;
@@ -2611,10 +2706,10 @@ function findInternal<A>(
2611
2706
  };
2612
2707
  }
2613
2708
 
2614
- export function joinAllInternal<E, E1, A, E2, B>(
2615
- fa: Observable<E, ObservableInput<E1, A>>,
2616
- joiner: (sources: ReadonlyArray<ObservableInput<E1, A>>) => Observable<E2, B>,
2617
- ): Observable<E | E1 | E2, B> {
2709
+ export function joinAllInternal<R, E, R1, E1, A, R2, E2, B>(
2710
+ fa: Observable<R, E, ObservableInput<R1, E1, A>>,
2711
+ joiner: (sources: ReadonlyArray<ObservableInput<R1, E1, A>>) => Observable<R2, E2, B>,
2712
+ ): Observable<R | R1 | R2, E | E1 | E2, B> {
2618
2713
  return fa.toArray.mergeMap(joiner);
2619
2714
  }
2620
2715
 
@@ -2626,10 +2721,10 @@ function maybeSchedule(subscription: Subscription, scheduler: SchedulerLike | un
2626
2721
  }
2627
2722
  }
2628
2723
 
2629
- function mergeInternal<E, A, E1, B>(
2630
- source: Observable<E, A>,
2724
+ function mergeInternal<R, E, A, R1, E1, B>(
2725
+ source: Observable<R, E, A>,
2631
2726
  subscriber: Subscriber<E | E1, B>,
2632
- f: (i: number, a: A) => ObservableInput<E1, B>,
2727
+ f: (i: number, a: A) => ObservableInput<R1, E1, B>,
2633
2728
  concurrent: number,
2634
2729
  onBeforeNext?: (innerValue: B) => void,
2635
2730
  expand?: boolean,
@@ -2705,27 +2800,27 @@ function mergeInternal<E, A, E1, B>(
2705
2800
  };
2706
2801
  }
2707
2802
 
2708
- export function scanInternal<E, A, B>(
2803
+ export function scanInternal<R, E, A, B>(
2709
2804
  f: (index: number, acc: A, value: A) => B,
2710
2805
  initial: B,
2711
2806
  hasInitial: false,
2712
2807
  emitOnNext: boolean,
2713
2808
  emitBeforeComplete?: undefined | true,
2714
- ): (source: Observable<E, A>, subscriber: Subscriber<any, any>) => void;
2715
- export function scanInternal<E, A, B>(
2809
+ ): (source: Observable<R, E, A>, subscriber: Subscriber<any, any>) => void;
2810
+ export function scanInternal<R, E, A, B>(
2716
2811
  f: (index: number, acc: B, value: A) => B,
2717
2812
  initial: B,
2718
2813
  hasInitial: true,
2719
2814
  emitOnNext: boolean,
2720
2815
  emitBeforeComplete?: undefined | true,
2721
- ): (source: Observable<E, A>, subscriber: Subscriber<any, any>) => void;
2722
- export function scanInternal<E, A, B>(
2816
+ ): (source: Observable<R, E, A>, subscriber: Subscriber<any, any>) => void;
2817
+ export function scanInternal<R, E, A, B>(
2723
2818
  f: (index: number, acc: A | B, value: A) => B,
2724
2819
  initial: B,
2725
2820
  hasInitial: boolean,
2726
2821
  emitOnNext: boolean,
2727
2822
  emitBeforeComplete?: undefined | true,
2728
- ): (source: Observable<E, A>, subscriber: Subscriber<any, any>) => void {
2823
+ ): (source: Observable<R, E, A>, subscriber: Subscriber<any, any>) => void {
2729
2824
  return (source, subscriber) => {
2730
2825
  let hasState = hasInitial;
2731
2826
  let state: any = initial;