var _arguments = arguments;
/**
 * curry.js
 *
 * @Author: apple
 * @Date: 2018/6/27 16:04
 */

var sub_curry = function sub_curry(fn) {
    // 得到当前子柯里化函数的所有参数
    var args = [].slice.call(_arguments, 1);
    return function () {
        // 使用apply进行函数调用，并返回这个函数
        return fn.apply(this, args.concat([].slice.call(arguments)));
    };
};

var curry = function curry(fn, length) {
    // 得到参数长度
    length = length || fn.length;
    // 定义slice函数
    var slice = Array.prototype.slice;
    return function () {
        // 判断当前参数的长度是否小于剩余参数长度
        if (arguments.length < length) {
            // 将当前参数和上一个函数fn合并到一起
            var combined = [fn].concat(slice.call(arguments));
            // 递归调用子柯里化函数，并减去当前数组调用值个数
            return curry(sub_curry.apply(this, combined), length - arguments.length);
        } else {
            // 不小于当前参数预留个数的时候直接调用，不进行函数功能准备
            return fn.apply(this, arguments);
        }
    };
};

export default curry;