effect 4.0.0-beta.14 → 4.0.0-beta.15

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 (60) hide show
  1. package/dist/Channel.d.ts +6 -6
  2. package/dist/Channel.d.ts.map +1 -1
  3. package/dist/Channel.js +4 -4
  4. package/dist/Channel.js.map +1 -1
  5. package/dist/Effect.d.ts +7 -7
  6. package/dist/Effect.d.ts.map +1 -1
  7. package/dist/Effect.js.map +1 -1
  8. package/dist/Stream.d.ts +7 -7
  9. package/dist/Stream.d.ts.map +1 -1
  10. package/dist/Stream.js +8 -6
  11. package/dist/Stream.js.map +1 -1
  12. package/dist/Types.d.ts +70 -0
  13. package/dist/Types.d.ts.map +1 -1
  14. package/dist/internal/effect.js +4 -4
  15. package/dist/internal/effect.js.map +1 -1
  16. package/dist/unstable/ai/LanguageModel.d.ts +2 -0
  17. package/dist/unstable/ai/LanguageModel.d.ts.map +1 -1
  18. package/dist/unstable/ai/LanguageModel.js.map +1 -1
  19. package/dist/unstable/cli/Command.d.ts +34 -4
  20. package/dist/unstable/cli/Command.d.ts.map +1 -1
  21. package/dist/unstable/cli/Command.js +73 -24
  22. package/dist/unstable/cli/Command.js.map +1 -1
  23. package/dist/unstable/cli/GlobalFlag.d.ts +21 -56
  24. package/dist/unstable/cli/GlobalFlag.d.ts.map +1 -1
  25. package/dist/unstable/cli/GlobalFlag.js +9 -48
  26. package/dist/unstable/cli/GlobalFlag.js.map +1 -1
  27. package/dist/unstable/cli/internal/command.d.ts +3 -0
  28. package/dist/unstable/cli/internal/command.d.ts.map +1 -1
  29. package/dist/unstable/cli/internal/command.js +2 -0
  30. package/dist/unstable/cli/internal/command.js.map +1 -1
  31. package/dist/unstable/cli/internal/help.d.ts +18 -4
  32. package/dist/unstable/cli/internal/help.d.ts.map +1 -1
  33. package/dist/unstable/cli/internal/help.js +61 -7
  34. package/dist/unstable/cli/internal/help.js.map +1 -1
  35. package/dist/unstable/httpapi/HttpApiBuilder.d.ts +10 -4
  36. package/dist/unstable/httpapi/HttpApiBuilder.d.ts.map +1 -1
  37. package/dist/unstable/httpapi/HttpApiBuilder.js +17 -6
  38. package/dist/unstable/httpapi/HttpApiBuilder.js.map +1 -1
  39. package/dist/unstable/httpapi/HttpApiEndpoint.d.ts +7 -2
  40. package/dist/unstable/httpapi/HttpApiEndpoint.d.ts.map +1 -1
  41. package/dist/unstable/httpapi/HttpApiEndpoint.js.map +1 -1
  42. package/dist/unstable/reactivity/AtomHttpApi.d.ts +2 -2
  43. package/dist/unstable/reactivity/AtomHttpApi.d.ts.map +1 -1
  44. package/dist/unstable/reactivity/AtomRegistry.js +2 -6
  45. package/dist/unstable/reactivity/AtomRegistry.js.map +1 -1
  46. package/package.json +1 -1
  47. package/src/Channel.ts +24 -14
  48. package/src/Effect.ts +30 -8
  49. package/src/Stream.ts +46 -22
  50. package/src/Types.ts +66 -0
  51. package/src/internal/effect.ts +41 -14
  52. package/src/unstable/ai/LanguageModel.ts +9 -6
  53. package/src/unstable/cli/Command.ts +119 -31
  54. package/src/unstable/cli/GlobalFlag.ts +36 -114
  55. package/src/unstable/cli/internal/command.ts +5 -0
  56. package/src/unstable/cli/internal/help.ts +103 -22
  57. package/src/unstable/httpapi/HttpApiBuilder.ts +68 -13
  58. package/src/unstable/httpapi/HttpApiEndpoint.ts +13 -4
  59. package/src/unstable/reactivity/AtomHttpApi.ts +2 -2
  60. package/src/unstable/reactivity/AtomRegistry.ts +2 -6
package/src/Channel.ts CHANGED
@@ -5528,11 +5528,13 @@ export const catchReason: {
5528
5528
  errorTag: K,
5529
5529
  reasonTag: RK,
5530
5530
  f: (
5531
- reason: Types.ExtractReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, RK>
5531
+ reason: Types.ExtractReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, RK>,
5532
+ error: Types.NarrowReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, RK>
5532
5533
  ) => Channel<OutElem1, OutErr1, OutDone1, InElem1, InErr1, InDone1, Env1>,
5533
5534
  orElse?:
5534
5535
  | ((
5535
- reason: Types.ExcludeReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, RK>
5536
+ reason: Types.ExcludeReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, RK>,
5537
+ error: Types.OmitReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, RK>
5536
5538
  ) => Channel<OutElem2, OutErr2, OutDone2, InElem2, InErr2, InDone2, Env2>)
5537
5539
  | undefined
5538
5540
  ): <
@@ -5615,11 +5617,13 @@ export const catchReason: {
5615
5617
  errorTag: K,
5616
5618
  reasonTag: RK,
5617
5619
  f: (
5618
- reason: Types.ExtractReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, RK>
5620
+ reason: Types.ExtractReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, RK>,
5621
+ error: Types.NarrowReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, RK>
5619
5622
  ) => Channel<OutElem1, OutErr1, OutDone1, InElem1, InErr1, InDone1, Env1>,
5620
5623
  orElse?:
5621
5624
  | ((
5622
- reason: Types.ExcludeReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, RK>
5625
+ reason: Types.ExcludeReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, RK>,
5626
+ error: Types.OmitReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, RK>
5623
5627
  ) => Channel<OutElem2, OutErr2, OutDone2, InElem2, InErr2, InDone2, Env2>)
5624
5628
  | undefined
5625
5629
  ): Channel<
@@ -5660,11 +5664,13 @@ export const catchReason: {
5660
5664
  errorTag: K,
5661
5665
  reasonTag: RK,
5662
5666
  f: (
5663
- reason: Types.ExtractReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, RK>
5667
+ reason: Types.ExtractReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, RK>,
5668
+ error: Types.NarrowReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, RK>
5664
5669
  ) => Channel<OutElem1, OutErr1, OutDone1, InElem1, InErr1, InDone1, Env1>,
5665
5670
  orElse?:
5666
5671
  | ((
5667
- reason: Types.ExcludeReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, RK>
5672
+ reason: Types.ExcludeReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, RK>,
5673
+ error: Types.OmitReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, RK>
5668
5674
  ) => Channel<OutElem2, OutErr2, OutDone2, InElem2, InErr2, InDone2, Env2>)
5669
5675
  | undefined
5670
5676
  ): Channel<
@@ -5690,9 +5696,9 @@ export const catchReason: {
5690
5696
  if (isTagged(error, errorTag) && hasProperty(error, "reason")) {
5691
5697
  const reason = error.reason as Types.ExcludeReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, RK>
5692
5698
  if (isTagged(reason, reasonTag)) {
5693
- return f(reason as any)
5699
+ return f(reason as any, error as any)
5694
5700
  }
5695
- return orElse ? orElse(reason) as any : fail(error) as any
5701
+ return orElse ? orElse(reason, error as any) as any : fail(error) as any
5696
5702
  }
5697
5703
  return fail(error) as any
5698
5704
  }
@@ -5716,7 +5722,8 @@ export const catchReasons: {
5716
5722
  OutErr,
5717
5723
  Cases extends {
5718
5724
  [RK in Types.ReasonTags<Types.ExtractTag<Types.NoInfer<OutErr>, K>>]+?: (
5719
- reason: Types.ExtractReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, RK>
5725
+ reason: Types.ExtractReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, RK>,
5726
+ error: Types.NarrowReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, RK>
5720
5727
  ) => Channel<any, any, any, any, any, any, any>
5721
5728
  },
5722
5729
  OutElem2 = Types.unassigned,
@@ -5731,7 +5738,8 @@ export const catchReasons: {
5731
5738
  cases: Cases,
5732
5739
  orElse?:
5733
5740
  | ((
5734
- reason: Types.ExcludeReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, Extract<keyof Cases, string>>
5741
+ reason: Types.ExcludeReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, Extract<keyof Cases, string>>,
5742
+ error: Types.OmitReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, Extract<keyof Cases, string>>
5735
5743
  ) => Channel<OutElem2, OutErr2, OutDone2, InElem2, InErr2, InDone2, Env2>)
5736
5744
  | undefined
5737
5745
  ): <OutElem, OutDone, InElem, InErr, InDone, Env>(
@@ -5797,7 +5805,8 @@ export const catchReasons: {
5797
5805
  K extends Types.Tags<OutErr>,
5798
5806
  Cases extends {
5799
5807
  [RK in Types.ReasonTags<Types.ExtractTag<OutErr, K>>]+?: (
5800
- reason: Types.ExtractReason<Types.ExtractTag<OutErr, K>, RK>
5808
+ reason: Types.ExtractReason<Types.ExtractTag<OutErr, K>, RK>,
5809
+ error: Types.NarrowReason<Types.ExtractTag<OutErr, K>, RK>
5801
5810
  ) => Channel<any, any, any, any, any, any, any>
5802
5811
  },
5803
5812
  OutElem2 = Types.unassigned,
@@ -5813,7 +5822,8 @@ export const catchReasons: {
5813
5822
  cases: Cases,
5814
5823
  orElse?:
5815
5824
  | ((
5816
- reason: Types.ExcludeReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, Extract<keyof Cases, string>>
5825
+ reason: Types.ExcludeReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, Extract<keyof Cases, string>>,
5826
+ error: Types.OmitReason<Types.ExtractTag<Types.NoInfer<OutErr>, K>, Extract<keyof Cases, string>>
5817
5827
  ) => Channel<OutElem2, OutErr2, OutDone2, InElem2, InErr2, InDone2, Env2>)
5818
5828
  | undefined
5819
5829
  ): Channel<
@@ -5872,9 +5882,9 @@ export const catchReasons: {
5872
5882
  const reason = error.reason as { readonly _tag: string }
5873
5883
  keys ??= new Set(Object.keys(cases))
5874
5884
  if (keys.has(reason._tag)) {
5875
- return (cases as any)[reason._tag](reason as any)
5885
+ return (cases as any)[reason._tag](reason as any, error)
5876
5886
  }
5877
- return orElse ? orElse(reason) as any : fail(error) as any
5887
+ return orElse ? orElse(reason, error) as any : fail(error) as any
5878
5888
  }
5879
5889
  return fail(error) as any
5880
5890
  })
package/src/Effect.ts CHANGED
@@ -116,7 +116,9 @@ import type {
116
116
  ExcludeTag,
117
117
  ExtractReason,
118
118
  ExtractTag,
119
+ NarrowReason,
119
120
  NoInfer,
121
+ OmitReason,
120
122
  ReasonOf,
121
123
  ReasonTags,
122
124
  Simplify,
@@ -4534,8 +4536,16 @@ export const catchReason: {
4534
4536
  >(
4535
4537
  errorTag: K,
4536
4538
  reasonTag: RK,
4537
- f: (reason: ExtractReason<ExtractTag<NoInfer<E>, K>, RK>) => Effect<A2, E2, R2>,
4538
- orElse?: ((reasons: ExcludeReason<ExtractTag<NoInfer<E>, K>, RK>) => Effect<A3, E3, R3>) | undefined
4539
+ f: (
4540
+ reason: ExtractReason<ExtractTag<NoInfer<E>, K>, RK>,
4541
+ error: NarrowReason<ExtractTag<NoInfer<E>, K>, RK>
4542
+ ) => Effect<A2, E2, R2>,
4543
+ orElse?:
4544
+ | ((
4545
+ reasons: ExcludeReason<ExtractTag<NoInfer<E>, K>, RK>,
4546
+ error: OmitReason<ExtractTag<NoInfer<E>, K>, RK>
4547
+ ) => Effect<A3, E3, R3>)
4548
+ | undefined
4539
4549
  ): <A, R>(
4540
4550
  self: Effect<A, E, R>
4541
4551
  ) => Effect<A | A2 | Exclude<A3, unassigned>, (A3 extends unassigned ? E : ExcludeTag<E, K>) | E2 | E3, R | R2 | R3>
@@ -4590,8 +4600,10 @@ export const catchReason: {
4590
4600
  self: Effect<A, E, R>,
4591
4601
  errorTag: K,
4592
4602
  reasonTag: RK,
4593
- f: (reason: ExtractReason<ExtractTag<E, K>, RK>) => Effect<A2, E2, R2>,
4594
- orElse?: ((reasons: ExcludeReason<ExtractTag<E, K>, RK>) => Effect<A3, E3, R3>) | undefined
4603
+ f: (reason: ExtractReason<ExtractTag<E, K>, RK>, error: NarrowReason<ExtractTag<E, K>, RK>) => Effect<A2, E2, R2>,
4604
+ orElse?:
4605
+ | ((reasons: ExcludeReason<ExtractTag<E, K>, RK>, error: OmitReason<ExtractTag<E, K>, RK>) => Effect<A3, E3, R3>)
4606
+ | undefined
4595
4607
  ): Effect<A | A2 | Exclude<A3, unassigned>, (A3 extends unassigned ? E : ExcludeTag<E, K>) | E2 | E3, R | R2 | R3>
4596
4608
  } = internal.catchReason
4597
4609
 
@@ -4669,7 +4681,8 @@ export const catchReasons: {
4669
4681
  E,
4670
4682
  Cases extends {
4671
4683
  [RK in ReasonTags<ExtractTag<NoInfer<E>, K>>]+?: (
4672
- reason: ExtractReason<ExtractTag<NoInfer<E>, K>, RK>
4684
+ reason: ExtractReason<ExtractTag<NoInfer<E>, K>, RK>,
4685
+ error: NarrowReason<ExtractTag<NoInfer<E>, K>, RK>
4673
4686
  ) => Effect<any, any, any>
4674
4687
  },
4675
4688
  A2 = unassigned,
@@ -4679,7 +4692,10 @@ export const catchReasons: {
4679
4692
  errorTag: K,
4680
4693
  cases: Cases,
4681
4694
  orElse?:
4682
- | ((reason: ExcludeReason<ExtractTag<NoInfer<E>, K>, Extract<keyof Cases, string>>) => Effect<A2, E2, R2>)
4695
+ | ((
4696
+ reason: ExcludeReason<ExtractTag<NoInfer<E>, K>, Extract<keyof Cases, string>>,
4697
+ error: OmitReason<ExtractTag<NoInfer<E>, K>, Extract<keyof Cases, string>>
4698
+ ) => Effect<A2, E2, R2>)
4683
4699
  | undefined
4684
4700
  ): <A, R>(
4685
4701
  self: Effect<A, E, R>
@@ -4740,7 +4756,10 @@ export const catchReasons: {
4740
4756
  R,
4741
4757
  K extends Tags<E>,
4742
4758
  Cases extends {
4743
- [RK in ReasonTags<ExtractTag<E, K>>]+?: (reason: ExtractReason<ExtractTag<E, K>, RK>) => Effect<any, any, any>
4759
+ [RK in ReasonTags<ExtractTag<E, K>>]+?: (
4760
+ reason: ExtractReason<ExtractTag<E, K>, RK>,
4761
+ error: NarrowReason<ExtractTag<E, K>, RK>
4762
+ ) => Effect<any, any, any>
4744
4763
  },
4745
4764
  A2 = unassigned,
4746
4765
  E2 = never,
@@ -4750,7 +4769,10 @@ export const catchReasons: {
4750
4769
  errorTag: K,
4751
4770
  cases: Cases,
4752
4771
  orElse?:
4753
- | ((reason: ExcludeReason<ExtractTag<NoInfer<E>, K>, Extract<keyof Cases, string>>) => Effect<A2, E2, R2>)
4772
+ | ((
4773
+ reason: ExcludeReason<ExtractTag<NoInfer<E>, K>, Extract<keyof Cases, string>>,
4774
+ error: OmitReason<ExtractTag<NoInfer<E>, K>, Extract<keyof Cases, string>>
4775
+ ) => Effect<A2, E2, R2>)
4754
4776
  | undefined
4755
4777
  ): Effect<
4756
4778
  | A
package/src/Stream.ts CHANGED
@@ -48,7 +48,9 @@ import type {
48
48
  ExcludeTag,
49
49
  ExtractReason,
50
50
  ExtractTag,
51
+ NarrowReason,
51
52
  NoInfer,
53
+ OmitReason,
52
54
  ReasonTags,
53
55
  Tags,
54
56
  unassigned
@@ -8092,8 +8094,16 @@ export const catchReason: {
8092
8094
  >(
8093
8095
  errorTag: K,
8094
8096
  reasonTag: RK,
8095
- f: (reason: ExtractReason<ExtractTag<NoInfer<E>, K>, RK>) => Stream<A2, E2, R2>,
8096
- orElse?: ((reason: ExcludeReason<ExtractTag<NoInfer<E>, K>, RK>) => Stream<A3, E3, R3>) | undefined
8097
+ f: (
8098
+ reason: ExtractReason<ExtractTag<NoInfer<E>, K>, RK>,
8099
+ error: NarrowReason<ExtractTag<NoInfer<E>, K>, RK>
8100
+ ) => Stream<A2, E2, R2>,
8101
+ orElse?:
8102
+ | ((
8103
+ reason: ExcludeReason<ExtractTag<NoInfer<E>, K>, RK>,
8104
+ error: OmitReason<ExtractTag<NoInfer<E>, K>, RK>
8105
+ ) => Stream<A3, E3, R3>)
8106
+ | undefined
8097
8107
  ): <A, R>(
8098
8108
  self: Stream<A, E, R>
8099
8109
  ) => Stream<A | A2 | Exclude<A3, unassigned>, (A3 extends unassigned ? E : ExcludeTag<E, K>) | E2 | E3, R | R2 | R3>
@@ -8156,8 +8166,10 @@ export const catchReason: {
8156
8166
  self: Stream<A, E, R>,
8157
8167
  errorTag: K,
8158
8168
  reasonTag: RK,
8159
- f: (reason: ExtractReason<ExtractTag<E, K>, RK>) => Stream<A2, E2, R2>,
8160
- orElse?: ((reason: ExcludeReason<ExtractTag<E, K>, RK>) => Stream<A3, E3, R3>) | undefined
8169
+ f: (reason: ExtractReason<ExtractTag<E, K>, RK>, error: NarrowReason<ExtractTag<E, K>, RK>) => Stream<A2, E2, R2>,
8170
+ orElse?:
8171
+ | ((reason: ExcludeReason<ExtractTag<E, K>, RK>, error: OmitReason<ExtractTag<E, K>, RK>) => Stream<A3, E3, R3>)
8172
+ | undefined
8161
8173
  ): Stream<A | A2 | Exclude<A3, unassigned>, (A3 extends unassigned ? E : ExcludeTag<E, K>) | E2 | E3, R | R2 | R3>
8162
8174
  } = dual(
8163
8175
  (args) => isStream(args[0]),
@@ -8177,16 +8189,18 @@ export const catchReason: {
8177
8189
  self: Stream<A, E, R>,
8178
8190
  errorTag: K,
8179
8191
  reasonTag: RK,
8180
- f: (reason: ExtractReason<ExtractTag<E, K>, RK>) => Stream<A2, E2, R2>,
8181
- orElse?: ((reason: ExcludeReason<ExtractTag<E, K>, RK>) => Stream<A3, E3, R3>) | undefined
8192
+ f: (reason: ExtractReason<ExtractTag<E, K>, RK>, error: NarrowReason<ExtractTag<E, K>, RK>) => Stream<A2, E2, R2>,
8193
+ orElse?:
8194
+ | ((reason: ExcludeReason<ExtractTag<E, K>, RK>, error: OmitReason<ExtractTag<E, K>, RK>) => Stream<A3, E3, R3>)
8195
+ | undefined
8182
8196
  ): Stream<A | A2 | Exclude<A3, unassigned>, (A3 extends unassigned ? E : ExcludeTag<E, K>) | E2 | E3, R | R2 | R3> =>
8183
8197
  fromChannel(
8184
8198
  Channel.catchReason(
8185
8199
  toChannel(self),
8186
8200
  errorTag,
8187
8201
  reasonTag,
8188
- (reason) => f(reason).channel,
8189
- orElse && ((reason) => orElse(reason).channel)
8202
+ (reason, error) => f(reason, error).channel,
8203
+ orElse && ((reason, error) => orElse(reason, error).channel)
8190
8204
  )
8191
8205
  ) as any
8192
8206
  )
@@ -8279,7 +8293,8 @@ export const catchReasons: {
8279
8293
  E,
8280
8294
  Cases extends {
8281
8295
  [RK in ReasonTags<ExtractTag<NoInfer<E>, K>>]+?: (
8282
- reason: ExtractReason<ExtractTag<NoInfer<E>, K>, RK>
8296
+ reason: ExtractReason<ExtractTag<NoInfer<E>, K>, RK>,
8297
+ error: NarrowReason<ExtractTag<NoInfer<E>, K>, RK>
8283
8298
  ) => Stream<any, any, any>
8284
8299
  },
8285
8300
  A2 = unassigned,
@@ -8289,7 +8304,10 @@ export const catchReasons: {
8289
8304
  errorTag: K,
8290
8305
  cases: Cases,
8291
8306
  orElse?:
8292
- | ((reason: ExcludeReason<ExtractTag<NoInfer<E>, K>, Extract<keyof Cases, string>>) => Stream<A2, E2, R2>)
8307
+ | ((
8308
+ reason: ExcludeReason<ExtractTag<NoInfer<E>, K>, Extract<keyof Cases, string>>,
8309
+ error: OmitReason<ExtractTag<NoInfer<E>, K>, Extract<keyof Cases, string>>
8310
+ ) => Stream<A2, E2, R2>)
8293
8311
  | undefined
8294
8312
  ): <A, R>(self: Stream<A, E, R>) => Stream<
8295
8313
  | A
@@ -8356,7 +8374,8 @@ export const catchReasons: {
8356
8374
  K extends Tags<E>,
8357
8375
  Cases extends {
8358
8376
  [RK in ReasonTags<ExtractTag<E, K>>]+?: (
8359
- reason: ExtractReason<ExtractTag<E, K>, RK>
8377
+ reason: ExtractReason<ExtractTag<E, K>, RK>,
8378
+ error: NarrowReason<ExtractTag<E, K>, RK>
8360
8379
  ) => Stream<any, any, any>
8361
8380
  },
8362
8381
  A2 = unassigned,
@@ -8367,7 +8386,10 @@ export const catchReasons: {
8367
8386
  errorTag: K,
8368
8387
  cases: Cases,
8369
8388
  orElse?:
8370
- | ((reason: ExcludeReason<ExtractTag<NoInfer<E>, K>, Extract<keyof Cases, string>>) => Stream<A2, E2, R2>)
8389
+ | ((
8390
+ reason: ExcludeReason<ExtractTag<NoInfer<E>, K>, Extract<keyof Cases, string>>,
8391
+ error: OmitReason<ExtractTag<NoInfer<E>, K>, Extract<keyof Cases, string>>
8392
+ ) => Stream<A2, E2, R2>)
8371
8393
  | undefined
8372
8394
  ): Stream<
8373
8395
  | A
@@ -8387,12 +8409,12 @@ export const catchReasons: {
8387
8409
  }[keyof Cases]
8388
8410
  >
8389
8411
  } = dual((args) => isStream(args[0]), (self, errorTag, cases, orElse) => {
8390
- const handlers: Record<string, (reason: any) => Channel.Channel<any, any, any, any, any, any, any>> = {}
8412
+ const handlers: Record<string, (reason: any, error: any) => Channel.Channel<any, any, any, any, any, any, any>> = {}
8391
8413
  for (const key of Object.keys(cases)) {
8392
8414
  const handler = (cases as any)[key]
8393
- handlers[key] = (reason) => handler(reason).channel
8415
+ handlers[key] = (reason, error) => handler(reason, error).channel
8394
8416
  }
8395
- const orElseHandler = orElse && ((reason: any) => orElse(reason).channel)
8417
+ const orElseHandler = orElse && ((reason: any, error: any) => orElse(reason, error).channel)
8396
8418
  return fromChannel(
8397
8419
  Channel.catchReasons(self.channel, errorTag as any, handlers as any, orElseHandler as any) as Channel.Channel<
8398
8420
  Arr.NonEmptyReadonlyArray<any>,
@@ -13638,12 +13660,15 @@ export const aggregateWithin: {
13638
13660
  * @category Aggregation
13639
13661
  */
13640
13662
  B>()
13663
+ let leftover: Arr.NonEmptyReadonlyArray<A2> | undefined
13641
13664
  const step = yield* Schedule.toStepWithSleep(schedule)
13642
- const stepToBuffer = Effect.suspend(() => step(lastOutput)).pipe(
13643
- Effect.flatMap(() => Queue.offer(buffer, scheduleStep)),
13644
- Effect.flatMap(() => Effect.never),
13645
- Pull.catchDone(() => Cause.done())
13646
- )
13665
+ const stepToBuffer = Effect.suspend(function loop(): Pull.Pull<never, E3, void, R3> {
13666
+ return step(lastOutput).pipe(
13667
+ Effect.flatMap(() => !hadChunk && leftover === undefined ? loop() : Queue.offer(buffer, scheduleStep)),
13668
+ Effect.flatMap(() => Effect.never),
13669
+ Pull.catchDone(() => Cause.done())
13670
+ )
13671
+ })
13647
13672
 
13648
13673
  // buffer -> sink
13649
13674
  const pullFromBuffer: Pull.Pull<
@@ -13653,7 +13678,6 @@ export const aggregateWithin: {
13653
13678
  Effect.flatMap((arr) => arr === scheduleStep ? Cause.done() : Effect.succeed(arr))
13654
13679
  )
13655
13680
 
13656
- let leftover: Arr.NonEmptyReadonlyArray<A2> | undefined
13657
13681
  const sinkUpstream = Effect.suspend((): Pull.Pull<Arr.NonEmptyReadonlyArray<A | A2>, E> => {
13658
13682
  if (leftover !== undefined) {
13659
13683
  const chunk = leftover
@@ -13665,7 +13689,7 @@ export const aggregateWithin: {
13665
13689
  return pullFromBuffer
13666
13690
  })
13667
13691
  const catchSinkHalt = Effect.flatMap(([value, leftover_]: Sink.End<B, A2>) => {
13668
- // ignore the last output if the upsteam only pulled a halt
13692
+ // ignore the last output if the upstream only pulled a halt
13669
13693
  if (!hadChunk && buffer.state._tag === "Done") return Cause.done()
13670
13694
  lastOutput = Option.some(value)
13671
13695
  leftover = leftover_
package/src/Types.ts CHANGED
@@ -927,6 +927,72 @@ export type ExtractReason<E, K extends string> = E extends { readonly reason: in
927
927
  : never
928
928
  : never
929
929
 
930
+ /**
931
+ * Narrows a specific reason variant by its `_tag` from an error's `reason`
932
+ * field.
933
+ *
934
+ * - Use to narrow down to a single reason variant from a nested error type.
935
+ * - Returns `never` if `E` has no matching reason variant.
936
+ *
937
+ * **Example** (Narrowing a reason variant)
938
+ *
939
+ * ```ts
940
+ * import type { Types } from "effect"
941
+ *
942
+ * type RateLimitError = { readonly _tag: "RateLimitError"; readonly retryAfter: number }
943
+ * type QuotaError = { readonly _tag: "QuotaError"; readonly limit: number }
944
+ * type ApiError = { readonly _tag: "ApiError"; readonly reason: RateLimitError | QuotaError }
945
+ *
946
+ * type Result = Types.NarrowReason<ApiError, "RateLimitError">
947
+ * // ApiError & { readonly reason: { readonly _tag: "RateLimitError"; readonly retryAfter: number } }
948
+ * ```
949
+ *
950
+ * @see {@link ExcludeReason}
951
+ * @see {@link ReasonOf}
952
+ * @see {@link ReasonTags}
953
+ *
954
+ * @since 4.0.0
955
+ * @category types
956
+ */
957
+ export type NarrowReason<E, K extends string> = E extends { readonly reason: infer R }
958
+ ? R extends { readonly _tag: infer T } ? K extends T ? E & { readonly reason: R } : never
959
+ : never
960
+ : never
961
+
962
+ /**
963
+ * Narrows an error's `reason` field to exclude a specific reason variant by
964
+ * its `_tag`.
965
+ *
966
+ * - Use to narrow the error to only the remaining reason variants after
967
+ * excluding the matched one.
968
+ * - Returns `never` if `E` has no `reason` field or no remaining variants.
969
+ *
970
+ * **Example** (Omitting a reason variant)
971
+ *
972
+ * ```ts
973
+ * import type { Types } from "effect"
974
+ *
975
+ * type RateLimitError = { readonly _tag: "RateLimitError"; readonly retryAfter: number }
976
+ * type QuotaError = { readonly _tag: "QuotaError"; readonly limit: number }
977
+ * type ApiError = { readonly _tag: "ApiError"; readonly reason: RateLimitError | QuotaError }
978
+ *
979
+ * type Result = Types.OmitReason<ApiError, "RateLimitError">
980
+ * // ApiError & { readonly reason: { readonly _tag: "QuotaError"; readonly limit: number } }
981
+ * ```
982
+ *
983
+ * @see {@link NarrowReason}
984
+ * @see {@link ExcludeReason}
985
+ * @see {@link ReasonOf}
986
+ * @see {@link ReasonTags}
987
+ *
988
+ * @since 4.0.0
989
+ * @category types
990
+ */
991
+ export type OmitReason<E, K extends string> = E extends { readonly reason: infer R }
992
+ ? R extends { readonly _tag: infer T } ? K extends T ? never : E & { readonly reason: R }
993
+ : never
994
+ : never
995
+
930
996
  /**
931
997
  * Excludes a specific reason variant by its `_tag` from an error's `reason`
932
998
  * field.
@@ -50,7 +50,9 @@ import type {
50
50
  ExcludeTag,
51
51
  ExtractReason,
52
52
  ExtractTag,
53
+ NarrowReason,
53
54
  NoInfer,
55
+ OmitReason,
54
56
  ReasonOf,
55
57
  ReasonTags,
56
58
  Simplify,
@@ -2824,8 +2826,16 @@ export const catchReason: {
2824
2826
  >(
2825
2827
  errorTag: K,
2826
2828
  reasonTag: RK,
2827
- f: (reason: ExtractReason<ExtractTag<NoInfer<E>, K>, RK>) => Effect.Effect<A2, E2, R2>,
2828
- orElse?: ((reasons: ExcludeReason<ExtractTag<NoInfer<E>, K>, RK>) => Effect.Effect<A3, E3, R3>) | undefined
2829
+ f: (
2830
+ reason: ExtractReason<ExtractTag<NoInfer<E>, K>, RK>,
2831
+ error: NarrowReason<ExtractTag<NoInfer<E>, K>, RK>
2832
+ ) => Effect.Effect<A2, E2, R2>,
2833
+ orElse?:
2834
+ | ((
2835
+ reasons: ExcludeReason<ExtractTag<NoInfer<E>, K>, RK>,
2836
+ error: OmitReason<ExtractTag<NoInfer<E>, K>, RK>
2837
+ ) => Effect.Effect<A3, E3, R3>)
2838
+ | undefined
2829
2839
  ): <A, R>(
2830
2840
  self: Effect.Effect<A, E, R>
2831
2841
  ) => Effect.Effect<
@@ -2849,8 +2859,16 @@ export const catchReason: {
2849
2859
  self: Effect.Effect<A, E, R>,
2850
2860
  errorTag: K,
2851
2861
  reasonTag: RK,
2852
- f: (reason: ExtractReason<ExtractTag<E, K>, RK>) => Effect.Effect<A2, E2, R2>,
2853
- orElse?: ((reasons: ExcludeReason<ExtractTag<E, K>, RK>) => Effect.Effect<A3, E3, R3>) | undefined
2862
+ f: (
2863
+ reason: ExtractReason<ExtractTag<E, K>, RK>,
2864
+ error: NarrowReason<ExtractTag<E, K>, RK>
2865
+ ) => Effect.Effect<A2, E2, R2>,
2866
+ orElse?:
2867
+ | ((
2868
+ reasons: ExcludeReason<ExtractTag<E, K>, RK>,
2869
+ error: OmitReason<ExtractTag<E, K>, RK>
2870
+ ) => Effect.Effect<A3, E3, R3>)
2871
+ | undefined
2854
2872
  ): Effect.Effect<
2855
2873
  A | A2 | Exclude<A3, unassigned>,
2856
2874
  (A3 extends unassigned ? E : ExcludeTag<E, K>) | E2 | E3,
@@ -2874,8 +2892,13 @@ export const catchReason: {
2874
2892
  self: Effect.Effect<A, E, R>,
2875
2893
  errorTag: K,
2876
2894
  reasonTag: RK,
2877
- f: (reason: ExtractReason<ExtractTag<E, K>, RK>) => Effect.Effect<A2, E2, R2>,
2878
- orElse?: ((reasons: ExcludeReason<ExtractTag<E, K>, RK>) => Effect.Effect<A3, E3, R3>) | undefined
2895
+ f: (reason: ExtractReason<ExtractTag<E, K>, RK>, error: ExtractTag<E, K>) => Effect.Effect<A2, E2, R2>,
2896
+ orElse?:
2897
+ | ((
2898
+ reasons: ExcludeReason<ExtractTag<E, K>, RK>,
2899
+ error: OmitReason<ExtractTag<E, K>, RK>
2900
+ ) => Effect.Effect<A3, E3, R3>)
2901
+ | undefined
2879
2902
  ): Effect.Effect<
2880
2903
  A | A2 | Exclude<A3, unassigned>,
2881
2904
  (A3 extends unassigned ? E : ExcludeTag<E, K>) | E2 | E3,
@@ -2886,8 +2909,8 @@ export const catchReason: {
2886
2909
  ((e: any) => isTagged(e, errorTag) && hasProperty(e, "reason")) as any,
2887
2910
  (e: any): Effect.Effect<A2 | A3, E | E2 | E3, R2 | R3> => {
2888
2911
  const reason = e.reason as any
2889
- if (isTagged(reason, reasonTag)) return f(reason as any)
2890
- return orElse ? internalCall(() => orElse(reason)) : fail(e)
2912
+ if (isTagged(reason, reasonTag)) return f(reason as any, e)
2913
+ return orElse ? internalCall(() => orElse(reason, e)) : fail(e)
2891
2914
  }
2892
2915
  ) as any
2893
2916
  )
@@ -2899,7 +2922,8 @@ export const catchReasons: {
2899
2922
  E,
2900
2923
  Cases extends {
2901
2924
  [RK in ReasonTags<ExtractTag<NoInfer<E>, K>>]+?: (
2902
- reason: ExtractReason<ExtractTag<NoInfer<E>, K>, RK>
2925
+ reason: ExtractReason<ExtractTag<NoInfer<E>, K>, RK>,
2926
+ error: NarrowReason<ExtractTag<NoInfer<E>, K>, RK>
2903
2927
  ) => Effect.Effect<any, any, any>
2904
2928
  },
2905
2929
  A2 = unassigned,
@@ -2910,7 +2934,8 @@ export const catchReasons: {
2910
2934
  cases: Cases,
2911
2935
  orElse?:
2912
2936
  | ((
2913
- reason: ExcludeReason<ExtractTag<NoInfer<E>, K>, Extract<keyof Cases, string>>
2937
+ reason: ExcludeReason<ExtractTag<NoInfer<E>, K>, Extract<keyof Cases, string>>,
2938
+ error: OmitReason<ExtractTag<NoInfer<E>, K>, Extract<keyof Cases, string>>
2914
2939
  ) => Effect.Effect<A2, E2, R2>)
2915
2940
  | undefined
2916
2941
  ): <A, R>(self: Effect.Effect<A, E, R>) => Effect.Effect<
@@ -2937,7 +2962,8 @@ export const catchReasons: {
2937
2962
  K extends Tags<E>,
2938
2963
  Cases extends {
2939
2964
  [RK in ReasonTags<ExtractTag<E, K>>]+?: (
2940
- reason: ExtractReason<ExtractTag<E, K>, RK>
2965
+ reason: ExtractReason<ExtractTag<E, K>, RK>,
2966
+ error: NarrowReason<ExtractTag<E, K>, RK>
2941
2967
  ) => Effect.Effect<any, any, any>
2942
2968
  },
2943
2969
  A2 = unassigned,
@@ -2949,7 +2975,8 @@ export const catchReasons: {
2949
2975
  cases: Cases,
2950
2976
  orElse?:
2951
2977
  | ((
2952
- reason: ExcludeReason<ExtractTag<NoInfer<E>, K>, Extract<keyof Cases, string>>
2978
+ reason: ExcludeReason<ExtractTag<NoInfer<E>, K>, Extract<keyof Cases, string>>,
2979
+ error: OmitReason<ExtractTag<NoInfer<E>, K>, Extract<keyof Cases, string>>
2953
2980
  ) => Effect.Effect<A2, E2, R2>)
2954
2981
  | undefined
2955
2982
  ): Effect.Effect<
@@ -2982,9 +3009,9 @@ export const catchReasons: {
2982
3009
  const reason = e.reason
2983
3010
  keys ??= Object.keys(cases)
2984
3011
  if (keys.includes(reason._tag)) {
2985
- return internalCall(() => (cases as any)[reason._tag](reason))
3012
+ return internalCall(() => (cases as any)[reason._tag](reason, e))
2986
3013
  }
2987
- return orElse ? internalCall(() => orElse(reason)) : fail(e)
3014
+ return orElse ? internalCall(() => orElse(reason, e)) : fail(e)
2988
3015
  }
2989
3016
  )
2990
3017
  })
@@ -527,13 +527,16 @@ export type ExtractError<Options> = Options extends {
527
527
  * @category utility types
528
528
  */
529
529
  export type ExtractServices<Options> = Options extends {
530
- readonly toolkit: Toolkit.WithHandler<infer _Tools>
531
- }
530
+ readonly disableToolCallResolution: true
531
+ } ? never
532
+ : Options extends {
533
+ readonly toolkit: Toolkit.WithHandler<infer _Tools>
534
+ }
532
535
  // Required for tool call execution
533
- ?
534
- | Tool.ResultEncodingServices<_Tools[keyof _Tools]>
535
- // Required for decoding large language model responses
536
- | Tool.ResultDecodingServices<_Tools[keyof _Tools]>
536
+ ?
537
+ | Tool.ResultEncodingServices<_Tools[keyof _Tools]>
538
+ // Required for decoding large language model responses
539
+ | Tool.ResultDecodingServices<_Tools[keyof _Tools]>
537
540
  : Options extends {
538
541
  readonly toolkit: Effect.Yieldable<
539
542
  Toolkit.Toolkit<infer _Tools>,