import { Optional } from "./common"; import { head, tail } from "./array"; import { curry } from "./curry"; type Arg = [condFn: (value: T) => boolean, resolve: (value: T) => V]; type CondPartial = { (args: [Arg]): (value: T) => Optional; (args: [Arg, Arg]): (value: T) => Optional; (args: [Arg, Arg, Arg]): (value: T) => Optional; (args: [Arg, Arg, Arg, Arg]): (value: T) => Optional; (args: [Arg, Arg, Arg, Arg, Arg]): (value: T) => Optional; (args: [Arg, Arg, Arg, Arg, Arg, Arg]): (value: T) => Optional; (args: [Arg, Arg, Arg, Arg, Arg, Arg, Arg]): (value: T) => Optional; (args: [Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg]): (value: T) => Optional; (args: [Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg]): (value: T) => Optional; (args: [Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg]): (value: T) => Optional; } type CondNormal = { (args: [Arg], value: T): Optional; (args: [Arg, Arg], value: T): Optional; (args: [Arg, Arg, Arg], value: T): Optional; (args: [Arg, Arg, Arg, Arg], value: T): Optional; (args: [Arg, Arg, Arg, Arg, Arg], value: T): Optional; (args: [Arg, Arg, Arg, Arg, Arg, Arg], value: T): Optional; (args: [Arg, Arg, Arg, Arg, Arg, Arg, Arg], value: T): Optional; (args: [Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg], value: T): Optional; (args: [Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg], value: T): Optional; (args: [Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg, Arg], value: T): Optional; } type Cond = CondNormal & CondPartial; const condNormal = (args: Arg[], value: T): Optional => { const first = head(args); if (!first) { return undefined; } const [condFn, resolve] = first; if (condFn(value)) { return resolve(value); } return condNormal(tail(args), value); } export const cond: Cond = curry(condNormal);