effect 4.0.0-beta.17 → 4.0.0-beta.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 (164) hide show
  1. package/dist/Array.d.ts +127 -299
  2. package/dist/Array.d.ts.map +1 -1
  3. package/dist/Array.js +102 -62
  4. package/dist/Array.js.map +1 -1
  5. package/dist/Cache.d.ts.map +1 -1
  6. package/dist/Cache.js +5 -4
  7. package/dist/Cache.js.map +1 -1
  8. package/dist/Channel.d.ts +97 -11
  9. package/dist/Channel.d.ts.map +1 -1
  10. package/dist/Channel.js +72 -29
  11. package/dist/Channel.js.map +1 -1
  12. package/dist/Chunk.d.ts +54 -247
  13. package/dist/Chunk.d.ts.map +1 -1
  14. package/dist/Chunk.js +36 -67
  15. package/dist/Chunk.js.map +1 -1
  16. package/dist/Effect.d.ts +337 -437
  17. package/dist/Effect.d.ts.map +1 -1
  18. package/dist/Effect.js +118 -134
  19. package/dist/Effect.js.map +1 -1
  20. package/dist/Filter.d.ts +0 -33
  21. package/dist/Filter.d.ts.map +1 -1
  22. package/dist/Filter.js +0 -13
  23. package/dist/Filter.js.map +1 -1
  24. package/dist/HashMap.d.ts +15 -14
  25. package/dist/HashMap.d.ts.map +1 -1
  26. package/dist/HashMap.js +4 -4
  27. package/dist/HashMap.js.map +1 -1
  28. package/dist/Iterable.d.ts +40 -39
  29. package/dist/Iterable.d.ts.map +1 -1
  30. package/dist/Iterable.js +94 -22
  31. package/dist/Iterable.js.map +1 -1
  32. package/dist/Option.d.ts +22 -15
  33. package/dist/Option.d.ts.map +1 -1
  34. package/dist/Option.js +14 -7
  35. package/dist/Option.js.map +1 -1
  36. package/dist/Pull.d.ts.map +1 -1
  37. package/dist/Pull.js +1 -1
  38. package/dist/Pull.js.map +1 -1
  39. package/dist/Record.d.ts +24 -120
  40. package/dist/Record.d.ts.map +1 -1
  41. package/dist/Record.js +21 -41
  42. package/dist/Record.js.map +1 -1
  43. package/dist/Sink.d.ts +11 -11
  44. package/dist/Sink.d.ts.map +1 -1
  45. package/dist/Sink.js +53 -6
  46. package/dist/Sink.js.map +1 -1
  47. package/dist/Stream.d.ts +198 -386
  48. package/dist/Stream.d.ts.map +1 -1
  49. package/dist/Stream.js +103 -59
  50. package/dist/Stream.js.map +1 -1
  51. package/dist/Trie.d.ts +18 -17
  52. package/dist/Trie.d.ts.map +1 -1
  53. package/dist/Trie.js +5 -5
  54. package/dist/Trie.js.map +1 -1
  55. package/dist/TxChunk.d.ts +37 -37
  56. package/dist/TxChunk.d.ts.map +1 -1
  57. package/dist/TxChunk.js +3 -3
  58. package/dist/TxChunk.js.map +1 -1
  59. package/dist/TxDeferred.d.ts +328 -0
  60. package/dist/TxDeferred.d.ts.map +1 -0
  61. package/dist/TxDeferred.js +196 -0
  62. package/dist/TxDeferred.js.map +1 -0
  63. package/dist/TxHashMap.d.ts +84 -83
  64. package/dist/TxHashMap.d.ts.map +1 -1
  65. package/dist/TxHashMap.js +24 -24
  66. package/dist/TxHashMap.js.map +1 -1
  67. package/dist/TxHashSet.d.ts +35 -35
  68. package/dist/TxHashSet.d.ts.map +1 -1
  69. package/dist/TxHashSet.js +14 -14
  70. package/dist/TxHashSet.js.map +1 -1
  71. package/dist/TxPriorityQueue.d.ts +609 -0
  72. package/dist/TxPriorityQueue.d.ts.map +1 -0
  73. package/dist/TxPriorityQueue.js +415 -0
  74. package/dist/TxPriorityQueue.js.map +1 -0
  75. package/dist/TxPubSub.d.ts +585 -0
  76. package/dist/TxPubSub.d.ts.map +1 -0
  77. package/dist/TxPubSub.js +521 -0
  78. package/dist/TxPubSub.js.map +1 -0
  79. package/dist/TxQueue.d.ts +32 -32
  80. package/dist/TxQueue.d.ts.map +1 -1
  81. package/dist/TxQueue.js +26 -26
  82. package/dist/TxQueue.js.map +1 -1
  83. package/dist/TxReentrantLock.d.ts +523 -0
  84. package/dist/TxReentrantLock.d.ts.map +1 -0
  85. package/dist/TxReentrantLock.js +504 -0
  86. package/dist/TxReentrantLock.js.map +1 -0
  87. package/dist/TxRef.d.ts +34 -34
  88. package/dist/TxRef.d.ts.map +1 -1
  89. package/dist/TxRef.js +21 -14
  90. package/dist/TxRef.js.map +1 -1
  91. package/dist/TxSemaphore.d.ts +8 -8
  92. package/dist/TxSemaphore.d.ts.map +1 -1
  93. package/dist/TxSemaphore.js +7 -7
  94. package/dist/TxSemaphore.js.map +1 -1
  95. package/dist/TxSubscriptionRef.d.ts +508 -0
  96. package/dist/TxSubscriptionRef.d.ts.map +1 -0
  97. package/dist/TxSubscriptionRef.js +293 -0
  98. package/dist/TxSubscriptionRef.js.map +1 -0
  99. package/dist/index.d.ts +40 -0
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +40 -0
  102. package/dist/index.js.map +1 -1
  103. package/dist/internal/effect.js +99 -42
  104. package/dist/internal/effect.js.map +1 -1
  105. package/dist/internal/hashMap.js +3 -2
  106. package/dist/internal/hashMap.js.map +1 -1
  107. package/dist/internal/trie.js +5 -4
  108. package/dist/internal/trie.js.map +1 -1
  109. package/dist/unstable/ai/Tool.d.ts.map +1 -1
  110. package/dist/unstable/ai/Tool.js +0 -9
  111. package/dist/unstable/ai/Tool.js.map +1 -1
  112. package/dist/unstable/cli/Command.d.ts +1 -1
  113. package/dist/unstable/cli/Command.d.ts.map +1 -1
  114. package/dist/unstable/cli/Command.js +1 -1
  115. package/dist/unstable/cli/Command.js.map +1 -1
  116. package/dist/unstable/cluster/K8sHttpClient.js +4 -4
  117. package/dist/unstable/cluster/K8sHttpClient.js.map +1 -1
  118. package/dist/unstable/cluster/Sharding.js +1 -1
  119. package/dist/unstable/cluster/Sharding.js.map +1 -1
  120. package/dist/unstable/encoding/Sse.js +1 -1
  121. package/dist/unstable/encoding/Sse.js.map +1 -1
  122. package/dist/unstable/rpc/RpcServer.d.ts.map +1 -1
  123. package/dist/unstable/rpc/RpcServer.js +1 -2
  124. package/dist/unstable/rpc/RpcServer.js.map +1 -1
  125. package/dist/unstable/socket/Socket.d.ts.map +1 -1
  126. package/dist/unstable/socket/Socket.js +3 -3
  127. package/dist/unstable/socket/Socket.js.map +1 -1
  128. package/package.json +1 -1
  129. package/src/Array.ts +190 -342
  130. package/src/Cache.ts +6 -5
  131. package/src/Channel.ts +506 -102
  132. package/src/Chunk.ts +81 -268
  133. package/src/Effect.ts +437 -518
  134. package/src/Filter.ts +0 -57
  135. package/src/HashMap.ts +15 -14
  136. package/src/Iterable.ts +105 -50
  137. package/src/Option.ts +30 -20
  138. package/src/Pull.ts +1 -1
  139. package/src/Record.ts +43 -152
  140. package/src/Sink.ts +75 -23
  141. package/src/Stream.ts +442 -502
  142. package/src/Trie.ts +18 -17
  143. package/src/TxChunk.ts +72 -53
  144. package/src/TxDeferred.ts +394 -0
  145. package/src/TxHashMap.ts +332 -285
  146. package/src/TxHashSet.ts +111 -116
  147. package/src/TxPriorityQueue.ts +767 -0
  148. package/src/TxPubSub.ts +789 -0
  149. package/src/TxQueue.ts +241 -251
  150. package/src/TxReentrantLock.ts +753 -0
  151. package/src/TxRef.ts +50 -38
  152. package/src/TxSemaphore.ts +29 -32
  153. package/src/TxSubscriptionRef.ts +639 -0
  154. package/src/index.ts +45 -0
  155. package/src/internal/effect.ts +368 -163
  156. package/src/internal/hashMap.ts +7 -5
  157. package/src/internal/trie.ts +16 -9
  158. package/src/unstable/ai/Tool.ts +0 -9
  159. package/src/unstable/cli/Command.ts +6 -4
  160. package/src/unstable/cluster/K8sHttpClient.ts +4 -4
  161. package/src/unstable/cluster/Sharding.ts +1 -1
  162. package/src/unstable/encoding/Sse.ts +1 -1
  163. package/src/unstable/rpc/RpcServer.ts +1 -7
  164. package/src/unstable/socket/Socket.ts +9 -11
package/src/Channel.ts CHANGED
@@ -63,7 +63,7 @@ import * as Chunk from "./Chunk.ts"
63
63
  import * as Effect from "./Effect.ts"
64
64
  import * as Exit from "./Exit.ts"
65
65
  import * as Fiber from "./Fiber.ts"
66
- import * as Filter from "./Filter.ts"
66
+ import type * as Filter from "./Filter.ts"
67
67
  import type { LazyArg } from "./Function.ts"
68
68
  import { constant, constTrue, constVoid, dual, identity as identity_ } from "./Function.ts"
69
69
  import { ClockRef, endSpan } from "./internal/effect.ts"
@@ -3564,9 +3564,9 @@ export const filter: {
3564
3564
  * @since 2.0.0
3565
3565
  * @category Filtering
3566
3566
  */
3567
- <OutElem, Result extends Filter.ResultOrBool>(filter: Filter.OrPredicate<OutElem, Result>): <OutErr, OutDone, InElem, InErr, InDone, Env>(
3567
+ <OutElem>(predicate: Predicate.Predicate<OutElem>): <OutErr, OutDone, InElem, InErr, InDone, Env>(
3568
3568
  self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>
3569
- ) => Channel<Filter.Pass<OutElem, Result>, OutErr, OutDone, InElem, InErr, InDone, Env>
3569
+ ) => Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>
3570
3570
  /**
3571
3571
  * Filters the output elements of a channel using a predicate function.
3572
3572
  * Elements that don't match the predicate are discarded.
@@ -3625,24 +3625,59 @@ export const filter: {
3625
3625
  * @since 2.0.0
3626
3626
  * @category Filtering
3627
3627
  */
3628
- <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env, Result extends Filter.ResultOrBool>(
3628
+ <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>(
3629
+ self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>,
3630
+ predicate: Predicate.Predicate<OutElem>
3631
+ ): Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>
3632
+ } = dual(2, <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>(
3633
+ self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>,
3634
+ predicate: Predicate.Predicate<OutElem>
3635
+ ): Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env> =>
3636
+ fromTransform((upstream, scope) =>
3637
+ Effect.map(
3638
+ toTransform(self)(upstream, scope),
3639
+ (pull) =>
3640
+ Effect.flatMap(pull, function loop(elem): Pull.Pull<OutElem, OutErr, OutDone> {
3641
+ return predicate(elem)
3642
+ ? Effect.succeed(elem)
3643
+ : Effect.flatMap(pull, loop)
3644
+ })
3645
+ )
3646
+ ))
3647
+
3648
+ /**
3649
+ * @since 4.0.0
3650
+ * @category Filtering
3651
+ */
3652
+ export const filterMap: {
3653
+ /**
3654
+ * @since 4.0.0
3655
+ * @category Filtering
3656
+ */
3657
+ <OutElem, B, X>(filter: Filter.Filter<OutElem, B, X>): <OutErr, OutDone, InElem, InErr, InDone, Env>(
3658
+ self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>
3659
+ ) => Channel<B, OutErr, OutDone, InElem, InErr, InDone, Env>
3660
+ /**
3661
+ * @since 4.0.0
3662
+ * @category Filtering
3663
+ */
3664
+ <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env, B, X>(
3629
3665
  self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>,
3630
- filter: Filter.OrPredicate<OutElem, Result>
3631
- ): Channel<Filter.Pass<OutElem, Result>, OutErr, OutDone, InElem, InErr, InDone, Env>
3632
- } = dual(2, <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env, Result extends Filter.ResultOrBool>(
3666
+ filter: Filter.Filter<OutElem, B, X>
3667
+ ): Channel<B, OutErr, OutDone, InElem, InErr, InDone, Env>
3668
+ } = dual(2, <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env, B, X>(
3633
3669
  self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>,
3634
- filter: Filter.OrPredicate<OutElem, Result>
3635
- ): Channel<Filter.Pass<OutElem, Result>, OutErr, OutDone, InElem, InErr, InDone, Env> =>
3670
+ filter: Filter.Filter<OutElem, B, X>
3671
+ ): Channel<B, OutErr, OutDone, InElem, InErr, InDone, Env> =>
3636
3672
  fromTransform((upstream, scope) =>
3637
3673
  Effect.map(
3638
3674
  toTransform(self)(upstream, scope),
3639
3675
  (pull) =>
3640
- Effect.flatMap(pull, function loop(elem): Pull.Pull<Filter.Pass<OutElem, Result>, OutErr, OutDone> {
3676
+ Effect.flatMap(pull, function loop(elem): Pull.Pull<B, OutErr, OutDone> {
3641
3677
  const result = filter(elem)
3642
- if (result === true) return Effect.succeed(elem as Filter.Pass<OutElem, Result>)
3643
- else if (result === false) return Effect.flatMap(pull, loop)
3644
- else if (Result.isSuccess(result)) return Effect.succeed(result.success)
3645
- return Effect.flatMap(pull, loop)
3678
+ return Result.isFailure(result)
3679
+ ? Effect.flatMap(pull, loop)
3680
+ : Effect.succeed(result.success)
3646
3681
  })
3647
3682
  )
3648
3683
  ))
@@ -3652,6 +3687,46 @@ export const filter: {
3652
3687
  * @category Filtering
3653
3688
  */
3654
3689
  export const filterEffect: {
3690
+ /**
3691
+ * @since 4.0.0
3692
+ * @category Filtering
3693
+ */
3694
+ <OutElem, E, R>(predicate: (a: OutElem) => Effect.Effect<boolean, E, R>): <OutErr, OutDone, InElem, InErr, InDone, Env>(
3695
+ self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>
3696
+ ) => Channel<OutElem, OutErr | E, OutDone, InElem, InErr, InDone, Env | R>
3697
+ /**
3698
+ * @since 4.0.0
3699
+ * @category Filtering
3700
+ */
3701
+ <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env, E, R>(
3702
+ self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>,
3703
+ predicate: (a: OutElem) => Effect.Effect<boolean, E, R>
3704
+ ): Channel<OutElem, OutErr | E, OutDone, InElem, InErr, InDone, Env | R>
3705
+ } = dual(2, <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env, E, R>(
3706
+ self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>,
3707
+ predicate: (a: OutElem) => Effect.Effect<boolean, E, R>
3708
+ ): Channel<OutElem, OutErr | E, OutDone, InElem, InErr, InDone, Env | R> =>
3709
+ fromTransform((upstream, scope) =>
3710
+ Effect.map(
3711
+ toTransform(self)(upstream, scope),
3712
+ (pull) =>
3713
+ Effect.flatMap(pull, function loop(elem): Pull.Pull<OutElem, OutErr | E, OutDone, R> {
3714
+ return Effect.flatMap(
3715
+ predicate(elem),
3716
+ (passes) =>
3717
+ passes
3718
+ ? Effect.succeed(elem)
3719
+ : Effect.flatMap(pull, loop)
3720
+ )
3721
+ })
3722
+ )
3723
+ ))
3724
+
3725
+ /**
3726
+ * @since 4.0.0
3727
+ * @category Filtering
3728
+ */
3729
+ export const filterMapEffect: {
3655
3730
  /**
3656
3731
  * @since 4.0.0
3657
3732
  * @category Filtering
@@ -3796,9 +3871,9 @@ export const filterArray: {
3796
3871
  * @since 4.0.0
3797
3872
  * @category Filtering
3798
3873
  */
3799
- <OutElem, Result extends Filter.ResultOrBool>(filter: Filter.OrPredicate<Types.NoInfer<OutElem>, Result>): <OutErr, OutDone, InElem, InErr, InDone, Env>(
3874
+ <OutElem>(predicate: Predicate.Predicate<Types.NoInfer<OutElem>>): <OutErr, OutDone, InElem, InErr, InDone, Env>(
3800
3875
  self: Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env>
3801
- ) => Channel<Arr.NonEmptyReadonlyArray<Filter.Pass<OutElem, Result>>, OutErr, OutDone, InElem, InErr, InDone, Env>
3876
+ ) => Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env>
3802
3877
  /**
3803
3878
  * Filters arrays of elements emitted by a channel, applying the filter
3804
3879
  * to each element within the arrays and only emitting non-empty filtered arrays.
@@ -3873,19 +3948,24 @@ export const filterArray: {
3873
3948
  * @since 4.0.0
3874
3949
  * @category Filtering
3875
3950
  */
3876
- <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env, Result extends Filter.ResultOrBool>(
3951
+ <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>(
3877
3952
  self: Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env>,
3878
- filter: Filter.OrPredicate<Types.NoInfer<OutElem>, Result>
3879
- ): Channel<Arr.NonEmptyReadonlyArray<Filter.Pass<OutElem, Result>>, OutErr, OutDone, InElem, InErr, InDone, Env>
3880
- } = dual(2, <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env, Result extends Filter.ResultOrBool>(
3953
+ predicate: Predicate.Predicate<Types.NoInfer<OutElem>>
3954
+ ): Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env>
3955
+ } = dual(2, <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>(
3881
3956
  self: Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env>,
3882
- filter: Filter.OrPredicate<Types.NoInfer<OutElem>, Result>
3883
- ): Channel<Arr.NonEmptyReadonlyArray<Filter.Pass<OutElem, Result>>, OutErr, OutDone, InElem, InErr, InDone, Env> =>
3957
+ predicate: Predicate.Predicate<Types.NoInfer<OutElem>>
3958
+ ): Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env> =>
3884
3959
  transformPull(self, (pull) =>
3885
3960
  Effect.succeed(Effect.flatMap(
3886
3961
  pull,
3887
- function loop(arr): Pull.Pull<Arr.NonEmptyReadonlyArray<any>, OutErr, OutDone> {
3888
- const [, passes] = Arr.partition(arr, filter as any)
3962
+ function loop(arr): Pull.Pull<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone> {
3963
+ const passes: Array<OutElem> = []
3964
+ for (let i = 0; i < arr.length; i++) {
3965
+ if (predicate(arr[i] as Types.NoInfer<OutElem>)) {
3966
+ passes.push(arr[i])
3967
+ }
3968
+ }
3889
3969
  return Arr.isReadonlyArrayNonEmpty(passes)
3890
3970
  ? Effect.succeed(passes)
3891
3971
  : Effect.flatMap(pull, loop)
@@ -3896,23 +3976,57 @@ export const filterArray: {
3896
3976
  * @since 4.0.0
3897
3977
  * @category Filtering
3898
3978
  */
3899
- export const filterArrayEffect: {
3979
+ export const filterMapArray: {
3900
3980
  /**
3901
3981
  * @since 4.0.0
3902
3982
  * @category Filtering
3903
3983
  */
3904
- <OutElem, E, R>(
3905
- predicate: (a: Types.NoInfer<OutElem>, index: number) => Effect.Effect<boolean, E, R>
3906
- ): <OutErr, OutDone, InElem, InErr, InDone, Env>(
3984
+ <OutElem, B, X>(filter: Filter.Filter<Types.NoInfer<OutElem>, B, X>): <OutErr, OutDone, InElem, InErr, InDone, Env>(
3907
3985
  self: Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env>
3908
- ) => Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr | E, OutDone, InElem, InErr, InDone, Env | R>
3986
+ ) => Channel<Arr.NonEmptyReadonlyArray<B>, OutErr, OutDone, InElem, InErr, InDone, Env>
3909
3987
  /**
3910
3988
  * @since 4.0.0
3911
3989
  * @category Filtering
3912
3990
  */
3913
- <OutElem, B, X, EX, RX>(filter: Filter.FilterEffect<OutElem, B, X, EX, RX>): <OutErr, OutDone, InElem, InErr, InDone, Env>(
3991
+ <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env, B, X>(
3992
+ self: Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env>,
3993
+ filter: Filter.Filter<OutElem, B, X>
3994
+ ): Channel<Arr.NonEmptyReadonlyArray<B>, OutErr, OutDone, InElem, InErr, InDone, Env>
3995
+ } = dual(2, <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env, B, X>(
3996
+ self: Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env>,
3997
+ filter: Filter.Filter<OutElem, B, X>
3998
+ ): Channel<Arr.NonEmptyReadonlyArray<B>, OutErr, OutDone, InElem, InErr, InDone, Env> =>
3999
+ transformPull(self, (pull) =>
4000
+ Effect.succeed(Effect.flatMap(
4001
+ pull,
4002
+ function loop(arr): Pull.Pull<Arr.NonEmptyReadonlyArray<B>, OutErr, OutDone> {
4003
+ const passes: Array<B> = []
4004
+ for (let i = 0; i < arr.length; i++) {
4005
+ const result = filter(arr[i])
4006
+ if (Result.isSuccess(result)) {
4007
+ passes.push(result.success)
4008
+ }
4009
+ }
4010
+ return Arr.isReadonlyArrayNonEmpty(passes)
4011
+ ? Effect.succeed(passes)
4012
+ : Effect.flatMap(pull, loop)
4013
+ }
4014
+ ))))
4015
+
4016
+ /**
4017
+ * @since 4.0.0
4018
+ * @category Filtering
4019
+ */
4020
+ export const filterArrayEffect: {
4021
+ /**
4022
+ * @since 4.0.0
4023
+ * @category Filtering
4024
+ */
4025
+ <OutElem, E, R>(
4026
+ predicate: (a: Types.NoInfer<OutElem>, index: number) => Effect.Effect<boolean, E, R>
4027
+ ): <OutErr, OutDone, InElem, InErr, InDone, Env>(
3914
4028
  self: Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env>
3915
- ) => Channel<Arr.NonEmptyReadonlyArray<B>, OutErr | EX, OutDone, InElem, InErr, InDone, Env | RX>
4029
+ ) => Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr | E, OutDone, InElem, InErr, InDone, Env | R>
3916
4030
  /**
3917
4031
  * @since 4.0.0
3918
4032
  * @category Filtering
@@ -3921,6 +4035,32 @@ export const filterArrayEffect: {
3921
4035
  self: Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env>,
3922
4036
  predicate: (a: Types.NoInfer<OutElem>, index: number) => Effect.Effect<boolean, E, R>
3923
4037
  ): Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr | E, OutDone, InElem, InErr, InDone, Env | R>
4038
+ } = dual(2, <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env, E, R>(
4039
+ self: Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env>,
4040
+ predicate: (a: Types.NoInfer<OutElem>, index: number) => Effect.Effect<boolean, E, R>
4041
+ ): Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr | E, OutDone, InElem, InErr, InDone, Env | R> =>
4042
+ transformPull(self, (pull) => {
4043
+ const f = Effect.flatMap(pull, (arr) => Effect.filter(arr, predicate))
4044
+ return Effect.succeed(Effect.flatMap(
4045
+ f,
4046
+ function loop(arr): Pull.Pull<Arr.NonEmptyReadonlyArray<OutElem>, OutErr | E, OutDone, R> {
4047
+ return Arr.isReadonlyArrayNonEmpty(arr) ? Effect.succeed(arr) : Effect.flatMap(f, loop)
4048
+ }
4049
+ ))
4050
+ }))
4051
+
4052
+ /**
4053
+ * @since 4.0.0
4054
+ * @category Filtering
4055
+ */
4056
+ export const filterMapArrayEffect: {
4057
+ /**
4058
+ * @since 4.0.0
4059
+ * @category Filtering
4060
+ */
4061
+ <OutElem, B, X, EX, RX>(filter: Filter.FilterEffect<Types.NoInfer<OutElem>, B, X, EX, RX>): <OutErr, OutDone, InElem, InErr, InDone, Env>(
4062
+ self: Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env>
4063
+ ) => Channel<Arr.NonEmptyReadonlyArray<B>, OutErr | EX, OutDone, InElem, InErr, InDone, Env | RX>
3924
4064
  /**
3925
4065
  * @since 4.0.0
3926
4066
  * @category Filtering
@@ -3929,32 +4069,23 @@ export const filterArrayEffect: {
3929
4069
  self: Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env>,
3930
4070
  filter: Filter.FilterEffect<OutElem, B, X, EX, RX>
3931
4071
  ): Channel<Arr.NonEmptyReadonlyArray<B>, OutErr | EX, OutDone, InElem, InErr, InDone, Env | RX>
3932
- } = dual(2, <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>(
4072
+ } = dual(2, <OutElem, OutErr, OutDone, InElem, InErr, InDone, Env, B, X, EX, RX>(
3933
4073
  self: Channel<Arr.NonEmptyReadonlyArray<OutElem>, OutErr, OutDone, InElem, InErr, InDone, Env>,
3934
- filter:
3935
- | Filter.FilterEffect<OutElem, any, any, any, any>
3936
- | ((a: OutElem, index: number) => Effect.Effect<boolean, any, any>)
3937
- ): Channel<Arr.NonEmptyReadonlyArray<any>, any, OutDone, InElem, InErr, InDone, any> => {
3938
- if (filter.length > 1) {
3939
- // effectful boolean predicate: (a, index) => Effect<boolean>
3940
- const predicate = filter as (a: OutElem, index: number) => Effect.Effect<boolean, any, any>
3941
- return transformPull(self, (pull) => {
3942
- const f = Effect.flatMap(pull, (arr) => Effect.filter(arr, predicate))
3943
- return Effect.succeed(Effect.flatMap(
3944
- f,
3945
- function loop(arr): Pull.Pull<Arr.NonEmptyReadonlyArray<any>, any, OutDone, any> {
3946
- return Arr.isReadonlyArrayNonEmpty(arr) ? Effect.succeed(arr) : Effect.flatMap(f, loop)
3947
- }
3948
- ))
3949
- })
3950
- }
3951
- // FilterEffect: (a) => Effect<pass|fail>
3952
- return filterEffect(self, (arr) =>
3953
- Effect.map(
3954
- Effect.filter(arr, filter as any),
3955
- (passes) => Arr.isReadonlyArrayNonEmpty(passes) ? Result.succeed(passes) : Result.fail(undefined)
3956
- ))
3957
- })
4074
+ filter: Filter.FilterEffect<OutElem, B, X, EX, RX>
4075
+ ): Channel<Arr.NonEmptyReadonlyArray<B>, OutErr | EX, OutDone, InElem, InErr, InDone, Env | RX> =>
4076
+ transformPull(self, (pull) =>
4077
+ Effect.succeed(Effect.flatMap(
4078
+ pull,
4079
+ function loop(arr): Pull.Pull<Arr.NonEmptyReadonlyArray<B>, OutErr | EX, OutDone, RX> {
4080
+ return Effect.flatMap(
4081
+ Effect.filterMapEffect(arr, filter as any),
4082
+ (passes) =>
4083
+ Arr.isReadonlyArrayNonEmpty(passes)
4084
+ ? Effect.succeed(passes as Arr.NonEmptyReadonlyArray<B>)
4085
+ : Effect.flatMap(pull, loop)
4086
+ )
4087
+ }
4088
+ ))))
3958
4089
 
3959
4090
  /**
3960
4091
  * Statefully maps over a channel with an accumulator, where each element can produce multiple output values.
@@ -4757,7 +4888,6 @@ export const catchCauseIf: {
4757
4888
  */
4758
4889
  <
4759
4890
  OutErr,
4760
- Result extends Filter.ResultOrBool<Cause.Cause<any>>,
4761
4891
  OutElem1,
4762
4892
  OutErr1,
4763
4893
  OutDone1,
@@ -4766,11 +4896,8 @@ export const catchCauseIf: {
4766
4896
  InDone1,
4767
4897
  Env1
4768
4898
  >(
4769
- filter: Filter.OrPredicate<Cause.Cause<OutErr>, Result>,
4770
- f: (
4771
- failure: Filter.Pass<Cause.Cause<OutErr>, Result>,
4772
- cause: Cause.Cause<OutErr>
4773
- ) => Channel<OutElem1, OutErr1, OutDone1, InElem1, InErr1, InDone1, Env1>
4899
+ predicate: Predicate.Predicate<Cause.Cause<OutErr>>,
4900
+ f: (cause: Cause.Cause<OutErr>) => Channel<OutElem1, OutErr1, OutDone1, InElem1, InErr1, InDone1, Env1>
4774
4901
  ): <
4775
4902
  OutElem,
4776
4903
  OutDone,
@@ -4780,7 +4907,7 @@ export const catchCauseIf: {
4780
4907
  Env
4781
4908
  >(self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>) => Channel<
4782
4909
  OutElem | OutElem1,
4783
- Cause.Cause.Error<Filter.Fail<Cause.Cause<OutErr>, Result>> | OutErr1,
4910
+ OutErr | OutErr1,
4784
4911
  OutDone | OutDone1,
4785
4912
  InElem & InElem1,
4786
4913
  InErr & InErr1,
@@ -4802,7 +4929,6 @@ export const catchCauseIf: {
4802
4929
  InErr,
4803
4930
  InDone,
4804
4931
  Env,
4805
- Result extends Filter.ResultOrBool<Cause.Cause<any>>,
4806
4932
  OutElem1,
4807
4933
  OutErr1,
4808
4934
  OutDone1,
@@ -4812,14 +4938,137 @@ export const catchCauseIf: {
4812
4938
  Env1
4813
4939
  >(
4814
4940
  self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>,
4815
- filter: Filter.OrPredicate<Cause.Cause<OutErr>, Result>,
4941
+ predicate: Predicate.Predicate<Cause.Cause<OutErr>>,
4942
+ f: (cause: Cause.Cause<OutErr>) => Channel<OutElem1, OutErr1, OutDone1, InElem1, InErr1, InDone1, Env1>
4943
+ ): Channel<
4944
+ OutElem | OutElem1,
4945
+ OutErr | OutErr1,
4946
+ OutDone | OutDone1,
4947
+ InElem & InElem1,
4948
+ InErr & InErr1,
4949
+ InDone & InDone1,
4950
+ Env | Env1
4951
+ >
4952
+ } = dual(3, <
4953
+ OutElem,
4954
+ OutErr,
4955
+ OutDone,
4956
+ InElem,
4957
+ InErr,
4958
+ InDone,
4959
+ Env,
4960
+ OutElem1,
4961
+ OutErr1,
4962
+ OutDone1,
4963
+ InElem1,
4964
+ InErr1,
4965
+ InDone1,
4966
+ Env1
4967
+ >(
4968
+ self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>,
4969
+ predicate: Predicate.Predicate<Cause.Cause<OutErr>>,
4970
+ f: (cause: Cause.Cause<OutErr>) => Channel<OutElem1, OutErr1, OutDone1, InElem1, InErr1, InDone1, Env1>
4971
+ ): Channel<
4972
+ OutElem | OutElem1,
4973
+ OutErr | OutErr1,
4974
+ OutDone | OutDone1,
4975
+ InElem & InElem1,
4976
+ InErr & InErr1,
4977
+ InDone & InDone1,
4978
+ Env | Env1
4979
+ > =>
4980
+ catchCause(
4981
+ self,
4982
+ (
4983
+ cause
4984
+ ): Channel<
4985
+ OutElem1,
4986
+ OutErr | OutErr1,
4987
+ OutDone1,
4988
+ InElem1,
4989
+ InErr1,
4990
+ InDone1,
4991
+ Env1
4992
+ > => {
4993
+ return predicate(cause)
4994
+ ? f(cause)
4995
+ : failCause(cause as any)
4996
+ }
4997
+ ))
4998
+
4999
+ /**
5000
+ * @since 4.0.0
5001
+ * @category Error handling
5002
+ */
5003
+ export const catchCauseFilter: {
5004
+ /**
5005
+ * @since 4.0.0
5006
+ * @category Error handling
5007
+ */
5008
+ <
5009
+ OutErr,
5010
+ EB,
5011
+ X extends Cause.Cause<any>,
5012
+ OutElem1,
5013
+ OutErr1,
5014
+ OutDone1,
5015
+ InElem1,
5016
+ InErr1,
5017
+ InDone1,
5018
+ Env1
5019
+ >(
5020
+ filter: Filter.Filter<Cause.Cause<OutErr>, EB, X>,
5021
+ f: (
5022
+ failure: EB,
5023
+ cause: Cause.Cause<OutErr>
5024
+ ) => Channel<OutElem1, OutErr1, OutDone1, InElem1, InErr1, InDone1, Env1>
5025
+ ): <
5026
+ OutElem,
5027
+ OutDone,
5028
+ InElem,
5029
+ InErr,
5030
+ InDone,
5031
+ Env
5032
+ >(self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>) => Channel<
5033
+ OutElem | OutElem1,
5034
+ Cause.Cause.Error<X> | OutErr1,
5035
+ OutDone | OutDone1,
5036
+ InElem & InElem1,
5037
+ InErr & InErr1,
5038
+ InDone & InDone1,
5039
+ Env | Env1
5040
+ >
5041
+ /**
5042
+ * @since 4.0.0
5043
+ * @category Error handling
5044
+ */
5045
+ <
5046
+ OutElem,
5047
+ OutErr,
5048
+ OutDone,
5049
+ InElem,
5050
+ InErr,
5051
+ InDone,
5052
+ Env,
5053
+ EB,
5054
+ X extends Cause.Cause<any>,
5055
+ OutElem1,
5056
+ OutErr1,
5057
+ OutDone1,
5058
+ InElem1,
5059
+ InErr1,
5060
+ InDone1,
5061
+ Env1
5062
+ >(
5063
+ self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>,
5064
+ filter: Filter.Filter<Cause.Cause<OutErr>, EB, X>,
4816
5065
  f: (
4817
- failure: Filter.Pass<Cause.Cause<OutErr>, Result>,
5066
+ failure: EB,
4818
5067
  cause: Cause.Cause<OutErr>
4819
5068
  ) => Channel<OutElem1, OutErr1, OutDone1, InElem1, InErr1, InDone1, Env1>
4820
5069
  ): Channel<
4821
5070
  OutElem | OutElem1,
4822
- Cause.Cause.Error<Filter.Fail<Cause.Cause<OutErr>, Result>> | OutErr1,
5071
+ Cause.Cause.Error<X> | OutErr1,
4823
5072
  OutDone | OutDone1,
4824
5073
  InElem & InElem1,
4825
5074
  InErr & InErr1,
@@ -4834,7 +5083,8 @@ export const catchCauseIf: {
4834
5083
  InErr,
4835
5084
  InDone,
4836
5085
  Env,
4837
- Result extends Filter.ResultOrBool<Cause.Cause<any>>,
5086
+ EB,
5087
+ X extends Cause.Cause<any>,
4838
5088
  OutElem1,
4839
5089
  OutErr1,
4840
5090
  OutDone1,
@@ -4844,14 +5094,14 @@ export const catchCauseIf: {
4844
5094
  Env1
4845
5095
  >(
4846
5096
  self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>,
4847
- filter: Filter.OrPredicate<Cause.Cause<OutErr>, Result>,
5097
+ filter: Filter.Filter<Cause.Cause<OutErr>, EB, X>,
4848
5098
  f: (
4849
- failure: Filter.Pass<Cause.Cause<OutErr>, Result>,
5099
+ failure: EB,
4850
5100
  cause: Cause.Cause<OutErr>
4851
5101
  ) => Channel<OutElem1, OutErr1, OutDone1, InElem1, InErr1, InDone1, Env1>
4852
5102
  ): Channel<
4853
5103
  OutElem | OutElem1,
4854
- Cause.Cause.Error<Filter.Fail<Cause.Cause<OutErr>, Result>> | OutErr1,
5104
+ Cause.Cause.Error<X> | OutErr1,
4855
5105
  OutDone | OutDone1,
4856
5106
  InElem & InElem1,
4857
5107
  InErr & InErr1,
@@ -4864,18 +5114,17 @@ export const catchCauseIf: {
4864
5114
  cause
4865
5115
  ): Channel<
4866
5116
  OutElem1,
4867
- Cause.Cause.Error<Filter.Fail<Cause.Cause<OutErr>, Result>> | OutErr1,
5117
+ Cause.Cause.Error<X> | OutErr1,
4868
5118
  OutDone1,
4869
5119
  InElem1,
4870
5120
  InErr1,
4871
5121
  InDone1,
4872
5122
  Env1
4873
5123
  > => {
4874
- const eb = filter(cause)
4875
- if (eb === true) return f(cause as any, cause)
4876
- else if (eb === false) return failCause(cause as any)
4877
- else if (Result.isSuccess(eb)) return f(eb.success as any, cause)
4878
- return failCause(eb.failure)
5124
+ const result = filter(cause)
5125
+ return Result.isFailure(result)
5126
+ ? failCause(result.failure)
5127
+ : f(result.success, cause)
4879
5128
  }
4880
5129
  ))
4881
5130
 
@@ -4951,7 +5200,7 @@ const catch_: {
4951
5200
  InErr & InErr1,
4952
5201
  InDone & InDone1,
4953
5202
  Env | Env1
4954
- > => catchCauseIf(self, Cause.findError as any, (e: any) => f(e)) as any)
5203
+ > => catchCauseFilter(self, Cause.findError, (e) => f(e)))
4955
5204
 
4956
5205
  export {
4957
5206
  /**
@@ -5101,7 +5350,6 @@ export const catchIf: {
5101
5350
  */
5102
5351
  <
5103
5352
  OutErr,
5104
- Result extends Filter.ResultOrBool,
5105
5353
  OutElem1,
5106
5354
  OutErr1,
5107
5355
  OutDone1,
@@ -5110,18 +5358,18 @@ export const catchIf: {
5110
5358
  InDone1,
5111
5359
  Env1,
5112
5360
  OutElem2 = never,
5113
- OutErr2 = Filter.Fail<OutErr, Result>,
5361
+ OutErr2 = OutErr,
5114
5362
  OutDone2 = never,
5115
5363
  InElem2 = unknown,
5116
5364
  InErr2 = unknown,
5117
5365
  InDone2 = unknown,
5118
5366
  Env2 = never
5119
5367
  >(
5120
- filter: Filter.OrPredicate<OutErr, Result>,
5121
- f: (failure: Filter.Pass<OutErr, Result>) => Channel<OutElem1, OutErr1, OutDone1, InElem1, InErr1, InDone1, Env1>,
5368
+ predicate: Predicate.Predicate<OutErr>,
5369
+ f: (failure: OutErr) => Channel<OutElem1, OutErr1, OutDone1, InElem1, InErr1, InDone1, Env1>,
5122
5370
  orElse?:
5123
5371
  | ((
5124
- failure: Filter.Fail<OutErr, Result>
5372
+ failure: OutErr
5125
5373
  ) => Channel<OutElem2, OutErr2, OutDone2, InElem2, InErr2, InDone2, Env2>)
5126
5374
  | undefined
5127
5375
  ): <
@@ -5197,7 +5445,6 @@ export const catchIf: {
5197
5445
  InErr,
5198
5446
  InDone,
5199
5447
  Env,
5200
- Result extends Filter.ResultOrBool,
5201
5448
  OutElem1,
5202
5449
  OutErr1,
5203
5450
  OutDone1,
@@ -5206,7 +5453,7 @@ export const catchIf: {
5206
5453
  InDone1,
5207
5454
  Env1,
5208
5455
  OutElem2 = never,
5209
- OutErr2 = Filter.Fail<OutErr, Result>,
5456
+ OutErr2 = OutErr,
5210
5457
  OutDone2 = never,
5211
5458
  InElem2 = unknown,
5212
5459
  InErr2 = unknown,
@@ -5214,11 +5461,11 @@ export const catchIf: {
5214
5461
  Env2 = never
5215
5462
  >(
5216
5463
  self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>,
5217
- filter: Filter.OrPredicate<OutErr, Result>,
5218
- f: (failure: Filter.Pass<OutErr, Result>) => Channel<OutElem1, OutErr1, OutDone1, InElem1, InErr1, InDone1, Env1>,
5464
+ predicate: Predicate.Predicate<OutErr>,
5465
+ f: (failure: OutErr) => Channel<OutElem1, OutErr1, OutDone1, InElem1, InErr1, InDone1, Env1>,
5219
5466
  orElse?:
5220
5467
  | ((
5221
- failure: Filter.Fail<OutErr, Result>
5468
+ failure: OutErr
5222
5469
  ) => Channel<OutElem2, OutErr2, OutDone2, InElem2, InErr2, InDone2, Env2>)
5223
5470
  | undefined
5224
5471
  ): Channel<
@@ -5238,7 +5485,6 @@ export const catchIf: {
5238
5485
  InErr,
5239
5486
  InDone,
5240
5487
  Env,
5241
- Result extends Filter.ResultOrBool,
5242
5488
  OutElem1,
5243
5489
  OutErr1,
5244
5490
  OutDone1,
@@ -5247,7 +5493,7 @@ export const catchIf: {
5247
5493
  InDone1,
5248
5494
  Env1,
5249
5495
  OutElem2 = never,
5250
- OutErr2 = Filter.Fail<OutErr, Result>,
5496
+ OutErr2 = OutErr,
5251
5497
  OutDone2 = never,
5252
5498
  InElem2 = unknown,
5253
5499
  InErr2 = unknown,
@@ -5255,11 +5501,11 @@ export const catchIf: {
5255
5501
  Env2 = never
5256
5502
  >(
5257
5503
  self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>,
5258
- filter: Filter.OrPredicate<OutErr, Result>,
5259
- f: (failure: Filter.Pass<OutErr, Result>) => Channel<OutElem1, OutErr1, OutDone1, InElem1, InErr1, InDone1, Env1>,
5504
+ predicate: Predicate.Predicate<OutErr>,
5505
+ f: (failure: OutErr) => Channel<OutElem1, OutErr1, OutDone1, InElem1, InErr1, InDone1, Env1>,
5260
5506
  orElse?:
5261
5507
  | ((
5262
- failure: Filter.Fail<OutErr, Result>
5508
+ failure: OutErr
5263
5509
  ) => Channel<OutElem2, OutErr2, OutDone2, InElem2, InErr2, InDone2, Env2>)
5264
5510
  | undefined
5265
5511
  ): Channel<
@@ -5282,12 +5528,170 @@ export const catchIf: {
5282
5528
  InDone1 & InDone2,
5283
5529
  Env1 | Env2
5284
5530
  > => {
5285
- const eb = Filter.apply(filter as any, err)
5286
- return !Result.isFailure(eb)
5287
- ? f(eb.success as any)
5531
+ return predicate(err)
5532
+ ? f(err)
5288
5533
  : orElse
5289
- ? orElse(eb.failure as any)
5290
- : fail(eb.failure as any) as any
5534
+ ? orElse(err)
5535
+ : fail(err as any) as any
5536
+ }
5537
+ ))
5538
+
5539
+ /**
5540
+ * @since 4.0.0
5541
+ * @category Error handling
5542
+ */
5543
+ export const catchFilter: {
5544
+ /**
5545
+ * @since 4.0.0
5546
+ * @category Error handling
5547
+ */
5548
+ <
5549
+ OutErr,
5550
+ EB,
5551
+ X,
5552
+ OutElem1,
5553
+ OutErr1,
5554
+ OutDone1,
5555
+ InElem1,
5556
+ InErr1,
5557
+ InDone1,
5558
+ Env1,
5559
+ OutElem2 = never,
5560
+ OutErr2 = X,
5561
+ OutDone2 = never,
5562
+ InElem2 = unknown,
5563
+ InErr2 = unknown,
5564
+ InDone2 = unknown,
5565
+ Env2 = never
5566
+ >(
5567
+ filter: Filter.Filter<OutErr, EB, X>,
5568
+ f: (failure: EB) => Channel<OutElem1, OutErr1, OutDone1, InElem1, InErr1, InDone1, Env1>,
5569
+ orElse?:
5570
+ | ((
5571
+ failure: X
5572
+ ) => Channel<OutElem2, OutErr2, OutDone2, InElem2, InErr2, InDone2, Env2>)
5573
+ | undefined
5574
+ ): <
5575
+ OutElem,
5576
+ OutDone,
5577
+ InElem,
5578
+ InErr,
5579
+ InDone,
5580
+ Env
5581
+ >(self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>) => Channel<
5582
+ OutElem | OutElem1 | OutElem2,
5583
+ OutErr1 | OutErr2,
5584
+ OutDone | OutDone1 | OutDone2,
5585
+ InElem & InElem1 & InElem2,
5586
+ InErr & InErr1 & InErr2,
5587
+ InDone & InDone1 & InDone2,
5588
+ Env | Env1 | Env2
5589
+ >
5590
+ /**
5591
+ * @since 4.0.0
5592
+ * @category Error handling
5593
+ */
5594
+ <
5595
+ OutElem,
5596
+ OutErr,
5597
+ OutDone,
5598
+ InElem,
5599
+ InErr,
5600
+ InDone,
5601
+ Env,
5602
+ EB,
5603
+ X,
5604
+ OutElem1,
5605
+ OutErr1,
5606
+ OutDone1,
5607
+ InElem1,
5608
+ InErr1,
5609
+ InDone1,
5610
+ Env1,
5611
+ OutElem2 = never,
5612
+ OutErr2 = X,
5613
+ OutDone2 = never,
5614
+ InElem2 = unknown,
5615
+ InErr2 = unknown,
5616
+ InDone2 = unknown,
5617
+ Env2 = never
5618
+ >(
5619
+ self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>,
5620
+ filter: Filter.Filter<OutErr, EB, X>,
5621
+ f: (failure: EB) => Channel<OutElem1, OutErr1, OutDone1, InElem1, InErr1, InDone1, Env1>,
5622
+ orElse?:
5623
+ | ((
5624
+ failure: X
5625
+ ) => Channel<OutElem2, OutErr2, OutDone2, InElem2, InErr2, InDone2, Env2>)
5626
+ | undefined
5627
+ ): Channel<
5628
+ OutElem | OutElem1 | OutElem2,
5629
+ OutErr1 | OutErr2,
5630
+ OutDone | OutDone1 | OutDone2,
5631
+ InElem & InElem1 & InElem2,
5632
+ InErr & InErr1 & InErr2,
5633
+ InDone & InDone1 & InDone2,
5634
+ Env | Env1 | Env2
5635
+ >
5636
+ } = dual((args) => isChannel(args[0]), <
5637
+ OutElem,
5638
+ OutErr,
5639
+ OutDone,
5640
+ InElem,
5641
+ InErr,
5642
+ InDone,
5643
+ Env,
5644
+ EB,
5645
+ X,
5646
+ OutElem1,
5647
+ OutErr1,
5648
+ OutDone1,
5649
+ InElem1,
5650
+ InErr1,
5651
+ InDone1,
5652
+ Env1,
5653
+ OutElem2 = never,
5654
+ OutErr2 = X,
5655
+ OutDone2 = never,
5656
+ InElem2 = unknown,
5657
+ InErr2 = unknown,
5658
+ InDone2 = unknown,
5659
+ Env2 = never
5660
+ >(
5661
+ self: Channel<OutElem, OutErr, OutDone, InElem, InErr, InDone, Env>,
5662
+ filter: Filter.Filter<OutErr, EB, X>,
5663
+ f: (failure: EB) => Channel<OutElem1, OutErr1, OutDone1, InElem1, InErr1, InDone1, Env1>,
5664
+ orElse?:
5665
+ | ((
5666
+ failure: X
5667
+ ) => Channel<OutElem2, OutErr2, OutDone2, InElem2, InErr2, InDone2, Env2>)
5668
+ | undefined
5669
+ ): Channel<
5670
+ OutElem | OutElem1 | OutElem2,
5671
+ OutErr1 | OutErr2,
5672
+ OutDone | OutDone1 | OutDone2,
5673
+ InElem & InElem1 & InElem2,
5674
+ InErr & InErr1 & InErr2,
5675
+ InDone & InDone1 & InDone2,
5676
+ Env | Env1 | Env2
5677
+ > =>
5678
+ catch_(
5679
+ self,
5680
+ (err): Channel<
5681
+ OutElem1 | OutElem2,
5682
+ OutErr1 | OutErr2,
5683
+ OutDone1 | OutDone2,
5684
+ InElem1 & InElem2,
5685
+ InErr1 & InErr2,
5686
+ InDone1 & InDone2,
5687
+ Env1 | Env2
5688
+ > => {
5689
+ const result = filter(err)
5690
+ return Result.isFailure(result)
5691
+ ? orElse
5692
+ ? orElse(result.failure)
5693
+ : fail(result.failure as any) as any
5694
+ : f(result.success)
5291
5695
  }
5292
5696
  ))
5293
5697
 
@@ -5872,7 +6276,7 @@ export const catchReasons: {
5872
6276
  >
5873
6277
  } = dual((args) => isChannel(args[0]), (self, errorTag, cases, orElse) => {
5874
6278
  let keys: Set<string>
5875
- return catch_(self, (error: any) => {
6279
+ return catch_(self, (error) => {
5876
6280
  if (
5877
6281
  isTagged(error, errorTag) &&
5878
6282
  hasProperty(error, "reason") &&
@@ -6034,11 +6438,11 @@ export const unwrapReason: {
6034
6438
  InDone,
6035
6439
  Env
6036
6440
  > =>
6037
- catchIf(
6441
+ catchFilter(
6038
6442
  self,
6039
- (error: any) =>
6443
+ (error) =>
6040
6444
  isTagged(error, errorTag) && hasProperty(error, "reason") ? Result.succeed(error.reason) : Result.fail(error),
6041
- fail as any
6445
+ fail
6042
6446
  ) as any)
6043
6447
 
6044
6448
  /**