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;
