import { Arity1, Arity10, Arity2, Arity3, Arity4, Arity5, Arity6, Arity7, Arity8, Arity9, Curry10, Curry2, Curry3, Curry4, Curry5, Curry6, Curry7, Curry8, Curry9, } from '../types' import { curry2 } from './curry2' import { curry3 } from './curry3' import { curry4 } from './curry4' import { curry5 } from './curry5' import { curryN } from '../curryN' /** * Given a function it returns a curried version of that function. * @name curry(fn: Fuction): CurriedFunction */ export const curry: CurryFn = function curry(fn: any) { switch (fn.length) { case 0: return fn case 1: return fn case 2: return curry2(fn as Curry2) case 3: return curry3(fn as Curry3) case 4: return curry4(fn as Curry4) case 5: return curry5(fn as Curry5) default: return curryN(fn.length, fn) } } export type CurryFn = { (f: () => A): () => A (f: Arity1): Arity1 (f: Arity2): Curry2 (f: Arity3): Curry3 (f: Arity4): Curry4 (f: Arity5): Curry5 (f: Arity6): Curry6 (f: Arity7): Curry7 (f: Arity8): Curry8< A, B, C, D, E, F, G, H, I > (f: Arity9): Curry9< A, B, C, D, E, F, G, H, I, J > (f: Arity10): Curry10< A, B, C, D, E, F, G, H, I, J, K > }