export type SuccessResult = { readonly tag: 'success' readonly success: Success } export type FailureResult = { readonly tag: 'failure' readonly failure: Failure } /** A value that represents either a success or a failure, including an associated value in each case. */ export type Result = | SuccessResult | FailureResult /** * An async value that represents either a success or a failure, * including an associated value in each case. * */ export type AsyncResult = Promise> export type SomeResult = | Result | AsyncResult /** Infers type of 'failure' value */ export type FailureOf = R extends Promise ? AR extends FailureResult ? Failure : never : R extends FailureResult ? Failure : never /** Infers type of 'success' value */ export type SuccessOf = R extends Promise ? AR extends SuccessResult ? Success : never : R extends SuccessResult ? Success : never type SuccessResultMatcher = { readonly success: (success: Success) => Match readonly failure?: never readonly default?: never } type FailureResultMatcher = { readonly failure: (failure: Failure) => Match readonly success?: never readonly default?: never } export type ResultMatcher = | { readonly success: (success: Success) => Match readonly failure: (failure: Failure) => Match readonly default?: never } | { readonly success?: (success: Success) => NonNullable readonly failure?: (failure: Failure) => NonNullable readonly default: Match } export type Matcher = FailureOf extends never ? SuccessResultMatcher, Match> : SuccessOf extends never ? FailureResultMatcher, Match> : ResultMatcher, FailureOf, Match> export type CombineArray = readonly T[] export type CombineFunArray = CombineArray<(arg: Arg) => Return>