brn
Version:
simple functional branching logic
17 lines (16 loc) • 1.76 kB
TypeScript
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;