switch-functional
Version:
Functional switch statement
23 lines (22 loc) • 2.15 kB
TypeScript
import type { AnyConditions, AnyReturnValues, FinalReturnValue, Input, Options, Resolved, ReturnValue, Switch } from './types.js';
/**
* Return value of `switchFunctional()` and `switchFunctional.case()`
*/
export declare const chain: <FinalReturnValues extends FinalReturnValue = never>(resolved: Resolved, finalValue?: FinalReturnValues) => <OriginalInput extends Input, CustomCondition = never, CustomReturnValues extends readonly unknown[] = never, StrictReturnValue extends ReturnValue<OriginalInput> = never>(input: OriginalInput, options?: Options<CustomCondition, CustomReturnValues, OriginalInput, StrictReturnValue>) => {
/**
* If the `input` matches the `conditions`, the final return value will be
* `caseReturnValue`.
*
* `caseReturnValue` can optionally be a function taking the `input` as
* argument.
*/
case: <NewReturnValue extends ReturnValue<OriginalInput> = never>(conditions: AnyConditions<CustomCondition, OriginalInput>, ...caseReturnValues: AnyReturnValues<CustomReturnValues, OriginalInput, NewReturnValue>) => Switch<FinalReturnValues | ((NewReturnValue[] extends never[] ? StrictReturnValue : NewReturnValue) extends infer T ? T extends (NewReturnValue[] extends never[] ? StrictReturnValue : NewReturnValue) ? T extends (...args: readonly never[]) => unknown ? ReturnType<T> : T : never : never), CustomCondition, CustomReturnValues, OriginalInput, StrictReturnValue>;
/**
* If one of the `.case()` statements matched, returns its
* `caseReturnValue`. Else, returns `defaultReturnValue`.
*
* `defaultReturnValue` can optionally be a function taking the `input` as
* argument.
*/
default: <NewReturnValue extends ReturnValue<OriginalInput> = never>(...defaultReturnValues: AnyReturnValues<CustomReturnValues, OriginalInput, NewReturnValue>) => NonNullable<FinalReturnValues> | ((NewReturnValue[] extends never[] ? StrictReturnValue : NewReturnValue) extends infer T ? T extends (NewReturnValue[] extends never[] ? StrictReturnValue : NewReturnValue) ? T extends (...args: readonly never[]) => unknown ? ReturnType<T> : T : never : never);
};