import { Arity1, curry, Is, Predicate } from '@typed/lambda' /** * If-else statement for functions. * @param predicate :: (a -> boolean) * @param thenFn :: (a -> b) * @param elseFn :: (a -> b) * @param value :: a * @returns :: b */ export const ifElse: IfElseFn = curry(__ifElse) as IfElseFn function __ifElse( predicate: Predicate, thenFn: Arity1, elseFn: Arity1, value: A, ): B { if (predicate(value)) { return thenFn(value) } return elseFn(value) } export interface IfElseFn { (predicate: Is, thenFn: Arity1, elseFn: Arity1, value: A): C (predicate: Predicate, thenFn: Arity1, elseFn: Arity1, value: A): B (predicate: Is, thenFn: Arity1, elseFn: Arity1): (value: A) => C (predicate: Predicate, thenFn: Arity1, elseFn: Arity1): (value: A) => B (predicate: Is, thenFn: Arity1): { (elseFn: Arity1, value: A): C (elseFn: Arity1): (value: A) => C } (predicate: Predicate, thenFn: Arity1): { (elseFn: Arity1, value: A): B (elseFn: Arity1): (value: A) => B } (predicate: Is): { (thenFn: Arity1, elseFn: Arity1, value: A): C (thenFn: Arity1, elseFn: Arity1): (value: A) => C (thenFn: Arity1): { (elseFn: Arity1, value: A): C (elseFn: Arity1): (value: A) => C } } (predicate: Predicate): { (thenFn: Arity1, elseFn: Arity1, value: A): B (thenFn: Arity1, elseFn: Arity1): (value: A) => B (thenFn: Arity1): { (elseFn: Arity1, value: A): B (elseFn: Arity1): (value: A) => B } } }