effect 4.0.0-beta.57 → 4.0.0-beta.59

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.
@@ -684,54 +684,85 @@ export const builder = <A extends AsyncResult<any, any>>(self: A): Builder<
684
684
  never,
685
685
  A extends Success<infer _A, infer _E> ? _A : never,
686
686
  A extends Failure<infer _A, infer _E> ? _E : never,
687
- A extends Initial<infer _A, infer _E> ? true : never
687
+ A extends Initial<infer _A, infer _E> ? true : never,
688
+ A extends Failure<infer _A, infer _E> ? Defect | Interrupt : never
688
689
  > => new BuilderImpl(self) as any
689
690
 
690
691
  /**
691
692
  * @since 4.0.0
692
693
  * @category Builder
693
694
  */
694
- export type Builder<Out, A, E, I> =
695
+ export interface Defect {
696
+ readonly _: unique symbol
697
+ }
698
+
699
+ /**
700
+ * @since 4.0.0
701
+ * @category Builder
702
+ */
703
+ export interface Interrupt {
704
+ readonly _: unique symbol
705
+ }
706
+
707
+ /**
708
+ * @since 4.0.0
709
+ * @category Builder
710
+ */
711
+ export type Builder<Out, A, E, I, F> =
695
712
  & Pipeable
696
713
  & {
697
- onWaiting<B>(f: (result: AsyncResult<A, E>) => B): Builder<Out | B, A, E, I>
698
- onDefect<B>(f: (defect: unknown, result: Failure<A, E>) => B): Builder<Out | B, A, E, I>
714
+ onWaiting<B>(f: (result: AsyncResult<A, E>) => B): Builder<Out | B, A, E, I, F>
699
715
  orElse<B>(orElse: LazyArg<B>): Out | B
700
716
  orNull(): Out | null
701
717
  render(): [A | I] extends [never] ? Out : Out | null
702
718
  }
703
- & ([I] extends [never] ? {} :
719
+ & ([A | E | I | F] extends [never] ? {
720
+ exhaustive(): Out
721
+ } :
722
+ unknown)
723
+ & ([I] extends [never] ? unknown :
704
724
  {
705
- onInitial<B>(f: (result: Initial<A, E>) => B): Builder<Out | B, A, E, never>
706
- onInitialOrWaiting<B>(f: (result: AsyncResult<A, E>) => B): Builder<Out | B, A, E, never>
725
+ onInitial<B>(f: (result: Initial<A, E>) => B): Builder<Out | B, A, E, never, F>
726
+ onInitialOrWaiting<B>(f: (result: AsyncResult<A, E>) => B): Builder<Out | B, A, E, never, F>
707
727
  })
708
- & ([A] extends [never] ? {} :
728
+ & ([A] extends [never] ? unknown :
709
729
  {
710
- onSuccess<B>(f: (value: A, result: Success<A, E>) => B): Builder<Out | B, never, E, I>
730
+ onSuccess<B>(f: (value: A, result: Success<A, E>) => B): Builder<Out | B, never, E, I, F>
711
731
  })
712
- & ([E] extends [never] ? {} : {
713
- onFailure<B>(f: (cause: Cause.Cause<E>, result: Failure<A, E>) => B): Builder<Out | B, A, never, I>
714
-
715
- onError<B>(f: (error: E, result: Failure<A, E>) => B): Builder<Out | B, A, never, I>
732
+ & ([E] extends [never] ? unknown : {
733
+ onError<B>(f: (error: E, result: Failure<A, E>) => B): Builder<Out | B, A, never, I, F>
716
734
 
717
735
  onErrorIf<B extends E, C>(
718
736
  refinement: Refinement<E, B>,
719
737
  f: (error: B, result: Failure<A, E>) => C
720
- ): Builder<Out | C, A, Types.EqualsWith<E, B, E, Exclude<E, B>>, I>
738
+ ): Builder<Out | C, A, Types.EqualsWith<E, B, E, Exclude<E, B>>, I, F>
721
739
  onErrorIf<C>(
722
740
  predicate: Predicate<E>,
723
741
  f: (error: E, result: Failure<A, E>) => C
724
- ): Builder<Out | C, A, E, I>
742
+ ): Builder<Out | C, A, E, I, F>
725
743
 
726
744
  onErrorTag<const Tags extends ReadonlyArray<Types.Tags<E>>, B>(
727
745
  tags: Tags,
728
746
  f: (error: Types.ExtractTag<E, Tags[number]>, result: Failure<A, E>) => B
729
- ): Builder<Out | B, A, Types.ExcludeTag<E, Tags[number]>, I>
747
+ ): Builder<Out | B, A, Types.ExcludeTag<E, Tags[number]>, I, F>
730
748
  onErrorTag<const Tag extends Types.Tags<E>, B>(
731
749
  tag: Tag,
732
750
  f: (error: Types.ExtractTag<E, Tag>, result: Failure<A, E>) => B
733
- ): Builder<Out | B, A, Types.ExcludeTag<E, Tag>, I>
751
+ ): Builder<Out | B, A, Types.ExcludeTag<E, Tag>, I, F>
734
752
  })
753
+ & ([E | F] extends [never] ? unknown : {
754
+ onFailure<B>(f: (cause: Cause.Cause<E>, result: Failure<A, E>) => B): Builder<Out | B, A, never, I, never>
755
+ })
756
+ & (Interrupt extends F ? {
757
+ onInterrupt<B>(
758
+ f: (interruptors: ReadonlySet<number>, result: Failure<A, E>) => B
759
+ ): Builder<Out | B, A, E, I, Exclude<F, Interrupt>>
760
+ } :
761
+ unknown)
762
+ & (Defect extends F ? {
763
+ onDefect<B>(f: (defect: unknown, result: Failure<A, E>) => B): Builder<Out | B, A, E, I, Exclude<F, Defect>>
764
+ } :
765
+ unknown)
735
766
 
736
767
  class BuilderImpl<Out, A, E> {
737
768
  constructor(result: AsyncResult<A, E>) {
@@ -817,6 +848,13 @@ class BuilderImpl<Out, A, E> {
817
848
  })
818
849
  }
819
850
 
851
+ onInterrupt<B>(f: (interruptors: ReadonlySet<number>, result: Failure<A, E>) => B): BuilderImpl<Out | B, A, E> {
852
+ return this.when(isFailure, (result) => {
853
+ const interruptors = Cause.filterInterruptors(result.cause)
854
+ return Result.isFailure(interruptors) ? Option.none() : Option.some(f(interruptors.success, result))
855
+ })
856
+ }
857
+
820
858
  orElse<B>(orElse: LazyArg<B>): Out | B {
821
859
  return Option.getOrElse(this.output, orElse)
822
860
  }
@@ -833,6 +871,10 @@ class BuilderImpl<Out, A, E> {
833
871
  }
834
872
  return null
835
873
  }
874
+
875
+ exhaustive(): Out {
876
+ return this.render() as Out
877
+ }
836
878
  }
837
879
 
838
880
  /**