/** @module function/curry.ts */ import { Curried1, Curried2, Curried3, Curried4, Curried5, Curried6, Curried7, Curried8, Curried9, Function1, Function2, Function3, Function4, Function5, Function6, Function7, Function8, Function9, Function_21, Function_211, Function_2111, Function_31, Function_311, Function_41, Function_51, Function_61, Predicate } from '../helper-types' import { defineFunctionProperties } from './defineFunctionProperties' export function curry( f: Function1 ): ( Curried1 & Function1 ) export function curry( f: Function2 ): ( Curried2 & Function2 ) // tslint:disable-next-line:unified-signatures export function curry( f: Function2 ): ( Curried2 & Function2 ) // tslint:disable-next-line:unified-signatures export function curry( f: Function2 ): ( Curried2 & Function2 ) // tslint:disable-next-line:unified-signatures export function curry( f: Function2 ): ( Curried2 & Function2 ) export function curry( f: Function3 ): ( Curried3 & Function3 & Function_21 ) export function curry( f: Function4 ): ( Curried4 & Function4 & Function_211 & Function_31 ) export function curry( f: Function5 ): ( Curried5 & Function5 & Function_2111 & Function_311 & Function_41 ) export function curry( f: Function6 ): ( Curried6 & Function6 & Function_51 ) export function curry( f: Function7 ): ( Curried7 & Function7 & Function_61 ) export function curry( f: Function8 ): Curried8 export function curry( f: Function9 ): Curried9 /** * Curries a function. * * @example * add = curry( (a: number, b: number): number => a + b ) * const increment = add(1) * increment( 10 ) // 11 * * :: ( fn( a, b, ... c) -> x ) -> fn -> a -> b -> c -> x */ export function curry( fn, ...args: any[] ) { return args.length >= fn.length ? fn( ...args ) : defineFunctionProperties( curry.bind( null, fn, ...args ), { length: fn.length - args.length, name: fn.name, } ) } export default curry