import { ArityN } from '../types' import { CurryNFn } from './types' /** * Curries a function to `n` arity. * @name curryN(arity: number, f: Function): CurriedFunction */ export const curryN: CurryNFn = curriedN( 2, (arity: number, f: ArityN) => curriedN(arity, f, []), [] ) function curriedN(arity: number, f: ArityN, previousArgs: Array): ArityN { if (arity <= 1) return f return function(...args: Array) { const concatArgs = previousArgs.concat(args) if (concatArgs.length >= arity) return f.apply(this, concatArgs) return curriedN(arity, f, concatArgs) } }