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
}
}
}