@fncts/observable 0.0.17 → 0.0.19

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 (109) hide show
  1. package/ObservableRef/api.d.ts +19 -20
  2. package/ObservableRef/atomic.d.ts +6 -28
  3. package/ObservableRef/definition.d.ts +24 -25
  4. package/ObservableRef.d.ts +3 -0
  5. package/_cjs/Action.cjs.map +1 -1
  6. package/_cjs/AnimationFrameAction.cjs.map +1 -1
  7. package/_cjs/AnimationFrameScheduler.cjs.map +1 -1
  8. package/_cjs/AsyncAction.cjs.map +1 -1
  9. package/_cjs/AsyncScheduler.cjs.map +1 -1
  10. package/_cjs/BehaviorSubject.cjs.map +1 -1
  11. package/_cjs/Notification.cjs.map +1 -1
  12. package/_cjs/Observable/api/connect.cjs.map +1 -1
  13. package/_cjs/Observable/api/connectable.cjs.map +1 -1
  14. package/_cjs/Observable/api/fromCallback.cjs.map +1 -1
  15. package/_cjs/Observable/api/fromEvent.cjs.map +1 -1
  16. package/_cjs/Observable/api/index.cjs.map +1 -1
  17. package/_cjs/Observable/api/race.cjs.map +1 -1
  18. package/_cjs/Observable/api/raceWith.cjs.map +1 -1
  19. package/_cjs/Observable/api/repeatWhen.cjs.map +1 -1
  20. package/_cjs/Observable/api/retryWhen.cjs.map +1 -1
  21. package/_cjs/Observable/api/share.cjs.map +1 -1
  22. package/_cjs/Observable/api/window.cjs.map +1 -1
  23. package/_cjs/Observable/api/windowCount.cjs.map +1 -1
  24. package/_cjs/Observable/api/windowTime.cjs.map +1 -1
  25. package/_cjs/Observable/api/windowToggle.cjs.map +1 -1
  26. package/_cjs/Observable/api/windowWhen.cjs.map +1 -1
  27. package/_cjs/Observable/api.cjs.map +1 -1
  28. package/_cjs/Observable/definition.cjs.map +1 -1
  29. package/_cjs/Observable/dom/animationFrames.cjs.map +1 -1
  30. package/_cjs/Observable/instances.cjs.map +1 -1
  31. package/_cjs/Observable.cjs.map +1 -1
  32. package/_cjs/ObservableRef/api.cjs +46 -19
  33. package/_cjs/ObservableRef/api.cjs.map +1 -1
  34. package/_cjs/ObservableRef/atomic.cjs +13 -75
  35. package/_cjs/ObservableRef/atomic.cjs.map +1 -1
  36. package/_cjs/ObservableRef/definition.cjs +10 -2
  37. package/_cjs/ObservableRef/definition.cjs.map +1 -1
  38. package/_cjs/ObservableRef.cjs +39 -0
  39. package/_cjs/ObservableRef.cjs.map +1 -0
  40. package/_cjs/Observer.cjs.map +1 -1
  41. package/_cjs/Operator.cjs.map +1 -1
  42. package/_cjs/Scheduler.cjs.map +1 -1
  43. package/_cjs/Subject.cjs.map +1 -1
  44. package/_cjs/Subscriber.cjs.map +1 -1
  45. package/_cjs/Subscription.cjs.map +1 -1
  46. package/_cjs/global.cjs.map +1 -1
  47. package/_cjs/index.cjs.map +1 -1
  48. package/_cjs/internal/animationFrameProvider.cjs.map +1 -1
  49. package/_cjs/internal/args.cjs.map +1 -1
  50. package/_cjs/internal/intervalProvider.cjs.map +1 -1
  51. package/_cjs/internal/performanceTimestampProvider.cjs.map +1 -1
  52. package/_cjs/internal/timeoutProvider.cjs.map +1 -1
  53. package/_cjs/internal/timestampProvider.cjs.map +1 -1
  54. package/_cjs/internal/util.cjs.map +1 -1
  55. package/_mjs/Action.mjs.map +1 -1
  56. package/_mjs/AnimationFrameAction.mjs.map +1 -1
  57. package/_mjs/AnimationFrameScheduler.mjs.map +1 -1
  58. package/_mjs/AsyncAction.mjs.map +1 -1
  59. package/_mjs/AsyncScheduler.mjs.map +1 -1
  60. package/_mjs/BehaviorSubject.mjs.map +1 -1
  61. package/_mjs/Notification.mjs.map +1 -1
  62. package/_mjs/Observable/api/connect.mjs.map +1 -1
  63. package/_mjs/Observable/api/connectable.mjs.map +1 -1
  64. package/_mjs/Observable/api/fromCallback.mjs.map +1 -1
  65. package/_mjs/Observable/api/fromEvent.mjs.map +1 -1
  66. package/_mjs/Observable/api/index.mjs.map +1 -1
  67. package/_mjs/Observable/api/race.mjs.map +1 -1
  68. package/_mjs/Observable/api/raceWith.mjs.map +1 -1
  69. package/_mjs/Observable/api/repeatWhen.mjs.map +1 -1
  70. package/_mjs/Observable/api/retryWhen.mjs.map +1 -1
  71. package/_mjs/Observable/api/share.mjs.map +1 -1
  72. package/_mjs/Observable/api/window.mjs.map +1 -1
  73. package/_mjs/Observable/api/windowCount.mjs.map +1 -1
  74. package/_mjs/Observable/api/windowTime.mjs.map +1 -1
  75. package/_mjs/Observable/api/windowToggle.mjs.map +1 -1
  76. package/_mjs/Observable/api/windowWhen.mjs.map +1 -1
  77. package/_mjs/Observable/api.mjs.map +1 -1
  78. package/_mjs/Observable/definition.mjs.map +1 -1
  79. package/_mjs/Observable/dom/animationFrames.mjs.map +1 -1
  80. package/_mjs/Observable/instances.mjs.map +1 -1
  81. package/_mjs/Observable.mjs.map +1 -1
  82. package/_mjs/ObservableRef/api.mjs +46 -19
  83. package/_mjs/ObservableRef/api.mjs.map +1 -1
  84. package/_mjs/ObservableRef/atomic.mjs +11 -71
  85. package/_mjs/ObservableRef/atomic.mjs.map +1 -1
  86. package/_mjs/ObservableRef/definition.mjs +8 -2
  87. package/_mjs/ObservableRef/definition.mjs.map +1 -1
  88. package/_mjs/ObservableRef.mjs +5 -0
  89. package/_mjs/ObservableRef.mjs.map +1 -0
  90. package/_mjs/Observer.mjs.map +1 -1
  91. package/_mjs/Operator.mjs.map +1 -1
  92. package/_mjs/Scheduler.mjs.map +1 -1
  93. package/_mjs/Subject.mjs.map +1 -1
  94. package/_mjs/Subscriber.mjs.map +1 -1
  95. package/_mjs/Subscription.mjs.map +1 -1
  96. package/_mjs/global.mjs.map +1 -1
  97. package/_mjs/index.mjs.map +1 -1
  98. package/_mjs/internal/animationFrameProvider.mjs.map +1 -1
  99. package/_mjs/internal/args.mjs.map +1 -1
  100. package/_mjs/internal/intervalProvider.mjs.map +1 -1
  101. package/_mjs/internal/performanceTimestampProvider.mjs.map +1 -1
  102. package/_mjs/internal/timeoutProvider.mjs.map +1 -1
  103. package/_mjs/internal/timestampProvider.mjs.map +1 -1
  104. package/_mjs/internal/util.mjs.map +1 -1
  105. package/_src/ObservableRef/api.ts +84 -52
  106. package/_src/ObservableRef/atomic.ts +11 -75
  107. package/_src/ObservableRef/definition.ts +25 -24
  108. package/_src/ObservableRef.ts +5 -0
  109. package/package.json +2 -2
@@ -1,7 +1,6 @@
1
1
  import type { Lens } from "@fncts/base/optics/Lens";
2
- import type { URIO } from "@fncts/io/IO";
2
+ import type { UIO } from "@fncts/io/IO";
3
3
  import type { Observable } from "@fncts/observable/Observable";
4
- import type { Store } from "@fncts/observable/ObservableRef/atomic";
5
4
 
6
5
  import { Atomic } from "@fncts/observable/ObservableRef/atomic";
7
6
  import { ObservableRef, ObservableRefDescriptor } from "@fncts/observable/ObservableRef/definition";
@@ -10,25 +9,22 @@ import { ObservableRef, ObservableRefDescriptor } from "@fncts/observable/Observ
10
9
  * @tsplus static fncts.observable.ObservableRefOps make
11
10
  * @tsplus static fncts.observable.ObservableRefOps __call
12
11
  */
13
- export function make<A>(initial: A, /** @fncts id */ id?: string): ObservableRef<Store, A, A> {
14
- if (id === undefined) {
15
- throw new Error("ObservableRef.make: the `id` argument must be provided if not using typescript transformers");
16
- }
17
- return new Atomic(new ObservableRefDescriptor(Symbol.for(id!), initial));
12
+ export function make<A>(initial: A): ObservableRef<A, A> {
13
+ return new Atomic(new ObservableRefDescriptor(initial));
18
14
  }
19
15
 
20
16
  /**
21
17
  * @tsplus pipeable fncts.observable.ObservableRef update
22
18
  */
23
- export function update<R, A>(f: (a: A) => A) {
24
- return (self: ObservableRef<R, A, A>): URIO<R, void> => self.modify((a) => [undefined, f(a)]);
19
+ export function update<A>(f: (a: A) => A) {
20
+ return (self: ObservableRef<A, A>): UIO<void> => self.modify((a) => [undefined, f(a)]);
25
21
  }
26
22
 
27
23
  /**
28
24
  * @tsplus pipeable fncts.observable.ObservableRef getAndUpdate
29
25
  */
30
- export function getAndUpdate<R, A>(f: (a: A) => A) {
31
- return (self: ObservableRef<R, A, A>): URIO<R, A> => {
26
+ export function getAndUpdate<A>(f: (a: A) => A) {
27
+ return (self: ObservableRef<A, A>): UIO<A> => {
32
28
  return self.modify((a) => {
33
29
  const value = f(a);
34
30
  return [a, value];
@@ -39,8 +35,8 @@ export function getAndUpdate<R, A>(f: (a: A) => A) {
39
35
  /**
40
36
  * @tsplus pipeable fncts.observable.ObservableRef updateAndGet
41
37
  */
42
- export function updateAndGet<R, A>(f: (a: A) => A) {
43
- return (self: ObservableRef<R, A, A>): URIO<R, A> => {
38
+ export function updateAndGet<A>(f: (a: A) => A) {
39
+ return (self: ObservableRef<A, A>): UIO<A> => {
44
40
  return self.modify((a) => {
45
41
  const value = f(a);
46
42
  return [value, value];
@@ -51,8 +47,8 @@ export function updateAndGet<R, A>(f: (a: A) => A) {
51
47
  /**
52
48
  * @tsplus pipeable fncts.observable.ObservableRef modify
53
49
  */
54
- export function modify<R, A, B>(f: (a: A) => readonly [B, A]) {
55
- return (self: ObservableRef<R, A, A>): URIO<R, B> => {
50
+ export function modify<A, B>(f: (a: A) => readonly [B, A]) {
51
+ return (self: ObservableRef<A, A>): UIO<B> => {
56
52
  return self.get.flatMap((value) => {
57
53
  const [b, a] = f(value);
58
54
  return self.set(a) > IO.succeedNow(b);
@@ -60,110 +56,146 @@ export function modify<R, A, B>(f: (a: A) => readonly [B, A]) {
60
56
  };
61
57
  }
62
58
 
63
- class Map<R, A, B, C> extends ObservableRef<R, A, C> {
64
- constructor(readonly source: ObservableRef<R, A, B>, readonly f: (b: B) => C) {
59
+ class Map<A, B, C> extends ObservableRef<A, C> {
60
+ constructor(readonly source: ObservableRef<A, B>, readonly f: (b: B) => C) {
65
61
  super(source.descriptor);
66
62
  }
67
63
 
68
- get: URIO<R, C> = this.source.get.map(this.f);
64
+ unsafeGet(): C {
65
+ return this.f(this.source.unsafeGet());
66
+ }
67
+
68
+ get: UIO<C> = this.source.get.map(this.f);
69
+
70
+ unsafeSet(a: A): void {
71
+ this.source.unsafeSet(a);
72
+ }
69
73
 
70
- set(a: A): URIO<R, void> {
74
+ set(a: A): UIO<void> {
71
75
  return this.source.set(a);
72
76
  }
73
77
 
74
- has: URIO<R, boolean> = this.source.has;
78
+ unsafeClear(): void {
79
+ this.source.unsafeClear();
80
+ }
75
81
 
76
- delete: URIO<R, boolean> = this.source.delete;
82
+ clear: UIO<void> = this.source.clear;
77
83
 
78
- observable: Observable<R, never, C> = this.source.observable.map(this.f);
84
+ observable: Observable<never, never, C> = this.source.observable.map(this.f);
79
85
  }
80
86
 
81
87
  /**
82
88
  * @tsplus pipeable fncts.observable.ObservableRef map
83
89
  */
84
- export function map<R, A, B, C>(f: (a: B) => C) {
85
- return (self: ObservableRef<R, A, B>): ObservableRef<R, A, C> => {
90
+ export function map<A, B, C>(f: (a: B) => C) {
91
+ return (self: ObservableRef<A, B>): ObservableRef<A, C> => {
86
92
  return new Map(self, f);
87
93
  };
88
94
  }
89
95
 
90
- class ContramapIn<R, A, B, C> extends ObservableRef<R, C, B> {
91
- constructor(readonly source: ObservableRef<R, A, B>, readonly f: (c: C) => A) {
96
+ class ContramapIn<A, B, C> extends ObservableRef<C, B> {
97
+ constructor(readonly source: ObservableRef<A, B>, readonly f: (c: C) => A) {
92
98
  super(source.descriptor);
93
99
  }
94
100
 
95
- get: URIO<R, B> = this.source.get;
101
+ unsafeGet(): B {
102
+ return this.source.unsafeGet();
103
+ }
104
+
105
+ get: UIO<B> = this.source.get;
106
+
107
+ unsafeSet(c: C): void {
108
+ this.source.unsafeSet(this.f(c));
109
+ }
96
110
 
97
- set(c: C): URIO<R, void> {
111
+ set(c: C): UIO<void> {
98
112
  return this.source.set(this.f(c));
99
113
  }
100
114
 
101
- has: URIO<R, boolean> = this.source.has;
115
+ unsafeClear(): void {
116
+ this.source.unsafeClear();
117
+ }
102
118
 
103
- delete: URIO<R, boolean> = this.source.delete;
119
+ clear: UIO<void> = this.source.clear;
104
120
 
105
- observable: Observable<R, never, B> = this.source.observable;
121
+ observable: Observable<never, never, B> = this.source.observable;
106
122
  }
107
123
 
108
124
  /**
109
125
  * @tsplus pipeable fncts.observable.ObservableRef contramapIn
110
126
  */
111
- export function contramapIn<R, A, B, C>(f: (inp: C) => A) {
112
- return (self: ObservableRef<R, A, B>): ObservableRef<R, C, B> => {
127
+ export function contramapIn<A, B, C>(f: (inp: C) => A) {
128
+ return (self: ObservableRef<A, B>): ObservableRef<C, B> => {
113
129
  return new ContramapIn(self, f);
114
130
  };
115
131
  }
116
132
 
117
- class Focus<R, A, B> extends ObservableRef<R, B, B> {
118
- constructor(readonly source: ObservableRef<R, A, A>, readonly lens: Lens<A, B>) {
133
+ class Focus<A, B> extends ObservableRef<B, B> {
134
+ constructor(readonly source: ObservableRef<A, A>, readonly lens: Lens<A, B>) {
119
135
  super(source.descriptor);
120
136
  }
121
137
 
122
- get: URIO<R, B> = this.source.get.map(this.lens.get);
138
+ unsafeGet(): B {
139
+ return this.lens.get(this.source.unsafeGet());
140
+ }
141
+
142
+ get: UIO<B> = this.source.get.map(this.lens.get);
143
+
144
+ unsafeSet(b: B): void {
145
+ this.source.unsafeSet(this.lens.set(b)(this.source.unsafeGet()));
146
+ }
123
147
 
124
- set(b: B): URIO<R, void> {
148
+ set(b: B): UIO<void> {
125
149
  return this.source.get.flatMap((a) => this.source.set(this.lens.set(b)(a)));
126
150
  }
127
151
 
128
- has: URIO<R, boolean> = this.source.has;
152
+ unsafeClear(): void {
153
+ this.source.unsafeClear();
154
+ }
129
155
 
130
- delete: URIO<R, boolean> = this.source.delete;
156
+ clear: UIO<void> = this.source.clear;
131
157
 
132
- observable: Observable<R, never, B> = this.source.observable.map(this.lens.get);
158
+ observable: Observable<never, never, B> = this.source.observable.map(this.lens.get);
133
159
  }
134
160
 
135
161
  /**
136
162
  * @tsplus pipeable fncts.observable.ObservableRef focus
137
163
  */
138
- export function focus<R, A, B>(lens: Lens<A, B>) {
139
- return (self: ObservableRef<R, A, A>): ObservableRef<R, B, B> => {
164
+ export function focus<A, B>(lens: Lens<A, B>) {
165
+ return (self: ObservableRef<A, A>): ObservableRef<B, B> => {
140
166
  return new Focus(self, lens);
141
167
  };
142
168
  }
143
169
 
144
- export class ZipWith<R, A, R1, B, C> implements ObservableRef.Readable<R | R1, C> {
145
- declare _R: (_: never) => R | R1;
170
+ export class ZipWith<A, B, C> implements ObservableRef.Readable<C> {
146
171
  declare _Out: (_: never) => C;
147
172
  constructor(
148
- readonly sourceA: ObservableRef.Readable<R, A>,
149
- readonly sourceB: ObservableRef.Readable<R1, B>,
173
+ readonly sourceA: ObservableRef.Readable<A>,
174
+ readonly sourceB: ObservableRef.Readable<B>,
150
175
  readonly f: (a: A, b: B) => C,
151
176
  ) {}
152
177
 
153
- get: URIO<R | R1, C> = this.sourceA.get.zipWith(this.sourceB.get, this.f);
178
+ unsafeGet(): C {
179
+ return this.f(this.sourceA.unsafeGet(), this.sourceB.unsafeGet());
180
+ }
181
+
182
+ get: UIO<C> = this.sourceA.get.zipWith(this.sourceB.get, this.f);
154
183
 
155
- has: URIO<R | R1, boolean> = this.sourceA.has.zipWith(this.sourceB.has, (a, b) => a && b);
184
+ unsafeClear() {
185
+ this.sourceA.unsafeClear();
186
+ this.sourceB.unsafeClear();
187
+ }
156
188
 
157
- delete: URIO<R | R1, void> = this.sourceA.delete > this.sourceB.delete;
189
+ clear: UIO<void> = this.sourceA.clear > this.sourceB.clear;
158
190
 
159
- observable: Observable<R | R1, never, C> = this.sourceA.observable.zipWithLatest(this.sourceB.observable, this.f);
191
+ observable: Observable<never, never, C> = this.sourceA.observable.zipWithLatest(this.sourceB.observable, this.f);
160
192
  }
161
193
 
162
194
  /**
163
195
  * @tsplus pipeable fncts.observable.ObservableRef.Readable zipWith
164
196
  */
165
- export function zipWith<R, A, R1, B, C>(that: ObservableRef.Readable<R1, B>, f: (a: A, b: B) => C) {
166
- return (self: ObservableRef.Readable<R, A>): ObservableRef.Readable<R | R1, C> => {
197
+ export function zipWith<A, B, C>(that: ObservableRef.Readable<B>, f: (a: A, b: B) => C) {
198
+ return (self: ObservableRef.Readable<A>): ObservableRef.Readable<C> => {
167
199
  return new ZipWith(self, that, f);
168
200
  };
169
201
  }
@@ -1,85 +1,21 @@
1
- import type { ObservableRefDescriptor } from "@fncts/observable/ObservableRef/definition";
2
-
3
1
  import { BehaviorSubject } from "@fncts/observable/BehaviorSubject";
4
2
 
5
- export class Atomic<A> extends ObservableRef<Store, A, A> {
6
- get: URIO<Store, A> = IO.serviceWithIO((reactor) => reactor.get(this.descriptor), Store.Tag);
3
+ export class Atomic<A> extends ObservableRef<A, A> {
4
+ subject = new BehaviorSubject<A>(this.descriptor.initial);
7
5
 
8
- set(a: A): URIO<Store, void> {
9
- return IO.serviceWithIO((reactor) => reactor.set(this.descriptor, a), Store.Tag);
6
+ unsafeGet() {
7
+ return this.subject.value;
10
8
  }
11
9
 
12
- has: URIO<Store, boolean> = IO.serviceWithIO((reactor) => reactor.has(this.descriptor), Store.Tag);
13
-
14
- delete: URIO<Store, boolean> = IO.serviceWithIO((reactor) => reactor.delete(this.descriptor), Store.Tag);
15
-
16
- observable: Observable<Store, never, A> = Observable.serviceWithObservable(
17
- (reactor) =>
18
- new Observable((subscriber) => {
19
- return reactor.unsafeSubscribe(this.descriptor, subscriber);
20
- }),
21
- Store.Tag,
22
- );
23
- }
24
-
25
- /**
26
- * @tsplus type fncts.observable.Store
27
- * @tsplus companion fncts.observable.StoreOps
28
- */
29
- export class Store {
30
- subjectMap = new Map<symbol, BehaviorSubject<any>>();
31
- get<A>(ref: ObservableRefDescriptor<A>): UIO<A> {
32
- return IO(() => {
33
- if (this.subjectMap.has(ref.id)) {
34
- return this.subjectMap.get(ref.id)!.value;
35
- } else {
36
- this.subjectMap.set(ref.id, new BehaviorSubject(ref.initial));
37
- return ref.initial;
38
- }
39
- });
10
+ unsafeSet(a: A): void {
11
+ this.subject.next(a);
40
12
  }
41
13
 
42
- set<A>(ref: ObservableRefDescriptor<A>, value: A): UIO<A> {
43
- return IO(() => {
44
- if (this.subjectMap.has(ref.id)) {
45
- this.subjectMap.get(ref.id)!.next(value);
46
- } else {
47
- this.subjectMap.set(ref.id, new BehaviorSubject(value));
48
- }
49
- return value;
50
- });
14
+ unsafeClear(): void {
15
+ this.subject.next(this.descriptor.initial);
51
16
  }
52
17
 
53
- has<A>(ref: ObservableRefDescriptor<A>): UIO<boolean> {
54
- return IO(() => this.subjectMap.has(ref.id));
55
- }
56
-
57
- delete<A>(ref: ObservableRefDescriptor<A>): UIO<boolean> {
58
- return IO(() => {
59
- if (this.subjectMap.has(ref.id)) {
60
- this.subjectMap.delete(ref.id);
61
- return true;
62
- }
63
- return false;
64
- });
65
- }
66
-
67
- unsafeSubscribe<A>(ref: ObservableRefDescriptor<A>, subscriber: Subscriber<never, A>): Subscription {
68
- if (this.subjectMap.has(ref.id)) {
69
- const subject = this.subjectMap.get(ref.id)!;
70
- const subscription = subject.subscribe(subscriber);
71
- return subscription;
72
- } else {
73
- const subject = new BehaviorSubject<A>(ref.initial);
74
- const subscription = subject.subscribe(subscriber);
75
- this.subjectMap.set(ref.id, subject);
76
- return subscription;
77
- }
78
- }
18
+ observable: Observable<never, never, A> = new Observable((subscriber) => {
19
+ return this.subject.subscribe(subscriber);
20
+ });
79
21
  }
80
-
81
- /**
82
- * @tsplus static fncts.observable.StoreOps Tag
83
- * @tsplus implicit
84
- */
85
- export const StoreTag = Tag<Store>("fncts.observable.ObservableRef.StoreTag");
@@ -1,57 +1,58 @@
1
- import type { URIO } from "@fncts/io/IO";
2
1
  import type { Observable } from "@fncts/observable/Observable";
3
2
 
4
- type Readable_<R, A> = Readable<R, A>;
5
- type Writable_<R, A> = Writable<R, A>;
3
+ type Readable_<A> = Readable<A>;
4
+ type Writable_<A> = Writable<A>;
6
5
 
7
6
  export declare namespace ObservableRef {
8
- type Readable<R, A> = Readable_<R, A>;
9
- type Writable<R, A> = Writable_<R, A>;
7
+ type Readable<A> = Readable_<A>;
8
+ type Writable<A> = Writable_<A>;
10
9
  }
11
10
 
12
11
  export class ObservableRefDescriptor<A> {
13
- constructor(readonly id: symbol, readonly initial: A) {}
12
+ constructor(readonly initial: A) {}
14
13
  }
15
14
 
16
- export interface CommonObservableRef<out R> {
17
- readonly _R: (_: never) => R;
18
- readonly has: URIO<R, boolean>;
19
- readonly delete: URIO<R, void>;
15
+ export interface CommonObservableRef {
16
+ readonly unsafeClear: () => void;
17
+ readonly clear: UIO<void>;
20
18
  }
21
19
 
22
20
  /**
23
21
  * @tsplus type fncts.observable.ObservableRef.Readable
24
22
  */
25
- export interface Readable<out R, out A> extends CommonObservableRef<R> {
26
- readonly _R: (_: never) => R;
23
+ export interface Readable<out A> extends CommonObservableRef {
27
24
  readonly _Out: (_: never) => A;
28
- readonly get: URIO<R, A>;
29
- readonly observable: Observable<R, never, A>;
25
+ readonly get: UIO<A>;
26
+ readonly unsafeGet: () => A;
27
+ readonly observable: Observable<never, never, A>;
30
28
  }
31
29
 
32
30
  /**
33
31
  * @tsplus type fncts.observable.ObservableRef.Writable
34
32
  */
35
- export interface Writable<out R, in A> extends CommonObservableRef<R> {
36
- readonly _R: (_: never) => R;
33
+ export interface Writable<in A> extends CommonObservableRef {
37
34
  readonly _In: (_: A) => void;
38
- set(a: A): URIO<R, void>;
35
+ set(a: A): UIO<void>;
36
+ unsafeSet: (a: A) => void;
39
37
  }
40
38
 
41
39
  /**
42
40
  * @tsplus type fncts.observable.ObservableRef
43
41
  * @tsplus companion fncts.observable.ObservableRefOps
44
42
  */
45
- export abstract class ObservableRef<out R, in A, out B> implements Readable<R, B>, Writable<R, A> {
46
- declare _R: (_: never) => R;
43
+ export abstract class ObservableRef<in A, out B> implements Readable<B>, Writable<A> {
47
44
  declare _In: (_: A) => void;
48
45
  declare _Out: (_: never) => B;
49
46
 
50
47
  constructor(readonly descriptor: ObservableRefDescriptor<any>) {}
51
48
 
52
- abstract readonly get: URIO<R, B>;
53
- abstract set(a: A): URIO<R, void>;
54
- abstract readonly delete: URIO<R, boolean>;
55
- abstract readonly has: URIO<R, boolean>;
56
- abstract readonly observable: Observable<R, never, B>;
49
+ abstract unsafeGet(): B;
50
+ readonly get: UIO<B> = IO(this.unsafeGet());
51
+ abstract unsafeSet(a: A): void;
52
+ set(a: A): UIO<void> {
53
+ return IO(this.unsafeSet(a));
54
+ }
55
+ abstract unsafeClear(): void;
56
+ readonly clear = IO(this.unsafeClear());
57
+ abstract readonly observable: Observable<never, never, B>;
57
58
  }
@@ -0,0 +1,5 @@
1
+ // codegen:start { preset: barrel, include: ./ObservableRef/*.ts }
2
+ export * from "./ObservableRef/api.js";
3
+ export * from "./ObservableRef/atomic.js";
4
+ export * from "./ObservableRef/definition.js";
5
+ // codegen:end
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@fncts/observable",
3
- "version": "0.0.17",
3
+ "version": "0.0.19",
4
4
  "dependencies": {
5
- "@fncts/base": "0.0.28"
5
+ "@fncts/base": "0.0.30"
6
6
  },
7
7
  "exports": {
8
8
  "./*": {