UNPKG

brn

Version:

simple functional branching logic

17 lines (16 loc) 1.76 kB
declare type Tuple = any[]; declare type Falsy = 0 | 0n | null | false | "" | undefined | void; declare type Truthy = true | object | Function; declare type TestFn<InputArgs extends Tuple, Outcome extends Falsy | Truthy> = (...args: InputArgs) => Outcome; declare type BranchFn<InputArgs extends Tuple, Output> = (...args: InputArgs) => Output; interface BranchModule { <InputArgs extends Tuple, LeftOutput = InputArgs[0], RightOutput = InputArgs[0]>(test: TestFn<InputArgs, Falsy>, left: BranchFn<InputArgs, LeftOutput>, right: BranchFn<InputArgs, RightOutput>): (...args: InputArgs) => RightOutput; <InputArgs extends Tuple, LeftOutput = InputArgs[0], RightOutput = InputArgs[0]>(test: TestFn<InputArgs, Truthy>, left: BranchFn<InputArgs, LeftOutput>, right: BranchFn<InputArgs, RightOutput>): (...args: InputArgs) => LeftOutput; <InputArgs extends Tuple, LeftOutput = InputArgs[0], RightOutput = InputArgs[0]>(test: TestFn<InputArgs, any>, left: BranchFn<InputArgs, LeftOutput>, right: BranchFn<InputArgs, RightOutput>): (...args: InputArgs) => LeftOutput | RightOutput; <InputArgs extends Tuple, LeftOutput = InputArgs[0]>(test: TestFn<InputArgs, Falsy>, left: BranchFn<InputArgs, LeftOutput>): (...args: InputArgs) => InputArgs[0]; <InputArgs extends Tuple, LeftOutput = InputArgs[0]>(test: TestFn<InputArgs, Truthy>, left: BranchFn<InputArgs, LeftOutput>): (...args: InputArgs) => LeftOutput; <InputArgs extends Tuple, LeftOutput = InputArgs[0]>(test: TestFn<InputArgs, any>, left: BranchFn<InputArgs, LeftOutput>): (...args: InputArgs) => LeftOutput | InputArgs[0]; <InputArgs extends Tuple>(test: TestFn<InputArgs, any>): (...args: InputArgs) => InputArgs[0]; } declare const branch: BranchModule; export default branch;