import { curry, Predicate } from '@typed/lambda' import { Maybe, Nothing } from '@typed/maybe' /** * Basic pattern matching * @param conditionals :: [((a -> boolean), (a -> b))] * @param value :: a * @returns :: Maybe b */ export const cond: { (conditions: ReadonlyArray>, value: A): Maybe (conditions: ReadonlyArray>): (value: A) => Maybe } = curry(__cond) as { (conditions: ReadonlyArray>, value: A): Maybe (conditions: ReadonlyArray>): (value: A) => Maybe } function __cond(conditionals: ReadonlyArray>, value: A): Maybe { const itemCount = conditionals.length for (let i = 0; i < itemCount; ++i) { const [predicate, f] = conditionals[i] if (predicate(value)) { return Maybe.of(f(value)) } } return Nothing } /** * @name Conditional * @type */ export type Conditional = [Predicate, (value: A) => B]