@typed/fx 1.22.2 → 1.23.0
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.
- package/dist/cjs/Form.js.map +1 -1
- package/dist/cjs/Fx.js.map +1 -1
- package/dist/cjs/Idle.js.map +1 -1
- package/dist/cjs/Match.js.map +1 -1
- package/dist/cjs/Pull.js.map +1 -1
- package/dist/cjs/Subject.js.map +1 -1
- package/dist/cjs/internal/core.js.map +1 -1
- package/dist/cjs/internal/helpers.js.map +1 -1
- package/dist/cjs/internal/keyed.js +1 -1
- package/dist/cjs/internal/keyed.js.map +1 -1
- package/dist/cjs/internal/share.js.map +1 -1
- package/dist/cjs/internal/sync-producer.js.map +1 -1
- package/dist/dts/AsyncData.d.ts +33 -33
- package/dist/dts/AsyncData.d.ts.map +1 -1
- package/dist/dts/Emitter.d.ts +6 -6
- package/dist/dts/Emitter.d.ts.map +1 -1
- package/dist/dts/Form.d.ts +12 -12
- package/dist/dts/Form.d.ts.map +1 -1
- package/dist/dts/FormEntry.d.ts +9 -9
- package/dist/dts/FormEntry.d.ts.map +1 -1
- package/dist/dts/Fx.d.ts +113 -113
- package/dist/dts/Fx.d.ts.map +1 -1
- package/dist/dts/Guard.d.ts +5 -5
- package/dist/dts/Guard.d.ts.map +1 -1
- package/dist/dts/Idle.d.ts +12 -12
- package/dist/dts/Idle.d.ts.map +1 -1
- package/dist/dts/Pull.d.ts +5 -5
- package/dist/dts/Pull.d.ts.map +1 -1
- package/dist/dts/Push.d.ts +20 -20
- package/dist/dts/Push.d.ts.map +1 -1
- package/dist/dts/RefArray.d.ts +33 -33
- package/dist/dts/RefArray.d.ts.map +1 -1
- package/dist/dts/RefChunk.d.ts +27 -27
- package/dist/dts/RefChunk.d.ts.map +1 -1
- package/dist/dts/RefHashMap.d.ts +17 -17
- package/dist/dts/RefHashMap.d.ts.map +1 -1
- package/dist/dts/RefHashSet.d.ts +5 -5
- package/dist/dts/RefHashSet.d.ts.map +1 -1
- package/dist/dts/RefSubject.d.ts +53 -53
- package/dist/dts/RefSubject.d.ts.map +1 -1
- package/dist/dts/Sink.d.ts +31 -31
- package/dist/dts/Sink.d.ts.map +1 -1
- package/dist/dts/Stream.d.ts +11 -11
- package/dist/dts/Stream.d.ts.map +1 -1
- package/dist/dts/Subject.d.ts +5 -5
- package/dist/dts/Subject.d.ts.map +1 -1
- package/dist/dts/Versioned.d.ts +11 -11
- package/dist/dts/Versioned.d.ts.map +1 -1
- package/dist/dts/internal/DeferredRef.d.ts +7 -7
- package/dist/dts/internal/core.d.ts +51 -51
- package/dist/dts/internal/core.d.ts.map +1 -1
- package/dist/dts/internal/effect-loop-operator.d.ts +4 -4
- package/dist/dts/internal/effect-loop-operator.d.ts.map +1 -1
- package/dist/dts/internal/effect-operator.d.ts +11 -11
- package/dist/dts/internal/effect-operator.d.ts.map +1 -1
- package/dist/dts/internal/effect-producer.d.ts +9 -9
- package/dist/dts/internal/effect-producer.d.ts.map +1 -1
- package/dist/dts/internal/helpers.d.ts +25 -25
- package/dist/dts/internal/helpers.d.ts.map +1 -1
- package/dist/dts/internal/protos.d.ts +9 -9
- package/dist/dts/internal/protos.d.ts.map +1 -1
- package/dist/dts/internal/provide.d.ts +10 -10
- package/dist/dts/internal/provide.d.ts.map +1 -1
- package/dist/dts/internal/share.d.ts +2 -2
- package/dist/dts/internal/share.d.ts.map +1 -1
- package/dist/dts/internal/sync-producer.d.ts +6 -6
- package/dist/dts/internal/sync-producer.d.ts.map +1 -1
- package/dist/esm/Form.js.map +1 -1
- package/dist/esm/FormEntry.js.map +1 -1
- package/dist/esm/Fx.js.map +1 -1
- package/dist/esm/Idle.js.map +1 -1
- package/dist/esm/Match.js.map +1 -1
- package/dist/esm/Pull.js.map +1 -1
- package/dist/esm/RefSubject.js.map +1 -1
- package/dist/esm/Subject.js.map +1 -1
- package/dist/esm/internal/core.js.map +1 -1
- package/dist/esm/internal/helpers.js.map +1 -1
- package/dist/esm/internal/keyed.js +1 -1
- package/dist/esm/internal/keyed.js.map +1 -1
- package/dist/esm/internal/share.js.map +1 -1
- package/dist/esm/internal/sync-producer.js.map +1 -1
- package/package.json +6 -6
- package/src/AsyncData.ts +86 -86
- package/src/Emitter.ts +9 -9
- package/src/Form.ts +39 -39
- package/src/FormEntry.ts +25 -25
- package/src/Fx.ts +122 -124
- package/src/Guard.ts +7 -7
- package/src/Idle.ts +23 -23
- package/src/Match.ts +3 -3
- package/src/Pull.ts +10 -10
- package/src/Push.ts +33 -33
- package/src/RefArray.ts +36 -36
- package/src/RefChunk.ts +30 -30
- package/src/RefHashMap.ts +24 -24
- package/src/RefHashSet.ts +6 -6
- package/src/RefSubject.ts +184 -184
- package/src/Sink.ts +91 -91
- package/src/Stream.ts +19 -19
- package/src/Subject.ts +21 -21
- package/src/Versioned.ts +23 -23
- package/src/internal/DeferredRef.ts +6 -6
- package/src/internal/core.ts +132 -132
- package/src/internal/effect-loop-operator.ts +4 -4
- package/src/internal/effect-operator.ts +13 -13
- package/src/internal/effect-producer.ts +14 -14
- package/src/internal/helpers.ts +36 -36
- package/src/internal/keyed.ts +3 -3
- package/src/internal/protos.ts +12 -12
- package/src/internal/provide.ts +10 -10
- package/src/internal/share.ts +4 -4
- package/src/internal/sync-producer.ts +12 -12
package/src/AsyncData.ts
CHANGED
|
@@ -20,7 +20,7 @@ import { RefSubjectTypeId } from "./TypeId.js"
|
|
|
20
20
|
/**
|
|
21
21
|
* @since 1.20.0
|
|
22
22
|
*/
|
|
23
|
-
export function asyncDataRequest<
|
|
23
|
+
export function asyncDataRequest<A, E, R>(effect: Effect.Effect<A, E, R>): Fx.Fx<R, never, AsyncData.AsyncData<A, E>> {
|
|
24
24
|
return Fx.make((sink) =>
|
|
25
25
|
Effect.flatMap(
|
|
26
26
|
Effect.zipRight(sink.onSuccess(AsyncData.loading()), Effect.exit(effect)),
|
|
@@ -32,23 +32,23 @@ export function asyncDataRequest<R, E, A>(effect: Effect.Effect<R, E, A>): Fx.Fx
|
|
|
32
32
|
/**
|
|
33
33
|
* @since 1.20.0
|
|
34
34
|
*/
|
|
35
|
-
export interface RefAsyncData<
|
|
35
|
+
export interface RefAsyncData<A, E, R> extends RefSubject.RefSubject<R, never, AsyncData.AsyncData<A, E>> {}
|
|
36
36
|
|
|
37
37
|
/**
|
|
38
38
|
* @since 1.20.0
|
|
39
39
|
*/
|
|
40
40
|
export const runAsyncData: {
|
|
41
|
-
<R2,
|
|
42
|
-
effect: Effect.Effect<
|
|
43
|
-
): <R>(ref: RefAsyncData<
|
|
41
|
+
<R2, A, E>(
|
|
42
|
+
effect: Effect.Effect<A, E, R2>
|
|
43
|
+
): <R>(ref: RefAsyncData<A, E, R>) => Effect.Effect<AsyncData.AsyncData<A, E>, never, R | R2>
|
|
44
44
|
<R, E, A, R2>(
|
|
45
|
-
ref: RefAsyncData<
|
|
46
|
-
effect: Effect.Effect<
|
|
47
|
-
): Effect.Effect<
|
|
45
|
+
ref: RefAsyncData<A, E, R>,
|
|
46
|
+
effect: Effect.Effect<A, E, R2>
|
|
47
|
+
): Effect.Effect<AsyncData.AsyncData<A, E>, never, R | R2>
|
|
48
48
|
} = dual(2, function runAsyncData<R, E, A, R2>(
|
|
49
|
-
ref: RefAsyncData<
|
|
50
|
-
effect: Effect.Effect<
|
|
51
|
-
): Effect.Effect<
|
|
49
|
+
ref: RefAsyncData<A, E, R>,
|
|
50
|
+
effect: Effect.Effect<A, E, R2>
|
|
51
|
+
): Effect.Effect<AsyncData.AsyncData<A, E>, never, R | R2> {
|
|
52
52
|
return ref.runUpdates(({ get, set }) =>
|
|
53
53
|
Effect.uninterruptibleMask((restore) =>
|
|
54
54
|
Effect.flatMap(
|
|
@@ -74,17 +74,17 @@ export const matchAsyncData: {
|
|
|
74
74
|
readonly Success: (value: RefSubject.RefSubject<never, never, A>) => Fx.Fx<R5, E5, F>
|
|
75
75
|
}
|
|
76
76
|
): <R, E>(
|
|
77
|
-
fx: Fx.Fx<R, E, AsyncData.AsyncData<
|
|
77
|
+
fx: Fx.Fx<R, E, AsyncData.AsyncData<A, E1>>
|
|
78
78
|
) => Fx.Fx<R | R2 | R3 | R4 | R5, E | E2 | E3 | E4 | E5, B | C | D | F>
|
|
79
79
|
|
|
80
|
-
<R, E, E1, A, R2, E2, B, R3, E3, C, R4, E4, D, R5, E5, F>(fx: Fx.Fx<R, E, AsyncData.AsyncData<
|
|
80
|
+
<R, E, E1, A, R2, E2, B, R3, E3, C, R4, E4, D, R5, E5, F>(fx: Fx.Fx<R, E, AsyncData.AsyncData<A, E1>>, matchers: {
|
|
81
81
|
readonly NoData: Fx.Fx<R2, E2, B>
|
|
82
82
|
readonly Loading: (progress: RefSubject.Filtered<never, never, Progress>) => Fx.Fx<R3, E3, C>
|
|
83
83
|
readonly Failure: (error: RefSubject.Computed<never, never, E1>) => Fx.Fx<R4, E4, D>
|
|
84
84
|
readonly Success: (value: RefSubject.RefSubject<never, never, A>) => Fx.Fx<R5, E5, F>
|
|
85
85
|
}): Fx.Fx<R | R2 | R3 | R4 | R5, E | E2 | E3 | E4 | E5, B | C | D | F>
|
|
86
86
|
} = dual(2, function matchAsyncData<R, E, E1, A, R2, E2, B, R3, E3, C, R4, E4, D, R5, E5, F>(
|
|
87
|
-
fx: Fx.Fx<R, E, AsyncData.AsyncData<
|
|
87
|
+
fx: Fx.Fx<R, E, AsyncData.AsyncData<A, E1>>,
|
|
88
88
|
matchers: {
|
|
89
89
|
readonly NoData: Fx.Fx<R2, E2, B>
|
|
90
90
|
readonly Loading: (progress: RefSubject.Filtered<never, never, Progress>) => Fx.Fx<R3, E3, C>
|
|
@@ -94,14 +94,14 @@ export const matchAsyncData: {
|
|
|
94
94
|
) => Fx.Fx<R4, E4, D>
|
|
95
95
|
readonly Success: (
|
|
96
96
|
value: RefSubject.RefSubject<never, never, A>,
|
|
97
|
-
data: RefSubject.RefSubject<never, never, AsyncData.Success<A> | AsyncData.Optimistic<
|
|
97
|
+
data: RefSubject.RefSubject<never, never, AsyncData.Success<A> | AsyncData.Optimistic<A, E1>>
|
|
98
98
|
) => Fx.Fx<R5, E5, F>
|
|
99
99
|
}
|
|
100
100
|
): Fx.Fx<R | R2 | R3 | R4 | R5, E | E2 | E3 | E4 | E5, B | C | D | F> {
|
|
101
101
|
return Fx.withKey(
|
|
102
102
|
fx,
|
|
103
103
|
{
|
|
104
|
-
getKey: (a: AsyncData.AsyncData<
|
|
104
|
+
getKey: (a: AsyncData.AsyncData<A, E1>) => a._tag === "Optimistic" ? "Success" : a._tag,
|
|
105
105
|
onValue: (ref, key): Fx.Fx<R | R2 | R3 | R4 | R5, E | E2 | E3 | E4 | E5, B | C | D | F> => {
|
|
106
106
|
switch (key) {
|
|
107
107
|
case "NoData":
|
|
@@ -128,7 +128,7 @@ export const matchAsyncData: {
|
|
|
128
128
|
const success = ref as RefSubject.RefSubject<
|
|
129
129
|
never,
|
|
130
130
|
never,
|
|
131
|
-
AsyncData.Success<A> | AsyncData.Optimistic<
|
|
131
|
+
AsyncData.Success<A> | AsyncData.Optimistic<A, E1>
|
|
132
132
|
>
|
|
133
133
|
|
|
134
134
|
return matchers.Success(
|
|
@@ -138,7 +138,7 @@ export const matchAsyncData: {
|
|
|
138
138
|
(value) =>
|
|
139
139
|
Effect.map(
|
|
140
140
|
success,
|
|
141
|
-
(d) => AsyncData.map(d, () => value) as AsyncData.Success<A> | AsyncData.Optimistic<
|
|
141
|
+
(d) => AsyncData.map(d, () => value) as AsyncData.Success<A> | AsyncData.Optimistic<A, E1>
|
|
142
142
|
)
|
|
143
143
|
),
|
|
144
144
|
success
|
|
@@ -163,11 +163,11 @@ export const matchAsyncDataArray: {
|
|
|
163
163
|
readonly Success: (value: RefSubject.RefSubject<never, never, A>, key: K) => Fx.Fx<R5, E5, F>
|
|
164
164
|
}
|
|
165
165
|
): <R, E>(
|
|
166
|
-
fx: Fx.Fx<R, E, AsyncData.AsyncData<
|
|
166
|
+
fx: Fx.Fx<R, E, AsyncData.AsyncData<ReadonlyArray<A>, E1>>
|
|
167
167
|
) => Fx.Fx<Scope.Scope | R | R2 | R3 | R4 | R5, E | E2 | E3 | E4 | E5, B | C | D | ReadonlyArray<F>>
|
|
168
168
|
|
|
169
169
|
<R, E, E1, A, K extends PropertyKey, R2, E2, B, R3, E3, C, R4, E4, D, R5, E5, F>(
|
|
170
|
-
fx: Fx.Fx<R, E, AsyncData.AsyncData<
|
|
170
|
+
fx: Fx.Fx<R, E, AsyncData.AsyncData<ReadonlyArray<A>, E1>>,
|
|
171
171
|
getKey: (a: A) => K,
|
|
172
172
|
matchers: {
|
|
173
173
|
readonly NoData: Fx.Fx<R2, E2, B>
|
|
@@ -179,7 +179,7 @@ export const matchAsyncDataArray: {
|
|
|
179
179
|
} = dual(
|
|
180
180
|
3,
|
|
181
181
|
function matchAsyncDataArray<R, E, E1, A, K extends PropertyKey, R2, E2, B, R3, E3, C, R4, E4, D, R5, E5, F>(
|
|
182
|
-
fx: Fx.Fx<R, E, AsyncData.AsyncData<
|
|
182
|
+
fx: Fx.Fx<R, E, AsyncData.AsyncData<ReadonlyArray<A>, E1>>,
|
|
183
183
|
getKey: (a: A) => K,
|
|
184
184
|
matchers: {
|
|
185
185
|
readonly NoData: Fx.Fx<R2, E2, B>
|
|
@@ -206,17 +206,17 @@ export const matchAsyncDataArray: {
|
|
|
206
206
|
* @since 1.20.0
|
|
207
207
|
*/
|
|
208
208
|
export const runIfNoData: {
|
|
209
|
-
<R2,
|
|
210
|
-
effect: Effect.Effect<
|
|
211
|
-
): <R>(ref: RefAsyncData<
|
|
209
|
+
<R2, A, E>(
|
|
210
|
+
effect: Effect.Effect<A, E, R2>
|
|
211
|
+
): <R>(ref: RefAsyncData<A, E, R>) => Effect.Effect<AsyncData.AsyncData<A, E>, never, R | R2>
|
|
212
212
|
<R, E, A, R2>(
|
|
213
|
-
ref: RefAsyncData<
|
|
214
|
-
effect: Effect.Effect<
|
|
215
|
-
): Effect.Effect<
|
|
213
|
+
ref: RefAsyncData<A, E, R>,
|
|
214
|
+
effect: Effect.Effect<A, E, R2>
|
|
215
|
+
): Effect.Effect<AsyncData.AsyncData<A, E>, never, R | R2>
|
|
216
216
|
} = dual(2, function runIfNoData<R, E, A, R2>(
|
|
217
|
-
ref: RefAsyncData<
|
|
218
|
-
effect: Effect.Effect<
|
|
219
|
-
): Effect.Effect<
|
|
217
|
+
ref: RefAsyncData<A, E, R>,
|
|
218
|
+
effect: Effect.Effect<A, E, R2>
|
|
219
|
+
): Effect.Effect<AsyncData.AsyncData<A, E>, never, R | R2> {
|
|
220
220
|
return Effect.flatMap(
|
|
221
221
|
ref,
|
|
222
222
|
(current) => AsyncData.isNoData(current) ? runAsyncData(ref, effect) : Effect.succeed(current)
|
|
@@ -227,21 +227,21 @@ export const runIfNoData: {
|
|
|
227
227
|
* @since 1.20.0
|
|
228
228
|
*/
|
|
229
229
|
export const runIfExpired: {
|
|
230
|
-
<R2,
|
|
231
|
-
effect: Effect.Effect<
|
|
230
|
+
<R2, A, E>(
|
|
231
|
+
effect: Effect.Effect<A, E, R2>,
|
|
232
232
|
options: { readonly ttl: Duration.DurationInput; readonly now?: number }
|
|
233
|
-
): <R>(ref: RefAsyncData<
|
|
233
|
+
): <R>(ref: RefAsyncData<A, E, R>) => Effect.Effect<AsyncData.AsyncData<A, E>, never, R | R2>
|
|
234
234
|
|
|
235
235
|
<R, E, A, R2>(
|
|
236
|
-
ref: RefAsyncData<
|
|
237
|
-
effect: Effect.Effect<
|
|
236
|
+
ref: RefAsyncData<A, E, R>,
|
|
237
|
+
effect: Effect.Effect<A, E, R2>,
|
|
238
238
|
options: { readonly ttl: Duration.DurationInput; readonly now?: number }
|
|
239
|
-
): Effect.Effect<
|
|
239
|
+
): Effect.Effect<AsyncData.AsyncData<A, E>, never, R | R2>
|
|
240
240
|
} = dual(3, function runIfExpired<R, E, A, R2>(
|
|
241
|
-
ref: RefAsyncData<
|
|
242
|
-
effect: Effect.Effect<
|
|
241
|
+
ref: RefAsyncData<A, E, R>,
|
|
242
|
+
effect: Effect.Effect<A, E, R2>,
|
|
243
243
|
{ now, ttl }: { readonly ttl: Duration.DurationInput; readonly now?: number }
|
|
244
|
-
): Effect.Effect<
|
|
244
|
+
): Effect.Effect<AsyncData.AsyncData<A, E>, never, R | R2> {
|
|
245
245
|
return Effect.flatMap(
|
|
246
246
|
ref,
|
|
247
247
|
(current) => AsyncData.isExpired(current, ttl, now) ? runAsyncData(ref, effect) : Effect.succeed(current)
|
|
@@ -253,9 +253,9 @@ export const runIfExpired: {
|
|
|
253
253
|
* @since 1.20.0
|
|
254
254
|
* @category updates
|
|
255
255
|
*/
|
|
256
|
-
export const awaitLoading = <
|
|
257
|
-
data: RefAsyncData<
|
|
258
|
-
): Effect.Effect<
|
|
256
|
+
export const awaitLoading = <A, E, R>(
|
|
257
|
+
data: RefAsyncData<A, E, R>
|
|
258
|
+
): Effect.Effect<Exclude<AsyncData.AsyncData<A, E>, AsyncData.Loading>, never, R | Scope.Scope> =>
|
|
259
259
|
data.pipe(
|
|
260
260
|
Fx.dropWhile(AsyncData.isLoading),
|
|
261
261
|
Fx.take(1),
|
|
@@ -268,9 +268,9 @@ export const awaitLoading = <R, E, A>(
|
|
|
268
268
|
* @since 1.20.0
|
|
269
269
|
* @category updates
|
|
270
270
|
*/
|
|
271
|
-
export const awaitLoadingOrRefreshing = <
|
|
272
|
-
data: RefAsyncData<
|
|
273
|
-
): Effect.Effect<
|
|
271
|
+
export const awaitLoadingOrRefreshing = <A, E, R>(
|
|
272
|
+
data: RefAsyncData<A, E, R>
|
|
273
|
+
): Effect.Effect<Exclude<AsyncData.AsyncData<A, E>, AsyncData.Loading>, never, R | Scope.Scope> =>
|
|
274
274
|
data.pipe(
|
|
275
275
|
Fx.dropWhile(AsyncData.isLoadingOrRefreshing),
|
|
276
276
|
Fx.take(1),
|
|
@@ -283,9 +283,9 @@ export const awaitLoadingOrRefreshing = <R, E, A>(
|
|
|
283
283
|
* @since 1.20.0
|
|
284
284
|
* @category updates
|
|
285
285
|
*/
|
|
286
|
-
export const startLoading: <
|
|
287
|
-
ref: RefAsyncData<
|
|
288
|
-
) => Effect.Effect<
|
|
286
|
+
export const startLoading: <A, E, R>(
|
|
287
|
+
ref: RefAsyncData<A, E, R>
|
|
288
|
+
) => Effect.Effect<AsyncData.AsyncData<A, E>, never, R> = <A, E, R>(ref: RefAsyncData<A, E, R>) =>
|
|
289
289
|
RefSubject.update(ref, AsyncData.startLoading)
|
|
290
290
|
|
|
291
291
|
/**
|
|
@@ -293,9 +293,9 @@ export const startLoading: <R, E, A>(
|
|
|
293
293
|
* @since 1.20.0
|
|
294
294
|
* @category updates
|
|
295
295
|
*/
|
|
296
|
-
export const stopLoading: <
|
|
297
|
-
ref: RefAsyncData<
|
|
298
|
-
) => Effect.Effect<
|
|
296
|
+
export const stopLoading: <A, E, R>(
|
|
297
|
+
ref: RefAsyncData<A, E, R>
|
|
298
|
+
) => Effect.Effect<AsyncData.AsyncData<A, E>, never, R> = <A, E, R>(ref: RefAsyncData<A, E, R>) =>
|
|
299
299
|
RefSubject.update(ref, AsyncData.stopLoading)
|
|
300
300
|
|
|
301
301
|
/**
|
|
@@ -303,7 +303,7 @@ export const stopLoading: <R, E, A>(
|
|
|
303
303
|
* @since 1.20.0
|
|
304
304
|
* @category conversions
|
|
305
305
|
*/
|
|
306
|
-
export const asSink = <
|
|
306
|
+
export const asSink = <A, E, R>(ref: RefAsyncData<A, E, R>): Sink.Sink<R, E, A> =>
|
|
307
307
|
Sink.make(
|
|
308
308
|
(cause) => RefSubject.set(ref, AsyncData.failCause(cause)),
|
|
309
309
|
(a) => RefSubject.set(ref, AsyncData.success(a))
|
|
@@ -314,8 +314,8 @@ export const asSink = <R, E, A>(ref: RefAsyncData<R, E, A>): Sink.Sink<R, E, A>
|
|
|
314
314
|
* @since 1.20.0
|
|
315
315
|
*/
|
|
316
316
|
export const mapInputEffect = <R, E, A, R2, B>(
|
|
317
|
-
ref: RefAsyncData<
|
|
318
|
-
f: (b: B) => Effect.Effect<
|
|
317
|
+
ref: RefAsyncData<A, E, R>,
|
|
318
|
+
f: (b: B) => Effect.Effect<A, E, R2>
|
|
319
319
|
): Sink.Sink<R | R2, E, B> => Sink.mapEffect(asSink(ref), f)
|
|
320
320
|
|
|
321
321
|
/**
|
|
@@ -323,7 +323,7 @@ export const mapInputEffect = <R, E, A, R2, B>(
|
|
|
323
323
|
* @since 1.20.0
|
|
324
324
|
*/
|
|
325
325
|
export const mapInput = <R, E, A, B>(
|
|
326
|
-
ref: RefAsyncData<
|
|
326
|
+
ref: RefAsyncData<A, E, R>,
|
|
327
327
|
f: (b: B) => A
|
|
328
328
|
): Sink.Sink<R, E, B> => Sink.map(asSink(ref), f)
|
|
329
329
|
|
|
@@ -337,15 +337,15 @@ export const failCause: {
|
|
|
337
337
|
<E>(
|
|
338
338
|
cause: Cause.Cause<E>,
|
|
339
339
|
options?: AsyncData.OptionalPartial<AsyncData.FailureOptions>
|
|
340
|
-
): <R, A>(ref: RefAsyncData<
|
|
340
|
+
): <R, A>(ref: RefAsyncData<A, E, R>) => Effect.Effect<AsyncData.AsyncData<A, E>, never, R>
|
|
341
341
|
|
|
342
|
-
<
|
|
343
|
-
ref: RefAsyncData<
|
|
342
|
+
<A, E, R>(
|
|
343
|
+
ref: RefAsyncData<A, E, R>,
|
|
344
344
|
cause: Cause.Cause<E>,
|
|
345
345
|
options?: AsyncData.OptionalPartial<AsyncData.FailureOptions>
|
|
346
|
-
): Effect.Effect<
|
|
347
|
-
} = dual(isRefFirst, <
|
|
348
|
-
ref: RefAsyncData<
|
|
346
|
+
): Effect.Effect<AsyncData.AsyncData<A, E>, never, R>
|
|
347
|
+
} = dual(isRefFirst, <A, E, R>(
|
|
348
|
+
ref: RefAsyncData<A, E, R>,
|
|
349
349
|
cause: Cause.Cause<E>,
|
|
350
350
|
options?: AsyncData.OptionalPartial<AsyncData.FailureOptions>
|
|
351
351
|
) => RefSubject.set(ref, AsyncData.failCause(cause, options)))
|
|
@@ -358,15 +358,15 @@ export const fail: {
|
|
|
358
358
|
<E>(
|
|
359
359
|
error: E,
|
|
360
360
|
options?: AsyncData.OptionalPartial<AsyncData.FailureOptions>
|
|
361
|
-
): <R, A>(ref: RefAsyncData<
|
|
361
|
+
): <R, A>(ref: RefAsyncData<A, E, R>) => Effect.Effect<AsyncData.AsyncData<A, E>, never, R>
|
|
362
362
|
|
|
363
|
-
<
|
|
364
|
-
ref: RefAsyncData<
|
|
363
|
+
<A, E, R>(
|
|
364
|
+
ref: RefAsyncData<A, E, R>,
|
|
365
365
|
error: E,
|
|
366
366
|
options?: AsyncData.OptionalPartial<AsyncData.FailureOptions>
|
|
367
|
-
): Effect.Effect<
|
|
368
|
-
} = dual(isRefFirst, <
|
|
369
|
-
ref: RefAsyncData<
|
|
367
|
+
): Effect.Effect<AsyncData.AsyncData<A, E>, never, R>
|
|
368
|
+
} = dual(isRefFirst, <A, E, R>(
|
|
369
|
+
ref: RefAsyncData<A, E, R>,
|
|
370
370
|
error: E,
|
|
371
371
|
options?: AsyncData.OptionalPartial<AsyncData.FailureOptions>
|
|
372
372
|
) => RefSubject.set(ref, AsyncData.fail(error, options)))
|
|
@@ -379,17 +379,17 @@ export const succeed: {
|
|
|
379
379
|
<A>(
|
|
380
380
|
value: A,
|
|
381
381
|
options?: AsyncData.OptionalPartial<AsyncData.SuccessOptions>
|
|
382
|
-
): <R, E>(ref: RefAsyncData<
|
|
382
|
+
): <R, E>(ref: RefAsyncData<A, E, R>) => Effect.Effect<AsyncData.AsyncData<A, E>, never, R>
|
|
383
383
|
|
|
384
|
-
<
|
|
385
|
-
ref: RefAsyncData<
|
|
384
|
+
<A, E, R>(
|
|
385
|
+
ref: RefAsyncData<A, E, R>,
|
|
386
386
|
value: A,
|
|
387
387
|
options?: AsyncData.OptionalPartial<AsyncData.SuccessOptions>
|
|
388
|
-
): Effect.Effect<
|
|
388
|
+
): Effect.Effect<AsyncData.AsyncData<A, E>, never, R>
|
|
389
389
|
} = dual(
|
|
390
390
|
isRefFirst,
|
|
391
|
-
<
|
|
392
|
-
ref: RefAsyncData<
|
|
391
|
+
<A, E, R>(
|
|
392
|
+
ref: RefAsyncData<A, E, R>,
|
|
393
393
|
value: A,
|
|
394
394
|
options?: AsyncData.OptionalPartial<AsyncData.SuccessOptions>
|
|
395
395
|
) => RefSubject.set(ref, AsyncData.success(value, options))
|
|
@@ -403,17 +403,17 @@ export const optimistic: {
|
|
|
403
403
|
<A>(
|
|
404
404
|
value: A,
|
|
405
405
|
options?: AsyncData.OptionalPartial<AsyncData.OptimisticOptions>
|
|
406
|
-
): <R, E>(ref: RefAsyncData<
|
|
406
|
+
): <R, E>(ref: RefAsyncData<A, E, R>) => Effect.Effect<AsyncData.AsyncData<A, E>, never, R>
|
|
407
407
|
|
|
408
|
-
<
|
|
409
|
-
ref: RefAsyncData<
|
|
408
|
+
<A, E, R>(
|
|
409
|
+
ref: RefAsyncData<A, E, R>,
|
|
410
410
|
value: A,
|
|
411
411
|
options?: AsyncData.OptionalPartial<AsyncData.OptimisticOptions>
|
|
412
|
-
): Effect.Effect<
|
|
412
|
+
): Effect.Effect<AsyncData.AsyncData<A, E>, never, R>
|
|
413
413
|
} = dual(
|
|
414
414
|
isRefFirst,
|
|
415
|
-
<
|
|
416
|
-
ref: RefAsyncData<
|
|
415
|
+
<A, E, R>(
|
|
416
|
+
ref: RefAsyncData<A, E, R>,
|
|
417
417
|
value: A,
|
|
418
418
|
options?: AsyncData.OptionalPartial<AsyncData.OptimisticOptions>
|
|
419
419
|
) => RefSubject.update(ref, AsyncData.optimistic(value, options))
|
|
@@ -424,13 +424,13 @@ export const optimistic: {
|
|
|
424
424
|
* @since 1.20.0
|
|
425
425
|
*/
|
|
426
426
|
export const done: {
|
|
427
|
-
<E, A>(exit: Exit.Exit<
|
|
428
|
-
<
|
|
427
|
+
<E, A>(exit: Exit.Exit<A, E>): <R>(ref: RefAsyncData<A, E, R>) => Effect.Effect<AsyncData.AsyncData<A, E>, never, R>
|
|
428
|
+
<A, E, R>(ref: RefAsyncData<A, E, R>, exit: Exit.Exit<A, E>): Effect.Effect<AsyncData.AsyncData<A, E>, never, R>
|
|
429
429
|
} = dual(
|
|
430
430
|
2,
|
|
431
|
-
<
|
|
432
|
-
ref: RefAsyncData<
|
|
433
|
-
exit: Exit.Exit<
|
|
431
|
+
<A, E, R>(
|
|
432
|
+
ref: RefAsyncData<A, E, R>,
|
|
433
|
+
exit: Exit.Exit<A, E>
|
|
434
434
|
) => RefSubject.set(ref, AsyncData.done(exit))
|
|
435
435
|
)
|
|
436
436
|
|
|
@@ -438,12 +438,12 @@ export const done: {
|
|
|
438
438
|
* @since 1.20.0
|
|
439
439
|
* @category Filtered
|
|
440
440
|
*/
|
|
441
|
-
export const getFailure = <
|
|
441
|
+
export const getFailure = <A, E, R>(ref: RefAsyncData<A, E, R>): RefSubject.Filtered<R, never, E> =>
|
|
442
442
|
RefSubject.filterMap(ref, AsyncData.getFailure)
|
|
443
443
|
|
|
444
444
|
/**
|
|
445
445
|
* @since 1.20.0
|
|
446
446
|
* @category Filtered
|
|
447
447
|
*/
|
|
448
|
-
export const getSuccess = <
|
|
448
|
+
export const getSuccess = <A, E, R>(ref: RefAsyncData<A, E, R>): RefSubject.Filtered<R, never, A> =>
|
|
449
449
|
RefSubject.filterMap(ref, AsyncData.getSuccess)
|
package/src/Emitter.ts
CHANGED
|
@@ -15,11 +15,11 @@ import * as Sink from "./Sink.js"
|
|
|
15
15
|
* @since 1.20.0
|
|
16
16
|
*/
|
|
17
17
|
export interface Emitter<in E, in A> {
|
|
18
|
-
readonly succeed: (value: A) => Promise<Exit.Exit<
|
|
19
|
-
readonly failCause: (cause: Cause.Cause<E>) => Promise<Exit.Exit<
|
|
20
|
-
readonly fail: (error: E) => Promise<Exit.Exit<
|
|
21
|
-
readonly die: (error: unknown) => Promise<Exit.Exit<
|
|
22
|
-
readonly end: () => Promise<Exit.Exit<
|
|
18
|
+
readonly succeed: (value: A) => Promise<Exit.Exit<unknown>>
|
|
19
|
+
readonly failCause: (cause: Cause.Cause<E>) => Promise<Exit.Exit<unknown>>
|
|
20
|
+
readonly fail: (error: E) => Promise<Exit.Exit<unknown>>
|
|
21
|
+
readonly die: (error: unknown) => Promise<Exit.Exit<unknown>>
|
|
22
|
+
readonly end: () => Promise<Exit.Exit<unknown>>
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
/**
|
|
@@ -27,16 +27,16 @@ export interface Emitter<in E, in A> {
|
|
|
27
27
|
*/
|
|
28
28
|
export function withEmitter<R, E, A, R2, B>(
|
|
29
29
|
sink: Sink.Sink<R, E, A>,
|
|
30
|
-
f: (emitter: Emitter<E, A>) => Effect.Effect<
|
|
31
|
-
): Effect.Effect<R | R2 | Scope.Scope
|
|
30
|
+
f: (emitter: Emitter<E, A>) => Effect.Effect<B, E, R2>
|
|
31
|
+
): Effect.Effect<void, never, R | R2 | Scope.Scope> {
|
|
32
32
|
return withScope(
|
|
33
33
|
(scope) =>
|
|
34
34
|
Sink.withEarlyExit(
|
|
35
35
|
sink,
|
|
36
|
-
(sink): Effect.Effect<R | R2
|
|
36
|
+
(sink): Effect.Effect<B, E, R | R2> => {
|
|
37
37
|
return Effect.flatMap(Effect.runtime<R>(), (runtime) => {
|
|
38
38
|
const runFork = Runtime.runFork(runtime)
|
|
39
|
-
const run = <E, A>(effect: Effect.Effect<
|
|
39
|
+
const run = <E, A>(effect: Effect.Effect<A, E, R>): Promise<Exit.Exit<A, E>> =>
|
|
40
40
|
new Promise((resolve) => {
|
|
41
41
|
const fiber = runFork(effect, { scope })
|
|
42
42
|
fiber.addObserver(resolve)
|
package/src/Form.ts
CHANGED
|
@@ -63,9 +63,9 @@ export namespace Form {
|
|
|
63
63
|
readonly entries: Entries
|
|
64
64
|
|
|
65
65
|
readonly schema: S.Schema<
|
|
66
|
-
|
|
66
|
+
O,
|
|
67
67
|
I,
|
|
68
|
-
|
|
68
|
+
R
|
|
69
69
|
>
|
|
70
70
|
|
|
71
71
|
readonly get: <K extends keyof Entries>(key: K) => Entries[K]
|
|
@@ -139,9 +139,9 @@ export namespace Form {
|
|
|
139
139
|
*/
|
|
140
140
|
export interface Derived<R, R2, Entries extends AnyEntries> extends Form<R, Entries> {
|
|
141
141
|
readonly persist: Effect.Effect<
|
|
142
|
-
|
|
142
|
+
Output<Entries>,
|
|
143
143
|
Error<Entries>,
|
|
144
|
-
|
|
144
|
+
R2
|
|
145
145
|
>
|
|
146
146
|
}
|
|
147
147
|
}
|
|
@@ -161,17 +161,21 @@ export type MakeForm<
|
|
|
161
161
|
I extends AnyObject,
|
|
162
162
|
O extends AnyObjectWithKeys<keyof I>
|
|
163
163
|
> = {
|
|
164
|
-
<R, E>(
|
|
165
|
-
R
|
|
166
|
-
|
|
164
|
+
<R, E>(
|
|
165
|
+
fx: RefSubject.RefSubject<R, E, O>
|
|
166
|
+
): Effect.Effect<
|
|
167
167
|
[DerivedFromIO<R, never, E, I, O>] extends [Form.Derived<infer R, never, infer R2>] ? Form.Derived<R, never, R2>
|
|
168
|
-
: never
|
|
168
|
+
: never,
|
|
169
|
+
never,
|
|
170
|
+
R | Scope.Scope
|
|
169
171
|
>
|
|
170
172
|
|
|
171
|
-
<R, E>(
|
|
172
|
-
R |
|
|
173
|
+
<R, E>(
|
|
174
|
+
fx: Fx<R, E, O> | Effect.Effect<O, E, R>
|
|
175
|
+
): Effect.Effect<
|
|
176
|
+
[FormFromIO<R0, E, I, O>] extends [Form<infer R1, infer R2>] ? Form<R1, R2> : never,
|
|
173
177
|
never,
|
|
174
|
-
|
|
178
|
+
R | Scope.Scope
|
|
175
179
|
>
|
|
176
180
|
}
|
|
177
181
|
|
|
@@ -183,17 +187,21 @@ export type MakeInputForm<
|
|
|
183
187
|
I extends AnyObject,
|
|
184
188
|
O extends AnyObjectWithKeys<keyof I>
|
|
185
189
|
> = {
|
|
186
|
-
<R, E>(
|
|
187
|
-
R
|
|
188
|
-
|
|
190
|
+
<R, E>(
|
|
191
|
+
fx: RefSubject.RefSubject<R, E, I>
|
|
192
|
+
): Effect.Effect<
|
|
189
193
|
[DerivedFromIO<R0 | R, never, E, I, O>] extends [Form.Derived<infer R, infer _, infer R2>] ? Form.Derived<R, _, R2>
|
|
190
|
-
: never
|
|
194
|
+
: never,
|
|
195
|
+
never,
|
|
196
|
+
R | Scope.Scope
|
|
191
197
|
>
|
|
192
198
|
|
|
193
|
-
<R, E>(
|
|
194
|
-
R |
|
|
199
|
+
<R, E>(
|
|
200
|
+
fx: Fx<R, E, I> | Effect.Effect<I, E, R>
|
|
201
|
+
): Effect.Effect<
|
|
202
|
+
[FormFromIO<R0, E, I, O>] extends [Form<infer R1, infer R2>] ? Form<R1, R2> : never,
|
|
195
203
|
never,
|
|
196
|
-
|
|
204
|
+
R | Scope.Scope
|
|
197
205
|
>
|
|
198
206
|
}
|
|
199
207
|
|
|
@@ -249,7 +257,7 @@ export function derive<
|
|
|
249
257
|
R0,
|
|
250
258
|
I extends Partial<Readonly<Record<PropertyKey, any>>>,
|
|
251
259
|
O extends Partial<{ readonly [K in keyof I]: any }>
|
|
252
|
-
>(schema: S.Schema<
|
|
260
|
+
>(schema: S.Schema<O, I, R0>): MakeForm<R0, I, O> {
|
|
253
261
|
return (input) =>
|
|
254
262
|
Effect.map(deriveMakeEntries(input, schema.ast), (entries) => {
|
|
255
263
|
const form = (Form as any)(entries)
|
|
@@ -275,8 +283,8 @@ export function deriveInput<
|
|
|
275
283
|
R0,
|
|
276
284
|
I extends Partial<Readonly<Record<PropertyKey, any>>>,
|
|
277
285
|
O extends Partial<AnyObjectWithKeys<keyof I>>
|
|
278
|
-
>(schema: S.Schema<
|
|
279
|
-
return <R, E>(input: RefSubject.RefSubject<R, E, I> | Fx<R, E, I> | Effect.Effect<
|
|
286
|
+
>(schema: S.Schema<O, I, R0>): MakeInputForm<R0, I, O> {
|
|
287
|
+
return <R, E>(input: RefSubject.RefSubject<R, E, I> | Fx<R, E, I> | Effect.Effect<I, E, R>) =>
|
|
280
288
|
Effect.map(deriveMakeInputEntries(input, schema.ast), (entries) => {
|
|
281
289
|
const form = (Form as any)(entries)
|
|
282
290
|
|
|
@@ -310,7 +318,7 @@ class FormImpl<Entries extends Form.AnyEntries> extends FxEffectBase<
|
|
|
310
318
|
> implements Form<Form.Context<Entries>, Entries> {
|
|
311
319
|
readonly [FormTypeId]: FormTypeId = FormTypeId
|
|
312
320
|
private _fx: Fx<Scope.Scope, ParseError | Form.Error<Entries>, Form.Input<Entries>>
|
|
313
|
-
readonly version: Effect.Effect<
|
|
321
|
+
readonly version: Effect.Effect<number>
|
|
314
322
|
|
|
315
323
|
constructor(readonly entries: Entries) {
|
|
316
324
|
super()
|
|
@@ -318,11 +326,7 @@ class FormImpl<Entries extends Form.AnyEntries> extends FxEffectBase<
|
|
|
318
326
|
this.schema = buildSchema(entries)
|
|
319
327
|
this.version = Effect.map(
|
|
320
328
|
// @ts-ignore Infinite type instantiation
|
|
321
|
-
Effect.all(Object.values(entries).map((e) => e.version)) as Effect.Effect<
|
|
322
|
-
never,
|
|
323
|
-
never,
|
|
324
|
-
ReadonlyArray<number>
|
|
325
|
-
>,
|
|
329
|
+
Effect.all(Object.values(entries).map((e) => e.version)) as Effect.Effect<ReadonlyArray<number>>,
|
|
326
330
|
(versions) => versions.reduce((a, b) => a + b, 0)
|
|
327
331
|
)
|
|
328
332
|
|
|
@@ -340,15 +344,11 @@ class FormImpl<Entries extends Form.AnyEntries> extends FxEffectBase<
|
|
|
340
344
|
|
|
341
345
|
run<R3>(
|
|
342
346
|
sink: Sink.Sink<R3, Form.Error<Entries> | ParseError, Form.Input<Entries>>
|
|
343
|
-
): Effect.Effect<R3 | Scope.Scope
|
|
347
|
+
): Effect.Effect<unknown, never, R3 | Scope.Scope> {
|
|
344
348
|
return this._fx.run(sink)
|
|
345
349
|
}
|
|
346
350
|
|
|
347
|
-
toEffect(): Effect.Effect<
|
|
348
|
-
never,
|
|
349
|
-
Form.Error<Entries> | ParseError,
|
|
350
|
-
Form.Input<Entries>
|
|
351
|
-
> {
|
|
351
|
+
toEffect(): Effect.Effect<Form.Input<Entries>, Form.Error<Entries> | ParseError> {
|
|
352
352
|
return (
|
|
353
353
|
Effect.all(this.entries, { concurrency: "unbounded" }) as any
|
|
354
354
|
)
|
|
@@ -362,7 +362,7 @@ class FormImpl<Entries extends Form.AnyEntries> extends FxEffectBase<
|
|
|
362
362
|
|
|
363
363
|
function buildSchema<Entries extends Form.AnyEntries>(
|
|
364
364
|
entries: Entries
|
|
365
|
-
): S.Schema<Form.
|
|
365
|
+
): S.Schema<Form.Output<Entries>, Form.Input<Entries>, Form.Context<Entries>> {
|
|
366
366
|
const schemas: any = {}
|
|
367
367
|
|
|
368
368
|
for (const key of Reflect.ownKeys(entries)) {
|
|
@@ -389,9 +389,9 @@ const deriveMakeEntries = <
|
|
|
389
389
|
I extends Readonly<Record<PropertyKey, any>>,
|
|
390
390
|
O extends Readonly<Record<keyof I, any>>
|
|
391
391
|
>(
|
|
392
|
-
input: RefSubject.RefSubject<R, E, O> | Fx<R, E, O> | Effect.Effect<
|
|
392
|
+
input: RefSubject.RefSubject<R, E, O> | Fx<R, E, O> | Effect.Effect<O, E, R>,
|
|
393
393
|
ast: AST.AST
|
|
394
|
-
): Effect.Effect<
|
|
394
|
+
): Effect.Effect<DeriveEntries<R, E, I, O>, never, R | Scope.Scope> =>
|
|
395
395
|
Effect.suspend(() => {
|
|
396
396
|
switch (ast._tag) {
|
|
397
397
|
case "TypeLiteral": {
|
|
@@ -439,9 +439,9 @@ const deriveMakeInputEntries = <
|
|
|
439
439
|
I extends Readonly<Record<PropertyKey, any>>,
|
|
440
440
|
O extends Readonly<Record<keyof I, any>>
|
|
441
441
|
>(
|
|
442
|
-
input: RefSubject.RefSubject<R, E, I> | Fx<R, E, I> | Effect.Effect<
|
|
442
|
+
input: RefSubject.RefSubject<R, E, I> | Fx<R, E, I> | Effect.Effect<I, E, R>,
|
|
443
443
|
ast: AST.AST
|
|
444
|
-
): Effect.Effect<
|
|
444
|
+
): Effect.Effect<DeriveEntries<R, E, I, O>, never, R | Scope.Scope> =>
|
|
445
445
|
Effect.suspend(() => {
|
|
446
446
|
switch (ast._tag) {
|
|
447
447
|
case "TypeLiteral": {
|
|
@@ -489,7 +489,7 @@ const propOf = <R, E, O>(
|
|
|
489
489
|
| RefSubject.Computed<R, E, O>
|
|
490
490
|
| RefSubject.Filtered<R, E, O>
|
|
491
491
|
| Fx<R, E, O>
|
|
492
|
-
| Effect.Effect<
|
|
492
|
+
| Effect.Effect<O, E, R>,
|
|
493
493
|
key: keyof O
|
|
494
494
|
) => {
|
|
495
495
|
if (TypeId in input) return core.map(input, (o) => o[key])
|