@fncts/observable 0.0.2 → 0.0.3

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 +2 -2
@@ -1,6 +1,7 @@
1
1
  export declare namespace Observable {
2
- export type TypeOf<X> = X extends ObservableInput<any, infer A> ? A : never;
3
- export type ErrorOf<X> = X extends ObservableInput<infer E, any> ? E : never;
2
+ export type TypeOf<X> = X extends ObservableInput<any, any, infer A> ? A : never;
3
+ export type ErrorOf<X> = X extends ObservableInput<any, infer E, any> ? E : never;
4
+ export type EnvironmentOf<X> = X extends ObservableInput<infer R, any, any> ? R : never;
4
5
  }
5
6
 
6
7
  export const ObservableTypeId = Symbol.for("@principia/observable/Observable");
@@ -10,16 +11,20 @@ export type ObservableTypeId = typeof ObservableTypeId;
10
11
  * @tsplus type fncts.observable.Observable
11
12
  * @tsplus companion fncts.observable.ObservableOps
12
13
  */
13
- export class Observable<E, A> implements Subscribable<E, A>, AsyncIterable<A> {
14
- readonly _E!: () => E;
15
- readonly _A!: () => A;
14
+ export class Observable<R, E, A> implements Subscribable<E, A>, AsyncIterable<A> {
15
+ declare _R: () => R;
16
+ declare _E: () => E;
17
+ declare _A: () => A;
16
18
 
17
19
  readonly [ObservableTypeId]: ObservableTypeId = ObservableTypeId;
18
20
 
19
- protected source: Observable<any, any> | undefined;
21
+ protected source: Observable<any, any, any> | undefined;
20
22
  protected operator: Operator<E, A> | undefined;
23
+ protected environment: Environment<any> = Environment();
21
24
 
22
- constructor(subscribe?: (this: Observable<E, A>, subscriber: Subscriber<E, A>) => Finalizer) {
25
+ constructor(
26
+ subscribe?: (this: Observable<R, E, A>, subscriber: Subscriber<E, A>, environment: Environment<R>) => Finalizer,
27
+ ) {
23
28
  if (subscribe) {
24
29
  this.subscribeInternal = subscribe;
25
30
  }
@@ -74,45 +79,64 @@ export class Observable<E, A> implements Subscribable<E, A>, AsyncIterable<A> {
74
79
  };
75
80
  }
76
81
 
77
- lift<E1, A1>(operator: Operator<E1, A1>): Observable<E1, A1> {
78
- const observable = new Observable<E1, A1>();
82
+ lift<R1, E1, A1>(operator: Operator<E1, A1>): Observable<R1, E1, A1> {
83
+ const observable = new Observable<R1, E1, A1>();
79
84
  observable.source = this;
80
85
  observable.operator = operator;
81
86
  return observable;
82
87
  }
83
88
 
84
- subscribe(observer?: Partial<Observer<E, A>>): Subscription;
85
- subscribe(observer?: (value: A) => void): Subscription;
86
- subscribe(observer?: Partial<Observer<E, A>> | ((value: A) => void)): Subscription {
89
+ provide(environment: Environment<R>): Observable<never, E, A> {
90
+ const observable = new Observable<never, E, A>();
91
+ observable.source = this;
92
+ observable.environment = environment;
93
+ return observable;
94
+ }
95
+
96
+ subscribe(observer?: Partial<Observer<E, A>>, environment?: Environment<R>): Subscription;
97
+ subscribe(observer?: (value: A) => void, environment?: Environment<R>): Subscription;
98
+ subscribe(observer?: Partial<Observer<E, A>> | ((value: A) => void), environment?: Environment<R>): Subscription {
87
99
  const subscriber: Subscriber<E, A> = isSubscriber(observer) ? observer : new SafeSubscriber(observer);
88
100
 
89
101
  subscriber.add(
90
102
  this.operator
91
- ? this.operator.call(subscriber, this.source)
103
+ ? this.operator.call(subscriber, this.source, environment ?? this.environment)
92
104
  : this.source
93
- ? this.subscribeInternal(subscriber)
94
- : this.trySubscribe(subscriber),
105
+ ? this.subscribeInternal(subscriber, environment ?? this.environment)
106
+ : this.trySubscribe(subscriber, environment ?? this.environment),
95
107
  );
96
108
 
97
109
  return subscriber;
98
110
  }
99
111
 
100
- protected trySubscribe(subscriber: Subscriber<E, A>): Finalizer {
112
+ protected trySubscribe(subscriber: Subscriber<E, A>, environment: Environment<R>): Finalizer {
101
113
  try {
102
- return this.subscribeInternal(subscriber);
114
+ return this.subscribeInternal(subscriber, environment);
103
115
  } catch (err) {
104
116
  subscriber.error(Cause.halt(err));
105
117
  return noop;
106
118
  }
107
119
  }
108
120
 
109
- protected subscribeInternal(subscriber: Subscriber<E, A>): Finalizer {
110
- this.source?.subscribe(subscriber);
121
+ protected subscribeInternal(subscriber: Subscriber<E, A>, environment: Environment<R>): Finalizer {
122
+ this.source?.subscribe(subscriber, environment);
123
+ }
124
+ }
125
+
126
+ export class EnvironmentWith<R0, R, E, A> extends Observable<R0 | R, E, A> {
127
+ private map: WeakMap<Environment<any>, Observable<any, any, any>> = new WeakMap();
128
+ constructor(f: (environment: Environment<R0>) => Observable<R, E, A>) {
129
+ super((subsciber, environment) => {
130
+ if (!this.map.has(environment)) {
131
+ this.map.set(environment, f(environment as Environment<R0>));
132
+ }
133
+ return this.map.get(environment)!.subscribe(subsciber);
134
+ });
111
135
  }
112
136
  }
113
137
 
114
- export const EMPTY: Observable<never, never> = new Observable((subscriber) => subscriber.complete());
138
+ export const EMPTY: Observable<never, never, never> = new Observable((subscriber) => subscriber.complete());
115
139
 
116
- export function isObservable(u: unknown): u is Observable<unknown, unknown> {
140
+ export function isObservable(u: unknown): u is Observable<unknown, unknown, unknown> {
117
141
  return isObject(u) && ObservableTypeId in u;
118
142
  }
@@ -3,13 +3,13 @@ import { performanceTimestampProvider } from "@fncts/observable/internal/perform
3
3
 
4
4
  export function animationFrames(
5
5
  timestampProvider?: TimestampProvider,
6
- ): Observable<never, { timestamp: number; elapsed: number }> {
6
+ ): Observable<never, never, { timestamp: number; elapsed: number }> {
7
7
  return timestampProvider ? animationFramesInternal(timestampProvider) : DEFAULT_ANIMATION_FRAMES;
8
8
  }
9
9
 
10
10
  function animationFramesInternal(
11
11
  timestampProvider?: TimestampProvider,
12
- ): Observable<never, { timestamp: number; elapsed: number }> {
12
+ ): Observable<never, never, { timestamp: number; elapsed: number }> {
13
13
  const { schedule } = animationFrameProvider;
14
14
  return new Observable((subscriber) => {
15
15
  const subscription = new Subscription();
package/_src/Operator.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export interface Operator<E, A> {
2
- call(subscriber: Subscriber<E, A>, source: any): Finalizer;
2
+ call(subscriber: Subscriber<E, A>, source: any, environment: Environment<any>): Finalizer;
3
3
  }
4
4
 
5
5
  export class OperatorSubscriber<E, A> extends Subscriber<E, A> {
@@ -59,11 +59,11 @@ export function operatorSubscriber<E, A, E1, A1>(
59
59
  /**
60
60
  * @tsplus fluent fncts.observable.Observable operate
61
61
  */
62
- export function operate_<E, A, E1, A1>(
63
- source: Observable<E, A>,
64
- f: (source: Observable<E, A>, subscriber: Subscriber<E1, A1>) => (() => void) | void,
65
- ): Observable<E1, A1> {
66
- return source.lift(function (this: Subscriber<E1, A1>, liftedSource: Observable<E, A>) {
62
+ export function operate_<R, E, A, R1, E1, A1>(
63
+ source: Observable<R, E, A>,
64
+ f: (source: Observable<R, E, A>, subscriber: Subscriber<E1, A1>) => (() => void) | void,
65
+ ): Observable<R1, E1, A1> {
66
+ return source.lift(function (this: Subscriber<E1, A1>, liftedSource: Observable<R, E, A>) {
67
67
  try {
68
68
  f(liftedSource, this);
69
69
  } catch (err) {
package/_src/Subject.ts CHANGED
@@ -2,7 +2,7 @@ import { arrayRemove } from "@fncts/observable/internal/util";
2
2
 
3
3
  export interface SubjectLike<E, A> extends Observer<E, A>, Subscribable<E, A> {}
4
4
 
5
- export class Subject<E, A> extends Observable<E, A> implements SubscriptionLike {
5
+ export class Subject<R, E, A> extends Observable<R, E, A> implements SubscriptionLike {
6
6
  closed = false;
7
7
  protected observers: Array<Observer<E, A>> = [];
8
8
  protected isStopped = false;
@@ -13,7 +13,7 @@ export class Subject<E, A> extends Observable<E, A> implements SubscriptionLike
13
13
  super();
14
14
  }
15
15
 
16
- lift<E1, B>(operator: Operator<E1, B>): Observable<E1, B> {
16
+ lift<R1, E1, B>(operator: Operator<E1, B>): Observable<R1, E1, B> {
17
17
  const subject = new AnonymousSubject(this, this);
18
18
  subject.operator = operator as any;
19
19
  return subject as any;
@@ -67,9 +67,9 @@ export class Subject<E, A> extends Observable<E, A> implements SubscriptionLike
67
67
  }
68
68
  }
69
69
 
70
- protected trySubscribe(subscriber: Subscriber<E, A>): Finalizer {
70
+ protected trySubscribe(subscriber: Subscriber<E, A>, environment: Environment<R>): Finalizer {
71
71
  this.throwIfClosed();
72
- return super.trySubscribe(subscriber);
72
+ return super.trySubscribe(subscriber, environment);
73
73
  }
74
74
 
75
75
  protected subscribeInternal(subscriber: Subscriber<E, A>): Subscription {
@@ -94,15 +94,15 @@ export class Subject<E, A> extends Observable<E, A> implements SubscriptionLike
94
94
  }
95
95
  }
96
96
 
97
- asObservable(): Observable<E, A> {
98
- const observable: any = new Observable<E, A>();
97
+ asObservable(): Observable<R, E, A> {
98
+ const observable: any = new Observable<R, E, A>();
99
99
  observable.source = this;
100
100
  return observable;
101
101
  }
102
102
  }
103
103
 
104
- export class AnonymousSubject<E, A> extends Subject<E, A> {
105
- constructor(protected destination?: Observer<E, A>, source?: Observable<E, A>) {
104
+ export class AnonymousSubject<R, E, A> extends Subject<R, E, A> {
105
+ constructor(protected destination?: Observer<E, A>, source?: Observable<R, E, A>) {
106
106
  super();
107
107
  this.source = source;
108
108
  }
@@ -122,7 +122,7 @@ export class AnonymousSubject<E, A> extends Subject<E, A> {
122
122
  }
123
123
  }
124
124
 
125
- export class AsyncSubject<E, A> extends Subject<E, A> {
125
+ export class AsyncSubject<R, E, A> extends Subject<R, E, A> {
126
126
  private value: Either<Cause<E>, A> | null = null;
127
127
  private hasValue = false;
128
128
  private isComplete = false;
package/_src/global.ts CHANGED
@@ -1,37 +1,12 @@
1
- import "@fncts/observable";
2
-
3
- /**
4
- * @tsplus global
5
- */
6
- import { HashSet } from "@fncts/base/collection/immutable/HashSet";
7
- /**
8
- * @tsplus global
9
- */
10
- import { Cause } from "@fncts/base/data/Cause";
11
- /**
12
- * @tsplus global
13
- */
14
- import { Either } from "@fncts/base/data/Either";
15
- /**
16
- * @tsplus global
17
- */
18
- import { Exit } from "@fncts/base/data/Exit";
19
- /**
20
- * @tsplus global
21
- */
22
- import { Lazy } from "@fncts/base/data/function";
23
1
  /**
24
2
  * @tsplus global
25
3
  */
26
- import { Just, Maybe, Nothing } from "@fncts/base/data/Maybe";
4
+ import type {} from "@fncts/io/global";
27
5
  /**
28
6
  * @tsplus global
29
7
  */
30
- import { Predicate, PredicateWithIndex } from "@fncts/base/data/Predicate";
31
- /**
32
- * @tsplus global
33
- */
34
- import { Refinement, RefinementWithIndex } from "@fncts/base/data/Refinement";
8
+ import type {} from "@fncts/observable";
9
+
35
10
  /**
36
11
  * @tsplus global
37
12
  */
@@ -43,27 +18,11 @@ import { isDate, isFunction, isIterable, isObject, isPlain } from "@fncts/base/u
43
18
  /**
44
19
  * @tsplus global
45
20
  */
46
- import { Clock } from "@fncts/io/Clock";
47
- /**
48
- * @tsplus global
49
- */
50
- import { Console } from "@fncts/io/Console";
51
- /**
52
- * @tsplus global
53
- */
54
- import { Fiber, FiberContext } from "@fncts/io/Fiber";
55
- /**
56
- * @tsplus global
57
- */
58
- import { IO, isIO, UIO } from "@fncts/io/IO";
59
- /**
60
- * @tsplus global
61
- */
62
- import { IOEnv } from "@fncts/io/IOEnv";
21
+ import { FiberContext } from "@fncts/io/Fiber";
63
22
  /**
64
23
  * @tsplus global
65
24
  */
66
- import { Random } from "@fncts/io/Random";
25
+ import { isIO } from "@fncts/io/IO";
67
26
  /**
68
27
  * @tsplus global
69
28
  */
package/global.d.ts CHANGED
@@ -1,35 +1,11 @@
1
1
  /**
2
2
  * @tsplus global
3
3
  */
4
- import { HashSet } from "@fncts/base/collection/immutable/HashSet";
4
+ import type {} from "@fncts/io/global";
5
5
  /**
6
6
  * @tsplus global
7
7
  */
8
- import { Cause } from "@fncts/base/data/Cause";
9
- /**
10
- * @tsplus global
11
- */
12
- import { Either } from "@fncts/base/data/Either";
13
- /**
14
- * @tsplus global
15
- */
16
- import { Exit } from "@fncts/base/data/Exit";
17
- /**
18
- * @tsplus global
19
- */
20
- import { Lazy } from "@fncts/base/data/function";
21
- /**
22
- * @tsplus global
23
- */
24
- import { Just, Maybe, Nothing } from "@fncts/base/data/Maybe";
25
- /**
26
- * @tsplus global
27
- */
28
- import { Predicate, PredicateWithIndex } from "@fncts/base/data/Predicate";
29
- /**
30
- * @tsplus global
31
- */
32
- import { Refinement, RefinementWithIndex } from "@fncts/base/data/Refinement";
8
+ import type {} from "@fncts/observable";
33
9
  /**
34
10
  * @tsplus global
35
11
  */
@@ -41,27 +17,11 @@ import { isDate, isFunction, isIterable, isObject, isPlain } from "@fncts/base/u
41
17
  /**
42
18
  * @tsplus global
43
19
  */
44
- import { Clock } from "@fncts/io/Clock";
45
- /**
46
- * @tsplus global
47
- */
48
- import { Console } from "@fncts/io/Console";
49
- /**
50
- * @tsplus global
51
- */
52
- import { Fiber, FiberContext } from "@fncts/io/Fiber";
53
- /**
54
- * @tsplus global
55
- */
56
- import { IO, isIO, UIO } from "@fncts/io/IO";
57
- /**
58
- * @tsplus global
59
- */
60
- import { IOEnv } from "@fncts/io/IOEnv";
20
+ import { FiberContext } from "@fncts/io/Fiber";
61
21
  /**
62
22
  * @tsplus global
63
23
  */
64
- import { Random } from "@fncts/io/Random";
24
+ import { isIO } from "@fncts/io/IO";
65
25
  /**
66
26
  * @tsplus global
67
27
  */
@@ -134,4 +94,4 @@ import { isSubscriber, SafeSubscriber, Subscriber } from "@fncts/observable/Subs
134
94
  * @tsplus global
135
95
  */
136
96
  import { Finalizer, isSubscription, Subscription, SubscriptionLike, Unsubscribable, } from "@fncts/observable/Subscription";
137
- import "@fncts/observable";
97
+ export {};
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@fncts/observable",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "dependencies": {
5
- "@fncts/base": "0.0.13"
5
+ "@fncts/base": "0.0.14"
6
6
  },
7
7
  "exports": {
8
8
  "./*": {