import type { Args, Call1W, Fn1, GenericFn, GenericResolver, Param0, Return } from "../HKT"; type GetReturnFnParamType = Branches extends readonly [infer Head extends Fn1, ...infer Tail extends Fn1[]] ? readonly [Param0, ...GetReturnFnParamType] : readonly []; type GetReturnFnReturnTypeReadonly = Branches extends readonly [infer Head extends Fn1, ...infer Tail extends Fn1[]] ? readonly [Return, ...GetReturnFnReturnTypeReadonly] : readonly []; type GetReturnFnReturnTypeWritable = Branches extends readonly [infer Head extends Fn1, ...infer Tail extends Fn1[]] ? [Return, ...GetReturnFnReturnTypeWritable] : []; type CallBranchesReadonly = Branches extends readonly [infer HeadBranch extends Fn1, ...infer TailBranch extends Fn1[]] ? TS extends readonly [infer Head, ...infer Tail] ? readonly [Call1W, ...CallBranchesReadonly] : never : readonly []; type CallBranchesWritable = Branches extends readonly [infer HeadBranch extends Fn1, ...infer TailBranch extends Fn1[]] ? TS extends readonly [infer Head, ...infer Tail] ? [Call1W, ...CallBranchesWritable] : never : []; type FilterOutNevers = TS extends readonly [infer Head, ...infer Tail] ? [Head] extends [never] ? FilterOutNevers : readonly [Head, ...FilterOutNevers] : TS; interface Resolver< InputType extends readonly unknown[], ReturnTypeReadonly extends readonly unknown[], ReturnTypeWritable extends unknown[], > extends GenericResolver<1> { on_: () => [[InputType], ReturnTypeReadonly]; on1: ([xs]: Args) => [ [], typeof xs extends unknown[] ? ReturnTypeWritable : ReturnTypeReadonly, ]; } /** * [Fn] Map each element of a tuple by a list of branching functions and returns a new tuple. * * Sig: `(...branches: [(a: A) => X1, (b: B) => X2, ...]) => (xs: [A, B, ...]) => [X1, X2, ...]` */ export interface MapEachFn< Branch1 extends Fn1, Branch2 extends Fn1, Branch3 extends Fn1 = never, Branch4 extends Fn1 = never, Branch5 extends Fn1 = never, Branch6 extends Fn1 = never, Branch7 extends Fn1 = never, Branch8 extends Fn1 = never, Branch9 extends Fn1 = never, Branch10 extends Fn1 = never, Branch11 extends Fn1 = never, Branch12 extends Fn1 = never, Branch13 extends Fn1 = never, Branch14 extends Fn1 = never, Branch15 extends Fn1 = never, Branch16 extends Fn1 = never, > extends GenericFn< [ Branch1, Branch2, Branch3, Branch4, Branch5, Branch6, Branch7, Branch8, Branch9, Branch10, Branch11, Branch12, Branch13, Branch14, Branch15, Branch16, ] extends infer Branches extends readonly Fn1[] ? Resolver< GetReturnFnParamType>, GetReturnFnReturnTypeReadonly>, GetReturnFnReturnTypeWritable> > : never > { def: ([xs]: Args) => [ Branch1, Branch2, Branch3, Branch4, Branch5, Branch6, Branch7, Branch8, Branch9, Branch10, Branch11, Branch12, Branch13, Branch14, Branch15, Branch16, ] extends infer Branches extends readonly Fn1[] ? typeof xs extends unknown[] ? CallBranchesWritable, typeof xs> : CallBranchesReadonly, typeof xs> : never; }