@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.
Files changed (127) hide show
  1. package/dist/catchAllCause.d.ts.map +1 -1
  2. package/dist/catchAllCause.js +7 -6
  3. package/dist/catchAllCause.js.map +1 -1
  4. package/dist/cjs/catchAllCause.d.ts.map +1 -1
  5. package/dist/cjs/catchAllCause.js +6 -5
  6. package/dist/cjs/catchAllCause.js.map +1 -1
  7. package/dist/cjs/combineAllDiscard.d.ts +3 -0
  8. package/dist/cjs/combineAllDiscard.d.ts.map +1 -0
  9. package/dist/cjs/combineAllDiscard.js +26 -0
  10. package/dist/cjs/combineAllDiscard.js.map +1 -0
  11. package/dist/cjs/data-first.d.ts +2 -0
  12. package/dist/cjs/data-first.d.ts.map +1 -1
  13. package/dist/cjs/data-first.js +2 -0
  14. package/dist/cjs/data-first.js.map +1 -1
  15. package/dist/cjs/exhaustMap.d.ts.map +1 -1
  16. package/dist/cjs/exhaustMap.js +4 -3
  17. package/dist/cjs/exhaustMap.js.map +1 -1
  18. package/dist/cjs/exhaustMapCause.d.ts.map +1 -1
  19. package/dist/cjs/exhaustMapCause.js +4 -3
  20. package/dist/cjs/exhaustMapCause.js.map +1 -1
  21. package/dist/cjs/exhaustMapLatest.d.ts.map +1 -1
  22. package/dist/cjs/exhaustMapLatest.js +5 -4
  23. package/dist/cjs/exhaustMapLatest.js.map +1 -1
  24. package/dist/cjs/exhaustMapLatestCause.d.ts.map +1 -1
  25. package/dist/cjs/exhaustMapLatestCause.js +5 -4
  26. package/dist/cjs/exhaustMapLatestCause.js.map +1 -1
  27. package/dist/cjs/flatMap.d.ts.map +1 -1
  28. package/dist/cjs/flatMap.js +9 -8
  29. package/dist/cjs/flatMap.js.map +1 -1
  30. package/dist/cjs/index.d.ts +10 -0
  31. package/dist/cjs/index.d.ts.map +1 -1
  32. package/dist/cjs/index.js +7 -3
  33. package/dist/cjs/index.js.map +1 -1
  34. package/dist/cjs/mergeAll.d.ts +1 -0
  35. package/dist/cjs/mergeAll.d.ts.map +1 -1
  36. package/dist/cjs/mergeAll.js +7 -1
  37. package/dist/cjs/mergeAll.js.map +1 -1
  38. package/dist/cjs/scoped.d.ts +4 -0
  39. package/dist/cjs/scoped.d.ts.map +1 -0
  40. package/dist/cjs/scoped.js +10 -0
  41. package/dist/cjs/scoped.js.map +1 -0
  42. package/dist/cjs/snapshotEffect.d.ts.map +1 -1
  43. package/dist/cjs/snapshotEffect.js +4 -3
  44. package/dist/cjs/snapshotEffect.js.map +1 -1
  45. package/dist/cjs/switchMap.d.ts.map +1 -1
  46. package/dist/cjs/switchMap.js +12 -8
  47. package/dist/cjs/switchMap.js.map +1 -1
  48. package/dist/cjs/switchMapCause.d.ts.map +1 -1
  49. package/dist/cjs/switchMapCause.js +4 -3
  50. package/dist/cjs/switchMapCause.js.map +1 -1
  51. package/dist/cjs/switchMatch.d.ts.map +1 -1
  52. package/dist/cjs/switchMatch.js +4 -3
  53. package/dist/cjs/switchMatch.js.map +1 -1
  54. package/dist/cjs/throttle.d.ts +1 -1
  55. package/dist/cjs/throttle.d.ts.map +1 -1
  56. package/dist/cjs/throttle.js +4 -4
  57. package/dist/cjs/throttle.js.map +1 -1
  58. package/dist/combineAllDiscard.d.ts +3 -0
  59. package/dist/combineAllDiscard.d.ts.map +1 -0
  60. package/dist/combineAllDiscard.js +22 -0
  61. package/dist/combineAllDiscard.js.map +1 -0
  62. package/dist/data-first.d.ts +2 -0
  63. package/dist/data-first.d.ts.map +1 -1
  64. package/dist/data-first.js +2 -0
  65. package/dist/data-first.js.map +1 -1
  66. package/dist/exhaustMap.d.ts.map +1 -1
  67. package/dist/exhaustMap.js +5 -4
  68. package/dist/exhaustMap.js.map +1 -1
  69. package/dist/exhaustMapCause.d.ts.map +1 -1
  70. package/dist/exhaustMapCause.js +5 -4
  71. package/dist/exhaustMapCause.js.map +1 -1
  72. package/dist/exhaustMapLatest.d.ts.map +1 -1
  73. package/dist/exhaustMapLatest.js +6 -5
  74. package/dist/exhaustMapLatest.js.map +1 -1
  75. package/dist/exhaustMapLatestCause.d.ts.map +1 -1
  76. package/dist/exhaustMapLatestCause.js +6 -5
  77. package/dist/exhaustMapLatestCause.js.map +1 -1
  78. package/dist/flatMap.d.ts.map +1 -1
  79. package/dist/flatMap.js +10 -9
  80. package/dist/flatMap.js.map +1 -1
  81. package/dist/index.d.ts +10 -0
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js +4 -0
  84. package/dist/index.js.map +1 -1
  85. package/dist/mergeAll.d.ts +1 -0
  86. package/dist/mergeAll.d.ts.map +1 -1
  87. package/dist/mergeAll.js +6 -1
  88. package/dist/mergeAll.js.map +1 -1
  89. package/dist/scoped.d.ts +4 -0
  90. package/dist/scoped.d.ts.map +1 -0
  91. package/dist/scoped.js +6 -0
  92. package/dist/scoped.js.map +1 -0
  93. package/dist/snapshotEffect.d.ts.map +1 -1
  94. package/dist/snapshotEffect.js +5 -4
  95. package/dist/snapshotEffect.js.map +1 -1
  96. package/dist/switchMap.d.ts.map +1 -1
  97. package/dist/switchMap.js +13 -9
  98. package/dist/switchMap.js.map +1 -1
  99. package/dist/switchMapCause.d.ts.map +1 -1
  100. package/dist/switchMapCause.js +5 -4
  101. package/dist/switchMapCause.js.map +1 -1
  102. package/dist/switchMatch.d.ts.map +1 -1
  103. package/dist/switchMatch.js +5 -4
  104. package/dist/switchMatch.js.map +1 -1
  105. package/dist/throttle.d.ts +1 -1
  106. package/dist/throttle.d.ts.map +1 -1
  107. package/dist/throttle.js +5 -5
  108. package/dist/throttle.js.map +1 -1
  109. package/dist/tsconfig.cjs.build.tsbuildinfo +1 -1
  110. package/package.json +2 -2
  111. package/src/catchAllCause.ts +38 -43
  112. package/src/combineAllDiscard.ts +42 -0
  113. package/src/data-first.ts +2 -0
  114. package/src/exhaustMap.ts +32 -35
  115. package/src/exhaustMapCause.ts +32 -35
  116. package/src/exhaustMapLatest.ts +64 -68
  117. package/src/exhaustMapLatestCause.ts +64 -68
  118. package/src/flatMap.ts +38 -43
  119. package/src/index.ts +22 -0
  120. package/src/mergeAll.ts +10 -1
  121. package/src/scoped.ts +6 -0
  122. package/src/snapshotEffect.ts +23 -23
  123. package/src/switchMap.ts +27 -31
  124. package/src/switchMapCause.ts +29 -29
  125. package/src/switchMatch.ts +34 -35
  126. package/src/throttle.ts +32 -33
  127. 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.scoped(
13
- Effect.gen(function* ($) {
14
- const ref = yield* $(Ref.make<ReadonlyArray<Fiber.RuntimeFiber<never, void>>>([]))
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
- yield* $(
17
- fx.run(
18
- Sink(
19
- (a: A) =>
20
- Effect.gen(function* ($) {
21
- const fiber = yield* $(
22
- Effect.forkScoped(
23
- f(a).run(
24
- Sink(sink.event, (cause) =>
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
- // Add Fiber to fibers
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
- // When the fiber ends, we need to remove it from the list of fibers
35
- yield* $(
36
- pipe(
37
- Fiber.join(fiber),
38
- Effect.flatMap(() => Ref.update(ref, (fs) => fs.filter((f) => f !== fiber))),
39
- Effect.catchAllCause((cause) =>
40
- Cause.isInterruptedOnly(cause) ? Effect.unit() : sink.error(cause),
41
- ),
42
- // but don't allow this to be blocking
43
- Effect.forkScoped,
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
- // Wait for the last fibers to finish
53
- const fibers = yield* $(Ref.get(ref))
48
+ // Wait for the last fibers to finish
49
+ const fibers = yield* $(Ref.get(ref))
54
50
 
55
- if (fibers.length > 0) {
56
- yield* $(Fiber.joinAll(fibers))
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
@@ -0,0 +1,6 @@
1
+ import { Fx } from './Fx.js'
2
+ import { Effect, Scope } from './externals.js'
3
+
4
+ export function scoped<R, E, A>(fx: Fx<R, E, A>): Fx<Exclude<R, Scope.Scope>, E, A> {
5
+ return Fx((sink) => Effect.scoped(fx.run(sink)))
6
+ }
@@ -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.scoped(
11
- Effect.gen(function* ($) {
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
- yield* $(
15
- sampled.run(Sink((b) => Ref.set(current, Option.some(b)), sink.error)),
16
- Effect.forkScoped,
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
- yield* $(
20
- fx.run(
21
- Sink(
22
- (a) =>
23
- Effect.gen(function* ($) {
24
- const b = yield* $(Ref.get(current))
18
+ yield* $(
19
+ fx.run(
20
+ Sink(
21
+ (a) =>
22
+ Effect.gen(function* ($) {
23
+ const b = yield* $(Ref.get(current))
25
24
 
26
- if (Option.isSome(b)) {
27
- yield* $(Effect.catchAllCause(f(a, b.value), sink.error))
28
- }
29
- }),
30
- sink.error,
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, RefS } from './externals.js'
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.scoped(
13
- Effect.gen(function* ($) {
14
- const ref = yield* $(RefS.make<Fiber.RuntimeFiber<never, void> | null>(null))
15
- const reset = RefS.set(ref, null)
16
-
17
- const switchEvent = (a: A) =>
18
- RefS.updateEffect(ref, (currentFiber) =>
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
- currentFiber ? Fiber.interruptFork(currentFiber) : Effect.unit(),
21
- Effect.flatMap(() =>
22
- pipe(
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
- yield* $(fx.run(Sink(switchEvent, sink.error)))
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
- if (fiber) {
44
- yield* $(Fiber.join(fiber))
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
 
@@ -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.scoped(
14
- Effect.gen(function* ($) {
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
- const switchError = (cause: Cause.Cause<E>) =>
19
- RefS.updateEffect(ref, (currentFiber) =>
20
- pipe(
21
- currentFiber ? Fiber.interruptFork(currentFiber) : Effect.unit(),
22
- Effect.flatMap(() =>
23
- pipe(
24
- f(cause).run(
25
- Sink(sink.event, (cause) =>
26
- Cause.isInterruptedOnly(cause) ? Effect.unit() : sink.error(cause),
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
- yield* $(fx.run(Sink(sink.event, switchError)))
40
+ yield* $(fx.run(Sink(sink.event, switchError)))
40
41
 
41
- // Wait for the last fiber to finish
42
- const fiber = yield* $(RefS.get(ref))
42
+ // Wait for the last fiber to finish
43
+ const fiber = yield* $(RefS.get(ref))
43
44
 
44
- if (fiber) {
45
- yield* $(Fiber.join(fiber))
46
- }
47
- }),
48
- ),
45
+ if (fiber) {
46
+ yield* $(Fiber.join(fiber))
47
+ }
48
+ }),
49
49
  )
50
50
  }
51
51
 
@@ -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.scoped(
15
- Effect.gen(function* ($) {
16
- const ref = yield* $(RefS.make<Fiber.RuntimeFiber<never, void> | null>(null))
17
- const reset = RefS.set(ref, null)
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
- 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.flatMap(() =>
24
- pipe(
25
- f().run(
26
- Sink(sink.event, (cause) =>
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
- // Wait for the last fiber to finish
50
- const fiber = yield* $(RefS.get(ref))
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
- if (fiber) {
53
- yield* $(Fiber.join(fiber))
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 type { Duration } from './externals.js'
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.scoped(
10
- Effect.gen(function* ($) {
11
- const ref = yield* $(Ref.make<Fiber.RuntimeFiber<never, void> | void>(void 0))
12
- const reset = Ref.set(ref, void 0)
13
-
14
- const throttleEvent = (a: A) =>
15
- Effect.gen(function* ($) {
16
- const currentFiber = yield* $(Ref.get(ref))
17
-
18
- if (currentFiber) {
19
- return
20
- }
21
-
22
- const fiber = yield* $(
23
- pipe(sink.event(a), Effect.zipLeft(Effect.delay(reset, duration)), Effect.forkScoped),
24
- )
25
-
26
- yield* $(Ref.set(ref, fiber))
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
- }),
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
  }