All files / curry curry.ts

100% Statements 6/6
100% Branches 2/2
100% Functions 3/3
100% Lines 6/6

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35                                                1x 1x 8x 4x   4x 4x        
/**
 * @description 函数柯里化。
 * 1. 定义。柯里化(Currying)是一种处理函数中含有多个参数的方法,并在只允许单一参数的框架中使用这些函数。这种转变被称为 “柯里化” 的过程。数学和理论计算机科学中的柯里化函数一次只可传入一个参数,但js中可连续传入多个参数,所以可转变为以下实现步骤
 *
 * 2. 实现步骤。<br/>
 * a. func参数已收集完成,执行func执行结果。<br/>
 * b. func参数未收集完成,继续收集
 * @function curry
 * @param {Function} func - 处理函数
 * @param {number} [arity=func.length] - 处理函数需要收集的参数个数,默认处理函数的参数个数
 * @returns {Function} 返回新的柯里化(curry)函数。
 * @author liukun <919590347@qq.com>
 * @example
 * import { curry } from '@wont/utils'
 * const fn = (a, b, c) => [a, b, c]
 * const curried = curry(fn)
 * const expected = [1, 2, 3]
 * curried(1, 2, 3)  // returns expected
 * curried(1, 2)(3)  // returns expected
 * curried(1)(2)(3)  // returns expected
 * curried(1)(2, 3)  // returns expected
 */
 
type Func = (...rest: any[]) => Func
export function curry(func: Function, arity = func.length): Func {
  return function carried(this: Func, ...args) {
    if (args.length >= arity) {
      return func.apply(this, args)
    }
    return function carried2(this: Func, ...args2) {
      return carried.apply(this, args.concat(args2))
    }
  }
}