@typed/fx 1.9.2 → 1.10.1
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/catchAllCause.d.ts.map +1 -1
- package/dist/catchAllCause.js +7 -6
- package/dist/catchAllCause.js.map +1 -1
- package/dist/cjs/catchAllCause.d.ts.map +1 -1
- package/dist/cjs/catchAllCause.js +6 -5
- package/dist/cjs/catchAllCause.js.map +1 -1
- package/dist/cjs/combineAllDiscard.d.ts +3 -0
- package/dist/cjs/combineAllDiscard.d.ts.map +1 -0
- package/dist/cjs/combineAllDiscard.js +26 -0
- package/dist/cjs/combineAllDiscard.js.map +1 -0
- package/dist/cjs/data-first.d.ts +2 -0
- package/dist/cjs/data-first.d.ts.map +1 -1
- package/dist/cjs/data-first.js +2 -0
- package/dist/cjs/data-first.js.map +1 -1
- package/dist/cjs/exhaustMap.d.ts.map +1 -1
- package/dist/cjs/exhaustMap.js +4 -3
- package/dist/cjs/exhaustMap.js.map +1 -1
- package/dist/cjs/exhaustMapCause.d.ts.map +1 -1
- package/dist/cjs/exhaustMapCause.js +4 -3
- package/dist/cjs/exhaustMapCause.js.map +1 -1
- package/dist/cjs/exhaustMapLatest.d.ts.map +1 -1
- package/dist/cjs/exhaustMapLatest.js +5 -4
- package/dist/cjs/exhaustMapLatest.js.map +1 -1
- package/dist/cjs/exhaustMapLatestCause.d.ts.map +1 -1
- package/dist/cjs/exhaustMapLatestCause.js +5 -4
- package/dist/cjs/exhaustMapLatestCause.js.map +1 -1
- package/dist/cjs/flatMap.d.ts.map +1 -1
- package/dist/cjs/flatMap.js +9 -8
- package/dist/cjs/flatMap.js.map +1 -1
- package/dist/cjs/index.d.ts +10 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +7 -3
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/mergeAll.d.ts +1 -0
- package/dist/cjs/mergeAll.d.ts.map +1 -1
- package/dist/cjs/mergeAll.js +7 -1
- package/dist/cjs/mergeAll.js.map +1 -1
- package/dist/cjs/scoped.d.ts +4 -0
- package/dist/cjs/scoped.d.ts.map +1 -0
- package/dist/cjs/scoped.js +10 -0
- package/dist/cjs/scoped.js.map +1 -0
- package/dist/cjs/snapshotEffect.d.ts.map +1 -1
- package/dist/cjs/snapshotEffect.js +4 -3
- package/dist/cjs/snapshotEffect.js.map +1 -1
- package/dist/cjs/switchMap.d.ts.map +1 -1
- package/dist/cjs/switchMap.js +12 -8
- package/dist/cjs/switchMap.js.map +1 -1
- package/dist/cjs/switchMapCause.d.ts.map +1 -1
- package/dist/cjs/switchMapCause.js +4 -3
- package/dist/cjs/switchMapCause.js.map +1 -1
- package/dist/cjs/switchMatch.d.ts.map +1 -1
- package/dist/cjs/switchMatch.js +4 -3
- package/dist/cjs/switchMatch.js.map +1 -1
- package/dist/cjs/throttle.d.ts +1 -1
- package/dist/cjs/throttle.d.ts.map +1 -1
- package/dist/cjs/throttle.js +4 -4
- package/dist/cjs/throttle.js.map +1 -1
- package/dist/combineAllDiscard.d.ts +3 -0
- package/dist/combineAllDiscard.d.ts.map +1 -0
- package/dist/combineAllDiscard.js +22 -0
- package/dist/combineAllDiscard.js.map +1 -0
- package/dist/data-first.d.ts +2 -0
- package/dist/data-first.d.ts.map +1 -1
- package/dist/data-first.js +2 -0
- package/dist/data-first.js.map +1 -1
- package/dist/exhaustMap.d.ts.map +1 -1
- package/dist/exhaustMap.js +5 -4
- package/dist/exhaustMap.js.map +1 -1
- package/dist/exhaustMapCause.d.ts.map +1 -1
- package/dist/exhaustMapCause.js +5 -4
- package/dist/exhaustMapCause.js.map +1 -1
- package/dist/exhaustMapLatest.d.ts.map +1 -1
- package/dist/exhaustMapLatest.js +6 -5
- package/dist/exhaustMapLatest.js.map +1 -1
- package/dist/exhaustMapLatestCause.d.ts.map +1 -1
- package/dist/exhaustMapLatestCause.js +6 -5
- package/dist/exhaustMapLatestCause.js.map +1 -1
- package/dist/flatMap.d.ts.map +1 -1
- package/dist/flatMap.js +10 -9
- package/dist/flatMap.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/mergeAll.d.ts +1 -0
- package/dist/mergeAll.d.ts.map +1 -1
- package/dist/mergeAll.js +6 -1
- package/dist/mergeAll.js.map +1 -1
- package/dist/scoped.d.ts +4 -0
- package/dist/scoped.d.ts.map +1 -0
- package/dist/scoped.js +6 -0
- package/dist/scoped.js.map +1 -0
- package/dist/snapshotEffect.d.ts.map +1 -1
- package/dist/snapshotEffect.js +5 -4
- package/dist/snapshotEffect.js.map +1 -1
- package/dist/switchMap.d.ts.map +1 -1
- package/dist/switchMap.js +13 -9
- package/dist/switchMap.js.map +1 -1
- package/dist/switchMapCause.d.ts.map +1 -1
- package/dist/switchMapCause.js +5 -4
- package/dist/switchMapCause.js.map +1 -1
- package/dist/switchMatch.d.ts.map +1 -1
- package/dist/switchMatch.js +5 -4
- package/dist/switchMatch.js.map +1 -1
- package/dist/throttle.d.ts +1 -1
- package/dist/throttle.d.ts.map +1 -1
- package/dist/throttle.js +5 -5
- package/dist/throttle.js.map +1 -1
- package/dist/tsconfig.cjs.build.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/catchAllCause.ts +38 -43
- package/src/combineAllDiscard.ts +42 -0
- package/src/data-first.ts +2 -0
- package/src/exhaustMap.ts +32 -35
- package/src/exhaustMapCause.ts +32 -35
- package/src/exhaustMapLatest.ts +64 -68
- package/src/exhaustMapLatestCause.ts +64 -68
- package/src/flatMap.ts +38 -43
- package/src/index.ts +22 -0
- package/src/mergeAll.ts +10 -1
- package/src/scoped.ts +6 -0
- package/src/snapshotEffect.ts +23 -23
- package/src/switchMap.ts +27 -31
- package/src/switchMapCause.ts +29 -29
- package/src/switchMatch.ts +34 -35
- package/src/throttle.ts +32 -33
- package/tsconfig.build.tsbuildinfo +1 -1
package/src/flatMap.ts
CHANGED
|
@@ -1,62 +1,57 @@
|
|
|
1
1
|
import { pipe } from '@effect/data/Function'
|
|
2
2
|
|
|
3
3
|
import { Fx, Sink } from './Fx.js'
|
|
4
|
-
import { Cause, Effect, Fiber, Ref } from './externals.js'
|
|
4
|
+
import { Cause, Effect, Fiber, Ref, Runtime } from './externals.js'
|
|
5
5
|
import { fromEffect } from './fromEffect.js'
|
|
6
6
|
|
|
7
7
|
export function flatMap<R, E, A, R2, E2, B>(
|
|
8
8
|
fx: Fx<R, E, A>,
|
|
9
9
|
f: (a: A) => Fx<R2, E2, B>,
|
|
10
10
|
): Fx<R | R2, E | E2, B> {
|
|
11
|
-
return Fx((sink) =>
|
|
12
|
-
Effect.
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
return Fx(<R3>(sink: Sink<R3, E | E2, B>) =>
|
|
12
|
+
Effect.gen(function* ($) {
|
|
13
|
+
const runFork = Runtime.runFork(yield* $(Effect.runtime<R | R2 | R3>()))
|
|
14
|
+
const ref = yield* $(Ref.make<Set<Fiber.RuntimeFiber<never, void>>>(new Set()))
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
Cause.isInterruptedOnly(cause) ? Effect.unit() : sink.error(cause),
|
|
26
|
-
),
|
|
27
|
-
),
|
|
16
|
+
yield* $(
|
|
17
|
+
fx.run(
|
|
18
|
+
Sink(
|
|
19
|
+
(a: A) =>
|
|
20
|
+
Effect.gen(function* ($) {
|
|
21
|
+
const fiber = runFork(
|
|
22
|
+
f(a).run(
|
|
23
|
+
Sink(sink.event, (cause) =>
|
|
24
|
+
Cause.isInterruptedOnly(cause) ? Effect.unit() : sink.error(cause),
|
|
28
25
|
),
|
|
29
|
-
)
|
|
26
|
+
),
|
|
27
|
+
)
|
|
28
|
+
// Add Fiber to fibers
|
|
29
|
+
yield* $(Ref.update(ref, (fs) => fs.add(fiber)))
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
yield* $(Ref.update(ref, (fs) => [...fs, fiber]))
|
|
31
|
+
// When the fiber ends, we need to remove it from the list of fibers
|
|
33
32
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
)
|
|
46
|
-
}),
|
|
47
|
-
sink.error,
|
|
48
|
-
),
|
|
33
|
+
pipe(
|
|
34
|
+
Fiber.join(fiber),
|
|
35
|
+
Effect.flatMap(() => Ref.update(ref, (fs) => (fs.delete(fiber), fs))),
|
|
36
|
+
Effect.catchAllCause((cause) =>
|
|
37
|
+
Cause.isInterruptedOnly(cause) ? Effect.unit() : sink.error(cause),
|
|
38
|
+
),
|
|
39
|
+
// but don't allow this to be blocking
|
|
40
|
+
runFork,
|
|
41
|
+
)
|
|
42
|
+
}),
|
|
43
|
+
sink.error,
|
|
49
44
|
),
|
|
50
|
-
)
|
|
45
|
+
),
|
|
46
|
+
)
|
|
51
47
|
|
|
52
|
-
|
|
53
|
-
|
|
48
|
+
// Wait for the last fibers to finish
|
|
49
|
+
const fibers = yield* $(Ref.get(ref))
|
|
54
50
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
),
|
|
51
|
+
if (fibers.size > 0) {
|
|
52
|
+
yield* $(Fiber.joinAll(fibers))
|
|
53
|
+
}
|
|
54
|
+
}),
|
|
60
55
|
)
|
|
61
56
|
}
|
|
62
57
|
|
package/src/index.ts
CHANGED
|
@@ -106,6 +106,15 @@ export const combine: {
|
|
|
106
106
|
<R, E, A, R2, E2, B>(fx: Fx<R, E, A>, other: Fx<R2, E2, B>): Fx<R | R2, E | E2, readonly [A, B]>
|
|
107
107
|
} = dualWithTrace(2, (trace) => (fx, other) => internal.combine(fx, other).addTrace(trace))
|
|
108
108
|
|
|
109
|
+
export const combineAllDiscard: <FX extends readonly internal.Fx<any, any, any>[]>(
|
|
110
|
+
...fx: FX
|
|
111
|
+
) => internal.Fx<internal.Fx.ResourcesOf<FX[number]>, internal.Fx.ErrorsOf<FX[number]>, void> =
|
|
112
|
+
methodWithTrace(
|
|
113
|
+
(trace) =>
|
|
114
|
+
(...fx) =>
|
|
115
|
+
internal.combineAllDiscard(...fx).addTrace(trace),
|
|
116
|
+
)
|
|
117
|
+
|
|
109
118
|
export const continueWith: {
|
|
110
119
|
<R2, E2, B>(f: () => Fx<R2, E2, B>): <R, E, A>(fx: Fx<R, E, A>) => Fx<R | R2, E | E2, A | B>
|
|
111
120
|
|
|
@@ -137,6 +146,11 @@ export const continueWithEffect: {
|
|
|
137
146
|
internal.continueWithEffect(fx, f).addTrace(trace),
|
|
138
147
|
)
|
|
139
148
|
|
|
149
|
+
export const startWith: {
|
|
150
|
+
<B>(value: B): <R, E, A>(fx: Fx<R, E, A>) => Fx<R, E, A | B>
|
|
151
|
+
<R, E, A, B>(fx: Fx<R, E, A>, value: B): Fx<R, E, A | B>
|
|
152
|
+
} = dualWithTrace(2, (trace) => (fx, value) => internal.startWith(fx, value).addTrace(trace))
|
|
153
|
+
|
|
140
154
|
export const debounce: {
|
|
141
155
|
(duration: Duration): <R, E, A>(fx: Fx<R, E, A>) => Fx<R, E, A>
|
|
142
156
|
<R, E, A>(fx: Fx<R, E, A>, duration: Duration): Fx<R, E, A>
|
|
@@ -542,6 +556,11 @@ export const merge: {
|
|
|
542
556
|
<R, E, A, R2, E2, B>(fx: Fx<R, E, A>, other: Fx<R2, E2, B>): Fx<R | R2, E | E2, A | B>
|
|
543
557
|
} = dualWithTrace(2, (trace) => (fx, other) => internal.merge(fx, other).addTrace(trace))
|
|
544
558
|
|
|
559
|
+
export const mergeFirst: {
|
|
560
|
+
<R2, E2, B>(other: Fx<R2, E2, B>): <R, E, A>(fx: Fx<R, E, A>) => Fx<R | R2, E | E2, A>
|
|
561
|
+
<R, E, A, R2, E2, B>(fx: Fx<R, E, A>, other: Fx<R2, E2, B>): Fx<R | R2, E | E2, A>
|
|
562
|
+
} = dualWithTrace(2, (trace) => (fx, other) => internal.mergeFirst(fx, other).addTrace(trace))
|
|
563
|
+
|
|
545
564
|
export const multicast: <R, E, A>(fx: Fx<R, E, A>) => Fx<R, E, A> = methodWithTrace(
|
|
546
565
|
(trace) =>
|
|
547
566
|
<R, E, A>(fx: Fx<R, E, A>): Fx<R, E, A> =>
|
|
@@ -766,6 +785,9 @@ export const take: {
|
|
|
766
785
|
<R, E, A>(fx: Fx<R, E, A>, n: number): Fx<R, E, A>
|
|
767
786
|
} = dualWithTrace(2, (trace) => (fx, n) => internal.take(fx, n).addTrace(trace))
|
|
768
787
|
|
|
788
|
+
export const scoped: <R, E, A>(fx: Fx<R, E, A>) => Fx<Exclude<R, Scope.Scope>, E, A> =
|
|
789
|
+
methodWithTrace((trace) => (fx) => internal.scoped(fx).addTrace(trace))
|
|
790
|
+
|
|
769
791
|
export const snapshotEffect: {
|
|
770
792
|
<R2, E2, B, R3, E3, A, C>(sampled: Fx<R2, E2, B>, f: (a: A, b: B) => Effect.Effect<R3, E3, C>): <
|
|
771
793
|
R,
|
package/src/mergeAll.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Fx, Sink } from './Fx.js'
|
|
2
|
-
import { Cause, Effect } from './externals.js'
|
|
2
|
+
import { Cause, Effect, Option } from './externals.js'
|
|
3
|
+
import { compact } from './filterMap.js'
|
|
4
|
+
import { map } from './map.js'
|
|
3
5
|
|
|
4
6
|
export function mergeAll<FXS extends ReadonlyArray<Fx<any, any, any>>>(
|
|
5
7
|
...fxs: FXS
|
|
@@ -21,3 +23,10 @@ export function merge<R, E, A, R2, E2, B>(
|
|
|
21
23
|
): Fx<R | R2, E | E2, A | B> {
|
|
22
24
|
return mergeAll(self, other)
|
|
23
25
|
}
|
|
26
|
+
|
|
27
|
+
export function mergeFirst<R, E, A, R2, E2, B>(
|
|
28
|
+
self: Fx<R, E, A>,
|
|
29
|
+
other: Fx<R2, E2, B>,
|
|
30
|
+
): Fx<R | R2, E | E2, A> {
|
|
31
|
+
return compact(mergeAll(map(self, Option.some), map(other, Option.none)))
|
|
32
|
+
}
|
package/src/scoped.ts
ADDED
package/src/snapshotEffect.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Fx, Sink } from './Fx.js'
|
|
2
|
-
import { Effect, Option, Ref } from './externals.js'
|
|
2
|
+
import { Effect, Fiber, Option, Ref } from './externals.js'
|
|
3
3
|
|
|
4
4
|
export function snapshotEffect<R, E, A, R2, E2, B, R3, E3, C>(
|
|
5
5
|
fx: Fx<R, E, A>,
|
|
@@ -7,32 +7,32 @@ export function snapshotEffect<R, E, A, R2, E2, B, R3, E3, C>(
|
|
|
7
7
|
f: (a: A, b: B) => Effect.Effect<R3, E3, C>,
|
|
8
8
|
): Fx<R | R2 | R3, E | E2 | E3, C> {
|
|
9
9
|
return Fx((sink) =>
|
|
10
|
-
Effect.
|
|
11
|
-
|
|
12
|
-
const current = yield* $(Ref.make(Option.none<B>()))
|
|
10
|
+
Effect.gen(function* ($) {
|
|
11
|
+
const current = yield* $(Ref.make(Option.none<B>()))
|
|
13
12
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
const sampledFiber = yield* $(
|
|
14
|
+
sampled.run(Sink((b) => Ref.set(current, Option.some(b)), sink.error)),
|
|
15
|
+
Effect.fork,
|
|
16
|
+
)
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
18
|
+
yield* $(
|
|
19
|
+
fx.run(
|
|
20
|
+
Sink(
|
|
21
|
+
(a) =>
|
|
22
|
+
Effect.gen(function* ($) {
|
|
23
|
+
const b = yield* $(Ref.get(current))
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
),
|
|
25
|
+
if (Option.isSome(b)) {
|
|
26
|
+
yield* $(Effect.catchAllCause(f(a, b.value), sink.error))
|
|
27
|
+
}
|
|
28
|
+
}),
|
|
29
|
+
sink.error,
|
|
32
30
|
),
|
|
33
|
-
)
|
|
34
|
-
|
|
35
|
-
|
|
31
|
+
),
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
yield* $(Fiber.interrupt(sampledFiber))
|
|
35
|
+
}),
|
|
36
36
|
)
|
|
37
37
|
}
|
|
38
38
|
|
package/src/switchMap.ts
CHANGED
|
@@ -1,50 +1,46 @@
|
|
|
1
1
|
import { pipe } from '@effect/data/Function'
|
|
2
2
|
|
|
3
3
|
import { Fx, Sink } from './Fx.js'
|
|
4
|
-
import { Cause, Effect, Fiber,
|
|
4
|
+
import { Cause, Effect, Fiber, Runtime } from './externals.js'
|
|
5
5
|
import { fromEffect } from './fromEffect.js'
|
|
6
6
|
|
|
7
7
|
export function switchMap<R, E, A, R2, E2, B>(
|
|
8
8
|
fx: Fx<R, E, A>,
|
|
9
9
|
f: (a: A) => Fx<R2, E2, B>,
|
|
10
10
|
): Fx<R | R2, E | E2, B> {
|
|
11
|
-
return Fx((sink) =>
|
|
12
|
-
Effect.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
11
|
+
return Fx(<R3>(sink: Sink<R3, E | E2, B>) =>
|
|
12
|
+
Effect.gen(function* ($) {
|
|
13
|
+
const runFork = Runtime.runFork(yield* $(Effect.runtime<R | R2 | R3>()))
|
|
14
|
+
let ref: Fiber.RuntimeFiber<never, void> | undefined
|
|
15
|
+
|
|
16
|
+
const switchEvent = (a: A) =>
|
|
17
|
+
Effect.gen(function* ($) {
|
|
18
|
+
if (ref) {
|
|
19
|
+
yield* $(Fiber.interruptFork(ref))
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
ref = runFork(
|
|
19
23
|
pipe(
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
f(a).run(
|
|
24
|
-
Sink(sink.event, (cause) =>
|
|
25
|
-
Cause.isInterruptedOnly(cause) ? Effect.unit() : sink.error(cause),
|
|
26
|
-
),
|
|
27
|
-
),
|
|
28
|
-
Effect.zipLeft(reset),
|
|
29
|
-
Effect.catchAllCause((cause) =>
|
|
30
|
-
Cause.isInterruptedOnly(cause) ? Effect.unit() : sink.error(cause),
|
|
31
|
-
),
|
|
32
|
-
Effect.forkScoped,
|
|
24
|
+
f(a).run(
|
|
25
|
+
Sink(sink.event, (cause) =>
|
|
26
|
+
Cause.isInterruptedOnly(cause) ? Effect.unit() : sink.error(cause),
|
|
33
27
|
),
|
|
34
28
|
),
|
|
29
|
+
Effect.zipLeft(Effect.sync(() => (ref = undefined))),
|
|
30
|
+
Effect.catchAllCause((cause) =>
|
|
31
|
+
Cause.isInterruptedOnly(cause) ? Effect.unit() : sink.error(cause),
|
|
32
|
+
),
|
|
35
33
|
),
|
|
36
34
|
)
|
|
35
|
+
})
|
|
37
36
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
// Wait for the last fiber to finish
|
|
41
|
-
const fiber = yield* $(RefS.get(ref))
|
|
37
|
+
yield* $(fx.run(Sink(switchEvent, sink.error)))
|
|
42
38
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
),
|
|
39
|
+
// Wait for the last fiber to finish
|
|
40
|
+
if (ref) {
|
|
41
|
+
yield* $(Fiber.join(ref))
|
|
42
|
+
}
|
|
43
|
+
}),
|
|
48
44
|
)
|
|
49
45
|
}
|
|
50
46
|
|
package/src/switchMapCause.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { pipe } from '@effect/data/Function'
|
|
2
2
|
|
|
3
3
|
import { Fx, Sink } from './Fx.js'
|
|
4
|
-
import { Cause, Effect, Either, Fiber, RefS } from './externals.js'
|
|
4
|
+
import { Cause, Effect, Either, Fiber, RefS, Runtime } from './externals.js'
|
|
5
5
|
import { failCause } from './failCause.js'
|
|
6
6
|
import { fromEffect } from './fromEffect.js'
|
|
7
7
|
|
|
@@ -9,43 +9,43 @@ export function switchMapCause<R, E, A, R2, E2, B>(
|
|
|
9
9
|
fx: Fx<R, E, A>,
|
|
10
10
|
f: (cause: Cause.Cause<E>) => Fx<R2, E2, B>,
|
|
11
11
|
): Fx<R | R2, E2, A | B> {
|
|
12
|
-
return Fx((sink) =>
|
|
13
|
-
Effect.
|
|
14
|
-
|
|
15
|
-
const ref = yield* $(RefS.make<Fiber.RuntimeFiber<never, void> | null>(null))
|
|
16
|
-
const reset = RefS.set(ref, null)
|
|
12
|
+
return Fx(<R3>(sink: Sink<R3, E2, A | B>) =>
|
|
13
|
+
Effect.gen(function* ($) {
|
|
14
|
+
const runFork = Runtime.runFork(yield* $(Effect.runtime<R | R2 | R3>()))
|
|
17
15
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
)
|
|
29
|
-
Effect.zipLeft(reset),
|
|
30
|
-
Effect.catchAllCause((cause) =>
|
|
16
|
+
const ref = yield* $(RefS.make<Fiber.RuntimeFiber<never, void> | null>(null))
|
|
17
|
+
const reset = RefS.set(ref, null)
|
|
18
|
+
|
|
19
|
+
const switchError = (cause: Cause.Cause<E>) =>
|
|
20
|
+
RefS.updateEffect(ref, (currentFiber) =>
|
|
21
|
+
pipe(
|
|
22
|
+
currentFiber ? Fiber.interruptFork(currentFiber) : Effect.unit(),
|
|
23
|
+
Effect.map(() =>
|
|
24
|
+
pipe(
|
|
25
|
+
f(cause).run(
|
|
26
|
+
Sink(sink.event, (cause) =>
|
|
31
27
|
Cause.isInterruptedOnly(cause) ? Effect.unit() : sink.error(cause),
|
|
32
28
|
),
|
|
33
|
-
Effect.forkScoped,
|
|
34
29
|
),
|
|
30
|
+
Effect.zipLeft(reset),
|
|
31
|
+
Effect.catchAllCause((cause) =>
|
|
32
|
+
Cause.isInterruptedOnly(cause) ? Effect.unit() : sink.error(cause),
|
|
33
|
+
),
|
|
34
|
+
runFork,
|
|
35
35
|
),
|
|
36
36
|
),
|
|
37
|
-
)
|
|
37
|
+
),
|
|
38
|
+
)
|
|
38
39
|
|
|
39
|
-
|
|
40
|
+
yield* $(fx.run(Sink(sink.event, switchError)))
|
|
40
41
|
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
// Wait for the last fiber to finish
|
|
43
|
+
const fiber = yield* $(RefS.get(ref))
|
|
43
44
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
),
|
|
45
|
+
if (fiber) {
|
|
46
|
+
yield* $(Fiber.join(fiber))
|
|
47
|
+
}
|
|
48
|
+
}),
|
|
49
49
|
)
|
|
50
50
|
}
|
|
51
51
|
|
package/src/switchMatch.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { pipe } from '@effect/data/Function'
|
|
2
2
|
|
|
3
3
|
import { Fx, Sink } from './Fx.js'
|
|
4
|
-
import { Cause, Effect, Either, Fiber, RefS } from './externals.js'
|
|
4
|
+
import { Cause, Effect, Either, Fiber, RefS, Runtime } from './externals.js'
|
|
5
5
|
import { failCause } from './failCause.js'
|
|
6
6
|
import { fromEffect } from './fromEffect.js'
|
|
7
7
|
|
|
@@ -10,50 +10,49 @@ export function switchMatchCause<R, E, A, R2, E2, B, R3, E3, C>(
|
|
|
10
10
|
f: (cause: Cause.Cause<E>) => Fx<R2, E2, B>,
|
|
11
11
|
g: (a: A) => Fx<R3, E3, C>,
|
|
12
12
|
): Fx<R | R2 | R3, E2 | E3, B | C> {
|
|
13
|
-
return Fx((sink) =>
|
|
14
|
-
Effect.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
return Fx(<R4>(sink: Sink<R4, E2 | E3, B | C>) =>
|
|
14
|
+
Effect.gen(function* ($) {
|
|
15
|
+
const runFork = Runtime.runFork(yield* $(Effect.runtime<R | R2 | R3 | R4>()))
|
|
16
|
+
const ref = yield* $(RefS.make<Fiber.RuntimeFiber<never, void> | null>(null))
|
|
17
|
+
const reset = RefS.set(ref, null)
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
Cause.isInterruptedOnly(cause) ? Effect.unit() : sink.error(cause),
|
|
28
|
-
),
|
|
29
|
-
),
|
|
30
|
-
Effect.zipLeft(reset),
|
|
31
|
-
Effect.catchAllCause((cause) =>
|
|
19
|
+
const switchWith = (f: () => Fx<R2 | R3, E2 | E3, B | C>) =>
|
|
20
|
+
RefS.updateEffect(ref, (currentFiber) =>
|
|
21
|
+
pipe(
|
|
22
|
+
currentFiber ? Fiber.interruptFork(currentFiber) : Effect.unit(),
|
|
23
|
+
Effect.map(() =>
|
|
24
|
+
pipe(
|
|
25
|
+
f().run(
|
|
26
|
+
Sink(sink.event, (cause) =>
|
|
32
27
|
Cause.isInterruptedOnly(cause) ? Effect.unit() : sink.error(cause),
|
|
33
28
|
),
|
|
34
|
-
Effect.forkScoped,
|
|
35
29
|
),
|
|
30
|
+
Effect.zipLeft(reset),
|
|
31
|
+
Effect.catchAllCause((cause) =>
|
|
32
|
+
Cause.isInterruptedOnly(cause) ? Effect.unit() : sink.error(cause),
|
|
33
|
+
),
|
|
34
|
+
runFork,
|
|
36
35
|
),
|
|
37
36
|
),
|
|
38
|
-
)
|
|
39
|
-
|
|
40
|
-
yield* $(
|
|
41
|
-
fx.run(
|
|
42
|
-
Sink(
|
|
43
|
-
(a) => switchWith(() => g(a)),
|
|
44
|
-
(cause) => switchWith(() => f(cause)),
|
|
45
|
-
),
|
|
46
37
|
),
|
|
47
38
|
)
|
|
48
39
|
|
|
49
|
-
|
|
50
|
-
|
|
40
|
+
yield* $(
|
|
41
|
+
fx.run(
|
|
42
|
+
Sink(
|
|
43
|
+
(a) => switchWith(() => g(a)),
|
|
44
|
+
(cause) => switchWith(() => f(cause)),
|
|
45
|
+
),
|
|
46
|
+
),
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
// Wait for the last fiber to finish
|
|
50
|
+
const fiber = yield* $(RefS.get(ref))
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
),
|
|
52
|
+
if (fiber) {
|
|
53
|
+
yield* $(Fiber.join(fiber))
|
|
54
|
+
}
|
|
55
|
+
}),
|
|
57
56
|
)
|
|
58
57
|
}
|
|
59
58
|
|
package/src/throttle.ts
CHANGED
|
@@ -1,40 +1,39 @@
|
|
|
1
1
|
import { pipe } from '@effect/data/Function'
|
|
2
2
|
|
|
3
3
|
import { Fx, Sink } from './Fx.js'
|
|
4
|
-
import
|
|
5
|
-
import { Effect, Fiber, Ref } from './externals.js'
|
|
4
|
+
import { Duration, Runtime, Effect, Fiber, Ref } from './externals.js'
|
|
6
5
|
|
|
7
6
|
export function throttle<R, E, A>(fx: Fx<R, E, A>, duration: Duration.Duration): Fx<R, E, A> {
|
|
8
|
-
return Fx((sink) =>
|
|
9
|
-
Effect.
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
),
|
|
7
|
+
return Fx(<R2>(sink: Sink<R2, E, A>) =>
|
|
8
|
+
Effect.gen(function* ($) {
|
|
9
|
+
const runFork = Runtime.runFork(yield* $(Effect.runtime<R | R2>()))
|
|
10
|
+
const ref = yield* $(Ref.make<Fiber.RuntimeFiber<never, void> | void>(void 0))
|
|
11
|
+
const reset = Ref.set(ref, void 0)
|
|
12
|
+
|
|
13
|
+
const throttleEvent = (a: A) =>
|
|
14
|
+
Effect.gen(function* ($) {
|
|
15
|
+
const currentFiber = yield* $(Ref.get(ref))
|
|
16
|
+
|
|
17
|
+
if (currentFiber) {
|
|
18
|
+
return
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
yield* $(
|
|
22
|
+
Ref.set(
|
|
23
|
+
ref,
|
|
24
|
+
pipe(sink.event(a), Effect.zipLeft(Effect.delay(reset, duration)), runFork),
|
|
25
|
+
),
|
|
26
|
+
)
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
yield* $(fx.run(Sink(throttleEvent, sink.error)))
|
|
30
|
+
|
|
31
|
+
// Wait for the last fiber to finish
|
|
32
|
+
const fiber = yield* $(Ref.get(ref))
|
|
33
|
+
|
|
34
|
+
if (fiber) {
|
|
35
|
+
yield* $(Fiber.join(fiber))
|
|
36
|
+
}
|
|
37
|
+
}),
|
|
39
38
|
)
|
|
40
39
|
}
|