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
@@ -2224,19 +2224,12 @@ export const filterOrFail: {
2224
2224
  predicate: Predicate.Predicate<NoInfer<A>>,
2225
2225
  orFailWith: (a: NoInfer<A>) => E2
2226
2226
  ): <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E2 | E, R>
2227
- <A, B, X, E2>(
2228
- filter: Filter.Filter<NoInfer<A>, B, X>,
2229
- orFailWith: (x: X) => E2
2230
- ): <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<B, E2 | E, R>
2231
2227
  <A, B extends A>(
2232
2228
  refinement: Predicate.Refinement<NoInfer<A>, B>
2233
2229
  ): <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<B, Cause.NoSuchElementError | E, R>
2234
2230
  <A>(
2235
2231
  predicate: Predicate.Predicate<NoInfer<A>>
2236
2232
  ): <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, Cause.NoSuchElementError | E, R>
2237
- <A, B, X>(
2238
- filter: Filter.Filter<NoInfer<A>, B, X>
2239
- ): <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<B, Cause.NoSuchElementError | E, R>
2240
2233
  <A, E, R, E2, B extends A>(
2241
2234
  self: Effect.Effect<A, E, R>,
2242
2235
  refinement: Predicate.Refinement<NoInfer<A>, B>,
@@ -2247,11 +2240,6 @@ export const filterOrFail: {
2247
2240
  predicate: Predicate.Predicate<NoInfer<A>>,
2248
2241
  orFailWith: (a: NoInfer<A>) => E2
2249
2242
  ): Effect.Effect<A, E2 | E, R>
2250
- <A, E, R, B, X, E2>(
2251
- self: Effect.Effect<A, E, R>,
2252
- filter: Filter.Filter<A, B, X>,
2253
- orFailWith: (x: X) => E2
2254
- ): Effect.Effect<B, E2 | E, R>
2255
2243
  <A, E, R, B extends A>(
2256
2244
  self: Effect.Effect<A, E, R>,
2257
2245
  refinement: Predicate.Refinement<NoInfer<A>, B>
@@ -2260,18 +2248,14 @@ export const filterOrFail: {
2260
2248
  self: Effect.Effect<A, E, R>,
2261
2249
  predicate: Predicate.Predicate<NoInfer<A>>
2262
2250
  ): Effect.Effect<A, E | Cause.NoSuchElementError, R>
2263
- <A, E, R, B, X>(
2264
- self: Effect.Effect<A, E, R>,
2265
- filter: Filter.Filter<A, B, X>
2266
- ): Effect.Effect<B, E | Cause.NoSuchElementError, R>
2267
2251
  } = dual((args) => isEffect(args[0]), <A, E, R, E2>(
2268
2252
  self: Effect.Effect<A, E, R>,
2269
- filter: Predicate.Predicate<NoInfer<A>> | Filter.Filter<A, any, any>,
2253
+ predicate: Predicate.Predicate<NoInfer<A>>,
2270
2254
  orFailWith?: (a: any) => E2
2271
2255
  ): Effect.Effect<any, E | E2 | Cause.NoSuchElementError, R> =>
2272
2256
  filterOrElse(
2273
2257
  self,
2274
- filter as any,
2258
+ predicate as any,
2275
2259
  orFailWith ? (a: any) => fail(orFailWith(a)) : () => fail(new NoSuchElementError() as E2)
2276
2260
  ))
2277
2261
 
@@ -2421,27 +2405,55 @@ const OnFailureProto = makePrimitiveProto({
2421
2405
 
2422
2406
  /** @internal */
2423
2407
  export const catchCauseIf: {
2424
- <E, Result extends Filter.ResultOrBool<Cause.Cause<any>>, B, E2, R2>(
2425
- filter: Filter.OrPredicate<Cause.Cause<E>, Result>,
2426
- f: (failure: Filter.Pass<Cause.Cause<E>, Result>, cause: Cause.Cause<E>) => Effect.Effect<B, E2, R2>
2408
+ <E, B, E2, R2>(
2409
+ predicate: Predicate.Predicate<Cause.Cause<E>>,
2410
+ f: (cause: Cause.Cause<E>) => Effect.Effect<B, E2, R2>
2411
+ ): <A, R>(
2412
+ self: Effect.Effect<A, E, R>
2413
+ ) => Effect.Effect<A | B, E | E2, R | R2>
2414
+ <A, E, R, B, E2, R2>(
2415
+ self: Effect.Effect<A, E, R>,
2416
+ predicate: Predicate.Predicate<Cause.Cause<E>>,
2417
+ f: (cause: Cause.Cause<E>) => Effect.Effect<B, E2, R2>
2418
+ ): Effect.Effect<A | B, E | E2, R | R2>
2419
+ } = dual(
2420
+ 3,
2421
+ <A, E, R, B, E2, R2>(
2422
+ self: Effect.Effect<A, E, R>,
2423
+ predicate: Predicate.Predicate<Cause.Cause<E>>,
2424
+ f: (cause: Cause.Cause<E>) => Effect.Effect<B, E2, R2>
2425
+ ): Effect.Effect<A | B, E | E2, R | R2> =>
2426
+ catchCause(self, (cause): Effect.Effect<B, E | E2, R2> => {
2427
+ if (!predicate(cause)) {
2428
+ return failCause(cause) as any
2429
+ }
2430
+ return internalCall(() => f(cause))
2431
+ })
2432
+ )
2433
+
2434
+ /** @internal */
2435
+ export const catchCauseFilter: {
2436
+ <E, B, E2, R2, EB, X extends Cause.Cause<any>>(
2437
+ filter: Filter.Filter<Cause.Cause<E>, EB, X>,
2438
+ f: (failure: EB, cause: Cause.Cause<E>) => Effect.Effect<B, E2, R2>
2427
2439
  ): <A, R>(
2428
2440
  self: Effect.Effect<A, E, R>
2429
- ) => Effect.Effect<A | B, Cause.Cause.Error<Filter.Fail<Cause.Cause<E>, Result>> | E2, R | R2>
2430
- <A, E, R, B, E2, R2, Result extends Filter.ResultOrBool<Cause.Cause<any>>>(
2441
+ ) => Effect.Effect<A | B, Cause.Cause.Error<X> | E2, R | R2>
2442
+ <A, E, R, B, E2, R2, EB, X extends Cause.Cause<any>>(
2431
2443
  self: Effect.Effect<A, E, R>,
2432
- filter: Filter.OrPredicate<Cause.Cause<E>, Result>,
2433
- f: (failure: Filter.Pass<Cause.Cause<E>, Result>, cause: Cause.Cause<E>) => Effect.Effect<B, E2, R2>
2434
- ): Effect.Effect<A | B, Cause.Cause.Error<Filter.Fail<Cause.Cause<E>, Result>> | E2, R | R2>
2444
+ filter: Filter.Filter<Cause.Cause<E>, EB, X>,
2445
+ f: (failure: EB, cause: Cause.Cause<E>) => Effect.Effect<B, E2, R2>
2446
+ ): Effect.Effect<A | B, Cause.Cause.Error<X> | E2, R | R2>
2435
2447
  } = dual(
2436
2448
  3,
2437
- <A, E, R, B, E2, R2, Result extends Filter.ResultOrBool<Cause.Cause<any>>>(
2438
- self: Effect.Effect<A, E, R>,
2439
- filter: Filter.OrPredicate<Cause.Cause<E>, Result>,
2440
- f: (failure: Filter.Pass<Cause.Cause<E>, Result>, cause: Cause.Cause<E>) => Effect.Effect<B, E2, R2>
2441
- ): Effect.Effect<A | B, Cause.Cause.Error<Filter.Fail<Cause.Cause<E>, Result>> | E2, R | R2> =>
2442
- catchCause(self, (cause): Effect.Effect<B, Cause.Cause.Error<Filter.Fail<Cause.Cause<E>, Result>> | E2, R | R2> => {
2443
- const eb = Filter.apply(filter as any, cause)
2444
- return !Result.isFailure(eb) ? internalCall(() => f(eb.success as any, cause)) : failCause(eb.failure as any)
2449
+ <A, E, R, B, E2, R2, EB, X extends Cause.Cause<any>>(
2450
+ self: Effect.Effect<A, E, R>,
2451
+ filter: Filter.Filter<Cause.Cause<E>, EB, X>,
2452
+ f: (failure: EB, cause: Cause.Cause<E>) => Effect.Effect<B, E2, R2>
2453
+ ): Effect.Effect<A | B, Cause.Cause.Error<X> | E2, R | R2> =>
2454
+ catchCause(self, (cause): Effect.Effect<B, Cause.Cause.Error<X> | E2, R2> => {
2455
+ const eb = filter(cause)
2456
+ return Result.isFailure(eb) ? failCause(eb.failure) : internalCall(() => f(eb.success, cause))
2445
2457
  })
2446
2458
  )
2447
2459
 
@@ -2459,7 +2471,7 @@ export const catch_: {
2459
2471
  <A, E, R, B, E2, R2>(
2460
2472
  self: Effect.Effect<A, E, R>,
2461
2473
  f: (a: NoInfer<E>) => Effect.Effect<B, E2, R2>
2462
- ): Effect.Effect<A | B, E2, R | R2> => catchCauseIf(self, findError as any, (e: any) => f(e)) as any
2474
+ ): Effect.Effect<A | B, E2, R | R2> => catchCauseFilter(self, findError as any, (e: any) => f(e)) as any
2463
2475
  )
2464
2476
 
2465
2477
  /** @internal */
@@ -2490,7 +2502,7 @@ export const catchDefect: {
2490
2502
  <A, E, R, B, E2, R2>(
2491
2503
  self: Effect.Effect<A, E, R>,
2492
2504
  f: (defect: unknown) => Effect.Effect<B, E2, R2>
2493
- ): Effect.Effect<A | B, E | E2, R | R2> => catchCauseIf(self, findDefect as any, f as any) as any
2505
+ ): Effect.Effect<A | B, E | E2, R | R2> => catchCauseFilter(self, findDefect as any, f as any) as any
2494
2506
  )
2495
2507
 
2496
2508
  /** @internal */
@@ -2513,32 +2525,56 @@ export const tapCause: {
2513
2525
 
2514
2526
  /** @internal */
2515
2527
  export const tapCauseIf: {
2516
- <E, Result extends Filter.ResultOrBool, B, E2, R2>(
2517
- filter: Filter.OrPredicate<Cause.Cause<E>, Result>,
2518
- f: (a: Filter.Pass<Cause.Cause<E>, Result>, cause: Cause.Cause<E>) => Effect.Effect<B, E2, R2>
2528
+ <E, B, E2, R2>(
2529
+ predicate: Predicate.Predicate<Cause.Cause<E>>,
2530
+ f: (cause: Cause.Cause<E>) => Effect.Effect<B, E2, R2>
2519
2531
  ): <A, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E | E2, R | R2>
2520
- <A, E, R, Result extends Filter.ResultOrBool, B, E2, R2>(
2532
+ <A, E, R, B, E2, R2>(
2521
2533
  self: Effect.Effect<A, E, R>,
2522
- filter: Filter.OrPredicate<Cause.Cause<E>, Result>,
2523
- f: (a: Filter.Pass<Cause.Cause<E>, Result>, cause: Cause.Cause<E>) => Effect.Effect<B, E2, R2>
2534
+ predicate: Predicate.Predicate<Cause.Cause<E>>,
2535
+ f: (cause: Cause.Cause<E>) => Effect.Effect<B, E2, R2>
2524
2536
  ): Effect.Effect<A, E | E2, R | R2>
2525
2537
  } = dual(
2526
2538
  3,
2527
- <A, E, R, Result extends Filter.ResultOrBool, B, E2, R2>(
2539
+ <A, E, R, B, E2, R2>(
2528
2540
  self: Effect.Effect<A, E, R>,
2529
- filter: Filter.OrPredicate<Cause.Cause<E>, Result>,
2530
- f: (a: Filter.Pass<Cause.Cause<E>, Result>, cause: Cause.Cause<E>) => Effect.Effect<B, E2, R2>
2541
+ predicate: Predicate.Predicate<Cause.Cause<E>>,
2542
+ f: (cause: Cause.Cause<E>) => Effect.Effect<B, E2, R2>
2531
2543
  ): Effect.Effect<A, E | E2, R | R2> =>
2532
2544
  catchCauseIf(
2533
2545
  self,
2534
- ((cause: Cause.Cause<E>) => {
2535
- const result = Filter.apply(filter as any, cause)
2536
- return Result.isFailure(result) ? Result.fail(cause) : result
2537
- }) as any,
2538
- (failure: any, cause: Cause.Cause<E>) => andThen(internalCall(() => f(failure, cause)), failCause(cause))
2546
+ predicate,
2547
+ (cause) => andThen(internalCall(() => f(cause)), failCause(cause))
2539
2548
  )
2540
2549
  )
2541
2550
 
2551
+ /** @internal */
2552
+ export const tapCauseFilter: {
2553
+ <E, B, E2, R2, EB, X extends Cause.Cause<any>>(
2554
+ filter: Filter.Filter<Cause.Cause<E>, EB, X>,
2555
+ f: (a: EB, cause: Cause.Cause<E>) => Effect.Effect<B, E2, R2>
2556
+ ): <A, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E | E2, R | R2>
2557
+ <A, E, R, B, E2, R2, EB, X extends Cause.Cause<any>>(
2558
+ self: Effect.Effect<A, E, R>,
2559
+ filter: Filter.Filter<Cause.Cause<E>, EB, X>,
2560
+ f: (a: EB, cause: Cause.Cause<E>) => Effect.Effect<B, E2, R2>
2561
+ ): Effect.Effect<A, E | E2, R | R2>
2562
+ } = dual(
2563
+ 3,
2564
+ <A, E, R, B, E2, R2, EB, X extends Cause.Cause<any>>(
2565
+ self: Effect.Effect<A, E, R>,
2566
+ filter: Filter.Filter<Cause.Cause<E>, EB, X>,
2567
+ f: (a: EB, cause: Cause.Cause<E>) => Effect.Effect<B, E2, R2>
2568
+ ): Effect.Effect<A, E | E2, R | R2> =>
2569
+ catchCause(self, (cause) => {
2570
+ const result = filter(cause)
2571
+ if (Result.isFailure(result)) {
2572
+ return failCause(cause)
2573
+ }
2574
+ return andThen(internalCall(() => f(result.success, cause)), failCause(cause))
2575
+ })
2576
+ )
2577
+
2542
2578
  /** @internal */
2543
2579
  export const tapError: {
2544
2580
  <E, B, E2, R2>(
@@ -2553,7 +2589,7 @@ export const tapError: {
2553
2589
  <A, E, R, B, E2, R2>(
2554
2590
  self: Effect.Effect<A, E, R>,
2555
2591
  f: (e: NoInfer<E>) => Effect.Effect<B, E2, R2>
2556
- ): Effect.Effect<A, E | E2, R | R2> => tapCauseIf(self, findError as any, (e: any) => f(e)) as any
2592
+ ): Effect.Effect<A, E | E2, R | R2> => tapCauseFilter(self, findError as any, (e: any) => f(e)) as any
2557
2593
  )
2558
2594
 
2559
2595
  /** @internal */
@@ -2620,7 +2656,7 @@ export const tapDefect: {
2620
2656
  <A, E, R, B, E2, R2>(
2621
2657
  self: Effect.Effect<A, E, R>,
2622
2658
  f: (defect: unknown) => Effect.Effect<B, E2, R2>
2623
- ): Effect.Effect<A, E | E2, R | R2> => tapCauseIf(self, findDefect as any, (_: any) => f(_)) as any
2659
+ ): Effect.Effect<A, E | E2, R | R2> => tapCauseFilter(self, findDefect as any, (_: any) => f(_)) as any
2624
2660
  )
2625
2661
 
2626
2662
  /** @internal */
@@ -2630,10 +2666,10 @@ export const catchIf: {
2630
2666
  f: (e: EB) => Effect.Effect<A2, E2, R2>,
2631
2667
  orElse?: ((e: Exclude<E, EB>) => Effect.Effect<A3, E3, R3>) | undefined
2632
2668
  ): <A, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A | A2 | A3, E2 | E3, R | R2 | R3>
2633
- <E, Result extends Filter.ResultOrBool, A2, E2, R2, A3 = never, E3 = Filter.Fail<E, Result>, R3 = never>(
2634
- filter: Filter.OrPredicate<NoInfer<E>, Result>,
2635
- f: (e: Filter.Pass<E, Result>) => Effect.Effect<A2, E2, R2>,
2636
- orElse?: ((e: Filter.Fail<E, Result>) => Effect.Effect<A3, E3, R3>) | undefined
2669
+ <E, A2, E2, R2, A3 = never, E3 = E, R3 = never>(
2670
+ predicate: Predicate.Predicate<NoInfer<E>>,
2671
+ f: (e: NoInfer<E>) => Effect.Effect<A2, E2, R2>,
2672
+ orElse?: ((e: NoInfer<E>) => Effect.Effect<A3, E3, R3>) | undefined
2637
2673
  ): <A, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A | A2 | A3, E2 | E3, R | R2 | R3>
2638
2674
  <A, E, R, EB extends E, A2, E2, R2, A3 = never, E3 = Exclude<E, EB>, R3 = never>(
2639
2675
  self: Effect.Effect<A, E, R>,
@@ -2641,28 +2677,59 @@ export const catchIf: {
2641
2677
  f: (e: EB) => Effect.Effect<A2, E2, R2>,
2642
2678
  orElse?: ((e: Exclude<E, EB>) => Effect.Effect<A3, E3, R3>) | undefined
2643
2679
  ): Effect.Effect<A | A2 | A3, E2 | E3, R | R2 | R3>
2644
- <A, E, R, Result extends Filter.ResultOrBool, A2, E2, R2, A3 = never, E3 = Filter.Fail<E, Result>, R3 = never>(
2680
+ <A, E, R, A2, E2, R2, A3 = never, E3 = E, R3 = never>(
2645
2681
  self: Effect.Effect<A, E, R>,
2646
- filter: Filter.OrPredicate<NoInfer<E>, Result>,
2647
- f: (e: Filter.Pass<E, Result>) => Effect.Effect<A2, E2, R2>,
2648
- orElse?: ((e: Filter.Fail<E, Result>) => Effect.Effect<A3, E3, R3>) | undefined
2682
+ predicate: Predicate.Predicate<E>,
2683
+ f: (e: E) => Effect.Effect<A2, E2, R2>,
2684
+ orElse?: ((e: E) => Effect.Effect<A3, E3, R3>) | undefined
2685
+ ): Effect.Effect<A | A2 | A3, E2 | E3, R | R2 | R3>
2686
+ } = dual(
2687
+ (args) => isEffect(args[0]),
2688
+ <A, E, R, A2, E2, R2, A3 = never, E3 = E, R3 = never>(
2689
+ self: Effect.Effect<A, E, R>,
2690
+ predicate: Predicate.Predicate<E>,
2691
+ f: (e: E) => Effect.Effect<A2, E2, R2>,
2692
+ orElse?: ((e: E) => Effect.Effect<A3, E3, R3>) | undefined
2693
+ ): Effect.Effect<A | A2 | A3, E2 | E3, R | R2 | R3> =>
2694
+ catchCause(self, (cause): Effect.Effect<A2 | A3, E2 | E3, R2 | R3> => {
2695
+ const error = findError(cause)
2696
+ if (Result.isFailure(error)) return failCause(error.failure)
2697
+ if (!predicate(error.success)) {
2698
+ return orElse ? internalCall(() => orElse(error.success as any)) : failCause(cause as any as Cause.Cause<E3>)
2699
+ }
2700
+ return internalCall(() => f(error.success as any))
2701
+ })
2702
+ )
2703
+
2704
+ /** @internal */
2705
+ export const catchFilter: {
2706
+ <E, EB, A2, E2, R2, X, A3 = never, E3 = X, R3 = never>(
2707
+ filter: Filter.Filter<NoInfer<E>, EB, X>,
2708
+ f: (e: EB) => Effect.Effect<A2, E2, R2>,
2709
+ orElse?: ((e: X) => Effect.Effect<A3, E3, R3>) | undefined
2710
+ ): <A, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A | A2 | A3, E2 | E3, R | R2 | R3>
2711
+ <A, E, R, EB, A2, E2, R2, X, A3 = never, E3 = X, R3 = never>(
2712
+ self: Effect.Effect<A, E, R>,
2713
+ filter: Filter.Filter<NoInfer<E>, EB, X>,
2714
+ f: (e: EB) => Effect.Effect<A2, E2, R2>,
2715
+ orElse?: ((e: X) => Effect.Effect<A3, E3, R3>) | undefined
2649
2716
  ): Effect.Effect<A | A2 | A3, E2 | E3, R | R2 | R3>
2650
2717
  } = dual(
2651
2718
  (args) => isEffect(args[0]),
2652
2719
  <A, E, R, EB, A2, E2, R2, X, A3 = never, E3 = X, R3 = never>(
2653
2720
  self: Effect.Effect<A, E, R>,
2654
- filter: Filter.Filter<NoInfer<E>, EB, X> | Predicate.Predicate<NoInfer<E>>,
2721
+ filter: Filter.Filter<NoInfer<E>, EB, X>,
2655
2722
  f: (e: EB) => Effect.Effect<A2, E2, R2>,
2656
2723
  orElse?: ((e: X) => Effect.Effect<A3, E3, R3>) | undefined
2657
2724
  ): Effect.Effect<A | A2 | A3, E2 | E3, R | R2 | R3> =>
2658
2725
  catchCause(self, (cause): Effect.Effect<A2 | A3, E2 | E3, R2 | R3> => {
2659
2726
  const error = findError(cause)
2660
2727
  if (Result.isFailure(error)) return failCause(error.failure)
2661
- const result = Filter.apply(filter as any, error.success)
2728
+ const result = filter(error.success)
2662
2729
  if (Result.isFailure(result)) {
2663
2730
  return orElse ? internalCall(() => orElse(result.failure as any)) : failCause(cause as any as Cause.Cause<E3>)
2664
2731
  }
2665
- return internalCall(() => f(result.success as any))
2732
+ return internalCall(() => f(result.success))
2666
2733
  })
2667
2734
  )
2668
2735
 
@@ -2798,7 +2865,7 @@ export const catchTags: {
2798
2865
  >
2799
2866
  } = dual((args) => isEffect(args[0]), (self: Effect.Effect<any, any, any>, cases: Record<string, any>, orElse: any) => {
2800
2867
  let keys: Array<string>
2801
- return catchIf(
2868
+ return catchFilter(
2802
2869
  self,
2803
2870
  (e) => {
2804
2871
  keys ??= Object.keys(cases)
@@ -2808,7 +2875,7 @@ export const catchTags: {
2808
2875
  },
2809
2876
  (e: any) => internalCall(() => cases[e["_tag"] as string](e)),
2810
2877
  orElse
2811
- )
2878
+ ) as any
2812
2879
  })
2813
2880
 
2814
2881
  /** @internal */
@@ -3044,7 +3111,7 @@ export const unwrapReason: {
3044
3111
  self: Effect.Effect<A, E, R>,
3045
3112
  errorTag: K
3046
3113
  ): Effect.Effect<A, ExcludeTag<E, K> | ReasonOf<ExtractTag<E, K>>, R> =>
3047
- catchIf(
3114
+ catchFilter(
3048
3115
  self,
3049
3116
  (e: any) => {
3050
3117
  if (isTagged(e, errorTag) && hasProperty(e, "reason")) {
@@ -3053,7 +3120,7 @@ export const unwrapReason: {
3053
3120
  return Result.fail(e)
3054
3121
  },
3055
3122
  fail as any
3056
- )
3123
+ ) as any
3057
3124
  )
3058
3125
 
3059
3126
  /** @internal */
@@ -3804,34 +3871,51 @@ export const ensuring: {
3804
3871
 
3805
3872
  /** @internal */
3806
3873
  export const onExitIf: {
3807
- <A, E, XE, XR, Result extends Filter.ResultOrBool>(
3808
- filter: Filter.OrPredicate<Exit.Exit<NoInfer<A>, NoInfer<E>>, Result>,
3809
- f: (
3810
- pass: Filter.Pass<Exit.Exit<NoInfer<A>, NoInfer<E>>, Result>,
3811
- exit: Exit.Exit<NoInfer<A>, NoInfer<E>>
3812
- ) => Effect.Effect<void, XE, XR>
3874
+ <A, E, XE, XR>(
3875
+ predicate: Predicate.Predicate<Exit.Exit<NoInfer<A>, NoInfer<E>>>,
3876
+ f: (exit: Exit.Exit<NoInfer<A>, NoInfer<E>>) => Effect.Effect<void, XE, XR>
3813
3877
  ): <R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E | XE, R | XR>
3814
- <A, E, R, XE, XR, Result extends Filter.ResultOrBool>(
3878
+ <A, E, R, XE, XR>(
3815
3879
  self: Effect.Effect<A, E, R>,
3816
- filter: Filter.OrPredicate<Exit.Exit<NoInfer<A>, NoInfer<E>>, Result>,
3817
- f: (
3818
- pass: Filter.Pass<Exit.Exit<NoInfer<A>, NoInfer<E>>, Result>,
3819
- exit: Exit.Exit<NoInfer<A>, NoInfer<E>>
3820
- ) => Effect.Effect<void, XE, XR>
3880
+ predicate: Predicate.Predicate<Exit.Exit<NoInfer<A>, NoInfer<E>>>,
3881
+ f: (exit: Exit.Exit<NoInfer<A>, NoInfer<E>>) => Effect.Effect<void, XE, XR>
3821
3882
  ): Effect.Effect<A, E | XE, R | XR>
3822
3883
  } = dual(
3823
3884
  3,
3824
- <A, E, R, XE, XR, Result extends Filter.ResultOrBool>(
3885
+ <A, E, R, XE, XR>(
3825
3886
  self: Effect.Effect<A, E, R>,
3826
- filter: Filter.OrPredicate<Exit.Exit<NoInfer<A>, NoInfer<E>>, Result>,
3827
- f: (
3828
- pass: Filter.Pass<Exit.Exit<NoInfer<A>, NoInfer<E>>, Result>,
3829
- exit: Exit.Exit<NoInfer<A>, NoInfer<E>>
3830
- ) => Effect.Effect<void, XE, XR>
3887
+ predicate: Predicate.Predicate<Exit.Exit<NoInfer<A>, NoInfer<E>>>,
3888
+ f: (exit: Exit.Exit<NoInfer<A>, NoInfer<E>>) => Effect.Effect<void, XE, XR>
3831
3889
  ): Effect.Effect<A, E | XE, R | XR> =>
3832
3890
  onExit(self, (exit) => {
3833
- const pass = Filter.apply(filter, exit)
3834
- return Result.isFailure(pass) ? void_ : f(pass.success as any, exit)
3891
+ if (!predicate(exit)) {
3892
+ return void_
3893
+ }
3894
+ return f(exit)
3895
+ })
3896
+ )
3897
+
3898
+ /** @internal */
3899
+ export const onExitFilter: {
3900
+ <A, E, XE, XR, B, X>(
3901
+ filter: Filter.Filter<Exit.Exit<NoInfer<A>, NoInfer<E>>, B, X>,
3902
+ f: (b: B, exit: Exit.Exit<NoInfer<A>, NoInfer<E>>) => Effect.Effect<void, XE, XR>
3903
+ ): <R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E | XE, R | XR>
3904
+ <A, E, R, XE, XR, B, X>(
3905
+ self: Effect.Effect<A, E, R>,
3906
+ filter: Filter.Filter<Exit.Exit<NoInfer<A>, NoInfer<E>>, B, X>,
3907
+ f: (b: B, exit: Exit.Exit<NoInfer<A>, NoInfer<E>>) => Effect.Effect<void, XE, XR>
3908
+ ): Effect.Effect<A, E | XE, R | XR>
3909
+ } = dual(
3910
+ 3,
3911
+ <A, E, R, XE, XR, B, X>(
3912
+ self: Effect.Effect<A, E, R>,
3913
+ filter: Filter.Filter<Exit.Exit<NoInfer<A>, NoInfer<E>>, B, X>,
3914
+ f: (b: B, exit: Exit.Exit<NoInfer<A>, NoInfer<E>>) => Effect.Effect<void, XE, XR>
3915
+ ): Effect.Effect<A, E | XE, R | XR> =>
3916
+ onExit(self, (exit) => {
3917
+ const b = filter(exit)
3918
+ return Result.isFailure(b) ? void_ : f(b.success, exit)
3835
3919
  })
3836
3920
  )
3837
3921
 
@@ -3849,37 +3933,66 @@ export const onError: {
3849
3933
  <A, E, R, XE, XR>(
3850
3934
  self: Effect.Effect<A, E, R>,
3851
3935
  f: (cause: Cause.Cause<NoInfer<E>>) => Effect.Effect<void, XE, XR>
3852
- ): Effect.Effect<A, E | XE, R | XR> => onExitIf(self, exitFilterCause as any, f as any) as any
3936
+ ): Effect.Effect<A, E | XE, R | XR> => onExitFilter(self, exitFilterCause as any, f as any) as any
3853
3937
  )
3854
3938
 
3855
3939
  /** @internal */
3856
3940
  export const onErrorIf: {
3857
- <E, Result extends Filter.ResultOrBool, XE, XR>(
3858
- filter: Filter.OrPredicate<Cause.Cause<E>, Result>,
3859
- f: (failure: Filter.Pass<Cause.Cause<E>, Result>, cause: Cause.Cause<E>) => Effect.Effect<void, XE, XR>
3941
+ <E, XE, XR>(
3942
+ predicate: Predicate.Predicate<Cause.Cause<E>>,
3943
+ f: (cause: Cause.Cause<E>) => Effect.Effect<void, XE, XR>
3860
3944
  ): <A, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E | XE, R | XR>
3861
- <A, E, R, XE, XR, Result extends Filter.ResultOrBool>(
3945
+ <A, E, R, XE, XR>(
3862
3946
  self: Effect.Effect<A, E, R>,
3863
- filter: Filter.OrPredicate<Cause.Cause<E>, Result>,
3864
- f: (failure: Filter.Pass<Cause.Cause<E>, Result>, cause: Cause.Cause<E>) => Effect.Effect<void, XE, XR>
3947
+ predicate: Predicate.Predicate<Cause.Cause<E>>,
3948
+ f: (cause: Cause.Cause<E>) => Effect.Effect<void, XE, XR>
3865
3949
  ): Effect.Effect<A, E | XE, R | XR>
3866
3950
  } = dual(
3867
3951
  3,
3868
- <A, E, R, XE, XR, Result extends Filter.ResultOrBool>(
3952
+ <A, E, R, XE, XR>(
3869
3953
  self: Effect.Effect<A, E, R>,
3870
- filter: Filter.OrPredicate<Cause.Cause<E>, Result>,
3871
- f: (failure: Filter.Pass<Cause.Cause<E>, Result>, cause: Cause.Cause<E>) => Effect.Effect<void, XE, XR>
3954
+ predicate: Predicate.Predicate<Cause.Cause<E>>,
3955
+ f: (cause: Cause.Cause<E>) => Effect.Effect<void, XE, XR>
3872
3956
  ): Effect.Effect<A, E | XE, R | XR> =>
3873
3957
  onExitIf(
3874
3958
  self,
3875
- ((exit: Exit.Exit<any, any>) => {
3876
- if (exit._tag !== "Failure") return Result.fail(exit)
3877
- return Filter.apply(filter, exit.cause)
3878
- }) as any,
3879
- (eb: any, exit: any) => f(eb, (exit as Exit.Failure<any, any>).cause)
3959
+ (exit): exit is Exit.Failure<A, E> => {
3960
+ if (exit._tag !== "Failure") {
3961
+ return false
3962
+ }
3963
+ return predicate(exit.cause)
3964
+ },
3965
+ (exit) => f((exit as Exit.Failure<A, E>).cause)
3880
3966
  ) as any
3881
3967
  )
3882
3968
 
3969
+ /** @internal */
3970
+ export const onErrorFilter: {
3971
+ <A, E, EB, X, XE, XR>(
3972
+ filter: Filter.Filter<Cause.Cause<E>, EB, X>,
3973
+ f: (failure: EB, cause: Cause.Cause<E>) => Effect.Effect<void, XE, XR>
3974
+ ): <R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A, E | XE, R | XR>
3975
+ <A, E, R, EB, X, XE, XR>(
3976
+ self: Effect.Effect<A, E, R>,
3977
+ filter: Filter.Filter<Cause.Cause<E>, EB, X>,
3978
+ f: (failure: EB, cause: Cause.Cause<E>) => Effect.Effect<void, XE, XR>
3979
+ ): Effect.Effect<A, E | XE, R | XR>
3980
+ } = dual(
3981
+ 3,
3982
+ <A, E, R, EB, X, XE, XR>(
3983
+ self: Effect.Effect<A, E, R>,
3984
+ filter: Filter.Filter<Cause.Cause<E>, EB, X>,
3985
+ f: (failure: EB, cause: Cause.Cause<E>) => Effect.Effect<void, XE, XR>
3986
+ ): Effect.Effect<A, E | XE, R | XR> =>
3987
+ onExit(self, (exit) => {
3988
+ if (exit._tag !== "Failure") {
3989
+ return void_
3990
+ }
3991
+ const result = filter(exit.cause)
3992
+ return Result.isFailure(result) ? void_ : f(result.success, exit.cause)
3993
+ })
3994
+ )
3995
+
3883
3996
  /** @internal */
3884
3997
  export const onInterrupt: {
3885
3998
  <XE, XR>(
@@ -3894,8 +4007,7 @@ export const onInterrupt: {
3894
4007
  <A, E, R, XE, XR>(
3895
4008
  self: Effect.Effect<A, E, R>,
3896
4009
  finalizer: (interruptors: ReadonlySet<number>) => Effect.Effect<void, XE, XR>
3897
- ): Effect.Effect<A, E | XE, R | XR> =>
3898
- onErrorIf<E, Result.Result<Set<number>, Cause.Cause<E>>, XE, XR>(causeFilterInterruptors, finalizer)(self)
4010
+ ): Effect.Effect<A, E | XE, R | XR> => onErrorFilter(causeFilterInterruptors as any, finalizer)(self) as any
3899
4011
  )
3900
4012
 
3901
4013
  /** @internal */
@@ -4102,25 +4214,25 @@ export const all = <
4102
4214
 
4103
4215
  /** @internal */
4104
4216
  export const partition: {
4105
- <A, B, E, R>(
4106
- f: (a: A, i: number) => Effect.Effect<B, E, R>,
4217
+ <A, Pass, Fail, E, R>(
4218
+ filter: Filter.FilterEffect<NoInfer<A>, Pass, Fail, E, R, [i: number]>,
4107
4219
  options?: { readonly concurrency?: Concurrency | undefined }
4108
- ): (elements: Iterable<A>) => Effect.Effect<[excluded: Array<E>, satisfying: Array<B>], never, R>
4109
- <A, B, E, R>(
4220
+ ): (elements: Iterable<A>) => Effect.Effect<[excluded: Array<Fail>, satisfying: Array<Pass>], E, R>
4221
+ <A, Pass, Fail, E, R>(
4110
4222
  elements: Iterable<A>,
4111
- f: (a: A, i: number) => Effect.Effect<B, E, R>,
4223
+ filter: Filter.FilterEffect<NoInfer<A>, Pass, Fail, E, R, [i: number]>,
4112
4224
  options?: { readonly concurrency?: Concurrency | undefined }
4113
- ): Effect.Effect<[excluded: Array<E>, satisfying: Array<B>], never, R>
4225
+ ): Effect.Effect<[excluded: Array<Fail>, satisfying: Array<Pass>], E, R>
4114
4226
  } = dual(
4115
4227
  (args) => isIterable(args[0]) && !isEffect(args[0]),
4116
- <A, B, E, R>(
4228
+ <A, Pass, Fail, E, R>(
4117
4229
  elements: Iterable<A>,
4118
- f: (a: A, i: number) => Effect.Effect<B, E, R>,
4230
+ filter: Filter.FilterEffect<A, Pass, Fail, E, R, [i: number]>,
4119
4231
  options?: { readonly concurrency?: Concurrency | undefined }
4120
- ): Effect.Effect<[excluded: Array<E>, satisfying: Array<B>], never, R> =>
4232
+ ): Effect.Effect<[excluded: Array<Fail>, satisfying: Array<Pass>], E, R> =>
4121
4233
  map(
4122
- forEach(elements, (a, i) => result(f(a, i)), options),
4123
- (results) => Arr.partitionMap(results, identity)
4234
+ forEach(elements, filter, options),
4235
+ (results) => Arr.partition(results, identity)
4124
4236
  )
4125
4237
  )
4126
4238
 
@@ -4167,7 +4279,7 @@ export const validate: {
4167
4279
  } | undefined
4168
4280
  ): Effect.Effect<Array<B> | void, Arr.NonEmptyArray<E>, R> =>
4169
4281
  flatMap(
4170
- partition(elements, f, { concurrency: options?.concurrency }),
4282
+ partition(elements, (a, i) => result(f(a, i)), { concurrency: options?.concurrency }),
4171
4283
  ([excluded, satisfying]) => {
4172
4284
  if (Arr.isArrayNonEmpty(excluded)) {
4173
4285
  return fail(excluded)
@@ -4348,33 +4460,85 @@ export const filterOrElse: {
4348
4460
  refinement: Predicate.Refinement<NoInfer<A>, B>,
4349
4461
  orElse: (a: EqualsWith<A, B, NoInfer<A>, Exclude<NoInfer<A>, B>>) => Effect.Effect<C, E2, R2>
4350
4462
  ): <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<B | C, E2 | E, R2 | R>
4351
- <A, Result extends Filter.ResultOrBool, C, E2, R2>(
4352
- filter: Filter.OrPredicate<NoInfer<A>, Result>,
4353
- orElse: (a: Filter.Fail<A, Result>) => Effect.Effect<C, E2, R2>
4354
- ): <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<Filter.Pass<A, Result> | C, E2 | E, R2 | R>
4463
+ <A, C, E2, R2>(
4464
+ predicate: Predicate.Predicate<NoInfer<A>>,
4465
+ orElse: (a: NoInfer<A>) => Effect.Effect<C, E2, R2>
4466
+ ): <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<A | C, E2 | E, R2 | R>
4355
4467
  <A, E, R, C, E2, R2, B extends A>(
4356
4468
  self: Effect.Effect<A, E, R>,
4357
4469
  refinement: Predicate.Refinement<A, B>,
4358
4470
  orElse: (a: EqualsWith<A, B, A, Exclude<A, B>>) => Effect.Effect<C, E2, R2>
4359
4471
  ): Effect.Effect<B | C, E | E2, R | R2>
4360
- <A, E, R, Result extends Filter.ResultOrBool, C, E2, R2>(
4472
+ <A, E, R, C, E2, R2>(
4473
+ self: Effect.Effect<A, E, R>,
4474
+ predicate: Predicate.Predicate<NoInfer<A>>,
4475
+ orElse: (a: NoInfer<A>) => Effect.Effect<C, E2, R2>
4476
+ ): Effect.Effect<A | C, E | E2, R | R2>
4477
+ } = dual(3, <A, E, R, B, E2, R2>(
4478
+ self: Effect.Effect<A, E, R>,
4479
+ predicate: Predicate.Predicate<A>,
4480
+ orElse: (a: A) => Effect.Effect<B, E2, R2>
4481
+ ): Effect.Effect<A | B, E | E2, R | R2> =>
4482
+ flatMap(
4483
+ self,
4484
+ (a) => predicate(a) ? succeed<A | B>(a) : orElse(a)
4485
+ ))
4486
+
4487
+ /** @internal */
4488
+ export const filterMapOrElse: {
4489
+ <A, B, X, C, E2, R2>(
4490
+ filter: Filter.Filter<NoInfer<A>, B, X>,
4491
+ orElse: (x: X) => Effect.Effect<C, E2, R2>
4492
+ ): <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<B | C, E2 | E, R2 | R>
4493
+ <A, E, R, B, X, C, E2, R2>(
4361
4494
  self: Effect.Effect<A, E, R>,
4362
- filter: Filter.OrPredicate<NoInfer<A>, Result>,
4363
- orElse: (a: Filter.Fail<A, Result>) => Effect.Effect<C, E2, R2>
4364
- ): Effect.Effect<Filter.Pass<A, Result> | C, E | E2, R | R2>
4365
- } = dual(3, <A, E, R, Result extends Filter.ResultOrBool, C, E2, R2>(
4495
+ filter: Filter.Filter<NoInfer<A>, B, X>,
4496
+ orElse: (x: X) => Effect.Effect<C, E2, R2>
4497
+ ): Effect.Effect<B | C, E | E2, R | R2>
4498
+ } = dual(3, <A, E, R, B, X, C, E2, R2>(
4366
4499
  self: Effect.Effect<A, E, R>,
4367
- filter: Filter.OrPredicate<NoInfer<A>, Result>,
4368
- orElse: (a: Filter.Fail<A, Result>) => Effect.Effect<C, E2, R2>
4369
- ): Effect.Effect<Filter.Pass<A, Result> | C, E | E2, R | R2> =>
4500
+ filter: Filter.Filter<NoInfer<A>, B, X>,
4501
+ orElse: (x: X) => Effect.Effect<C, E2, R2>
4502
+ ): Effect.Effect<B | C, E | E2, R | R2> =>
4370
4503
  flatMap(
4371
4504
  self,
4372
4505
  (a) => {
4373
- const result = Filter.apply(filter, a)
4374
- return Result.isFailure(result) ? orElse(result.failure) : succeed(result.success) as any
4506
+ const result = filter(a)
4507
+ return (Result.isFailure(result)
4508
+ ? orElse(result.failure)
4509
+ : succeed(result.success)) as Effect.Effect<B | C, E2, R2>
4375
4510
  }
4376
4511
  ))
4377
4512
 
4513
+ /* @internal */
4514
+ export const filterMapOrFail: {
4515
+ <A, B, X, E2>(
4516
+ filter: Filter.Filter<NoInfer<A>, B, X>,
4517
+ orFailWith: (x: X) => E2
4518
+ ): <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<B, E2 | E, R>
4519
+ <A, B, X>(
4520
+ filter: Filter.Filter<NoInfer<A>, B, X>
4521
+ ): <E, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<B, Cause.NoSuchElementError | E, R>
4522
+ <A, E, R, B, X, E2>(
4523
+ self: Effect.Effect<A, E, R>,
4524
+ filter: Filter.Filter<NoInfer<A>, B, X>,
4525
+ orFailWith: (x: X) => E2
4526
+ ): Effect.Effect<B, E2 | E, R>
4527
+ <A, E, R, B, X>(
4528
+ self: Effect.Effect<A, E, R>,
4529
+ filter: Filter.Filter<NoInfer<A>, B, X>
4530
+ ): Effect.Effect<B, Cause.NoSuchElementError | E, R>
4531
+ } = dual((args) => isEffect(args[0]), <A, E, R, B, X, E2>(
4532
+ self: Effect.Effect<A, E, R>,
4533
+ filter: Filter.Filter<NoInfer<A>, B, X>,
4534
+ orFailWith?: (x: X) => E2
4535
+ ): Effect.Effect<B, E2 | Cause.NoSuchElementError | E, R> =>
4536
+ filterMapOrElse(
4537
+ self,
4538
+ filter,
4539
+ orFailWith ? (x: X) => fail(orFailWith(x)) : () => fail(new NoSuchElementError() as E2)
4540
+ ))
4541
+
4378
4542
  /** @internal */
4379
4543
  export const filter: {
4380
4544
  <A, B extends A>(
@@ -4383,13 +4547,6 @@ export const filter: {
4383
4547
  <A>(
4384
4548
  predicate: Predicate.Predicate<NoInfer<A>>
4385
4549
  ): (elements: Iterable<A>) => Effect.Effect<Array<A>>
4386
- <A, B, X>(
4387
- filter: Filter.Filter<NoInfer<A>, B, X>
4388
- ): (elements: Iterable<A>) => Effect.Effect<Array<B>>
4389
- <A, B, X, E, R>(
4390
- filter: Filter.FilterEffect<NoInfer<A>, B, X, E, R>,
4391
- options?: { readonly concurrency?: Concurrency | undefined }
4392
- ): (elements: Iterable<A>) => Effect.Effect<Array<B>, E, R>
4393
4550
  <A, E, R>(
4394
4551
  predicate: (a: NoInfer<A>, i: number) => Effect.Effect<boolean, E, R>,
4395
4552
  options?: { readonly concurrency?: Concurrency | undefined }
@@ -4402,15 +4559,6 @@ export const filter: {
4402
4559
  elements: Iterable<A>,
4403
4560
  predicate: Predicate.Predicate<A>
4404
4561
  ): Effect.Effect<Array<A>>
4405
- <A, B, X>(
4406
- elements: Iterable<A>,
4407
- filter: Filter.Filter<NoInfer<A>, B, X>
4408
- ): Effect.Effect<Array<B>>
4409
- <A, B, X, E, R>(
4410
- elements: Iterable<A>,
4411
- filter: Filter.FilterEffect<NoInfer<A>, B, X, E, R>,
4412
- options?: { readonly concurrency?: Concurrency | undefined }
4413
- ): Effect.Effect<Array<B>, E, R>
4414
4562
  <A, E, R>(
4415
4563
  iterable: Iterable<A>,
4416
4564
  predicate: (a: NoInfer<A>, i: number) => Effect.Effect<boolean, E, R>,
@@ -4418,36 +4566,27 @@ export const filter: {
4418
4566
  ): Effect.Effect<Array<A>, E, R>
4419
4567
  } = dual(
4420
4568
  (args) => isIterable(args[0]) && !isEffect(args[0]),
4421
- <A, B, X, E, R>(
4569
+ <A, E, R>(
4422
4570
  elements: Iterable<A>,
4423
- filter:
4424
- | Filter.FilterEffect<A, B, X, E, R>
4571
+ predicate:
4425
4572
  | Predicate.Predicate<A>
4426
4573
  | ((a: A, i: number) => Effect.Effect<boolean, E, R>),
4427
4574
  options?: { readonly concurrency?: Concurrency | undefined }
4428
- ): Effect.Effect<Array<B>, E, R> =>
4575
+ ): Effect.Effect<Array<A>, E, R> =>
4429
4576
  suspend(() => {
4430
- const out: Array<any> = []
4577
+ const out: Array<A> = []
4431
4578
  return as(
4432
4579
  forEach(
4433
4580
  elements,
4434
4581
  (a, i) => {
4435
- const result = (filter as Function)(a, i)
4582
+ const result = (predicate as Function)(a, i)
4436
4583
  if (typeof result === "boolean") {
4437
4584
  if (result) out.push(a)
4438
4585
  return void_ as any
4439
4586
  }
4440
- if (!isEffect(result)) {
4441
- if (!Result.isFailure(result)) {
4442
- out.push(result.success)
4443
- }
4444
- return void_ as any
4445
- }
4446
- return map(result, (r: any) => {
4447
- if (typeof r === "boolean") {
4448
- if (r) out.push(a)
4449
- } else if (!Result.isFailure(r)) {
4450
- out.push(r.success)
4587
+ return map(result, (keep) => {
4588
+ if (keep) {
4589
+ out.push(a)
4451
4590
  }
4452
4591
  })
4453
4592
  },
@@ -4461,6 +4600,72 @@ export const filter: {
4461
4600
  })
4462
4601
  )
4463
4602
 
4603
+ /** @internal */
4604
+ export const filterMap: {
4605
+ <A, B, X>(
4606
+ filter: Filter.Filter<NoInfer<A>, B, X>
4607
+ ): (elements: Iterable<A>) => Effect.Effect<Array<B>>
4608
+ <A, B, X>(
4609
+ elements: Iterable<A>,
4610
+ filter: Filter.Filter<NoInfer<A>, B, X>
4611
+ ): Effect.Effect<Array<B>>
4612
+ } = dual(
4613
+ (args) => isIterable(args[0]) && !isEffect(args[0]),
4614
+ <A, B, X>(
4615
+ elements: Iterable<A>,
4616
+ filter: Filter.Filter<A, B, X>
4617
+ ): Effect.Effect<Array<B>> =>
4618
+ suspend(() => {
4619
+ const out: Array<B> = []
4620
+ for (const a of elements) {
4621
+ const result = filter(a)
4622
+ if (Result.isSuccess(result)) {
4623
+ out.push(result.success)
4624
+ }
4625
+ }
4626
+ return succeed(out)
4627
+ })
4628
+ )
4629
+
4630
+ /** @internal */
4631
+ export const filterMapEffect: {
4632
+ <A, B, X, E, R>(
4633
+ filter: Filter.FilterEffect<NoInfer<A>, B, X, E, R>,
4634
+ options?: { readonly concurrency?: Concurrency | undefined }
4635
+ ): (elements: Iterable<A>) => Effect.Effect<Array<B>, E, R>
4636
+ <A, B, X, E, R>(
4637
+ elements: Iterable<A>,
4638
+ filter: Filter.FilterEffect<NoInfer<A>, B, X, E, R>,
4639
+ options?: { readonly concurrency?: Concurrency | undefined }
4640
+ ): Effect.Effect<Array<B>, E, R>
4641
+ } = dual(
4642
+ (args) => isIterable(args[0]) && !isEffect(args[0]),
4643
+ <A, B, X, E, R>(
4644
+ elements: Iterable<A>,
4645
+ filter: Filter.FilterEffect<A, B, X, E, R>,
4646
+ options?: { readonly concurrency?: Concurrency | undefined }
4647
+ ): Effect.Effect<Array<B>, E, R> =>
4648
+ suspend(() => {
4649
+ const out: Array<B> = []
4650
+ return as(
4651
+ forEach(
4652
+ elements,
4653
+ (a) =>
4654
+ map(filter(a), (result) => {
4655
+ if (Result.isSuccess(result)) {
4656
+ out.push(result.success)
4657
+ }
4658
+ }),
4659
+ {
4660
+ discard: true,
4661
+ concurrency: options?.concurrency
4662
+ }
4663
+ ),
4664
+ out
4665
+ )
4666
+ })
4667
+ )
4668
+
4464
4669
  // ----------------------------------------------------------------------------
4465
4670
  // do notation
4466
4671
  // ----------------------------------------------------------------------------