partial.js

/* eslint-disable prefer-rest-params */
import { arrayProtoSlice } from './internals/native';
const PLACEHOLDER = {
    __ut2_partial_ph__: null
};
/**
 * 创建一个函数。该函数调用 `func`,并传入预设的 `args` 参数。
 *
 *  `partial._` 或 `partial.placeholder` 可用作参数的占位符。
 *
 * @function
 * @alias module:Function.partial
 * @since 1.0.0
 * @param {Function} func 需要预设的函数。
 * @param {...*} [args] 预设的参数。
 * @returns {Function} 预设参数的函数。
 * @example
 *
 * function greet(greeting, name){
 *   return greeting + ' ' + name;
 * }
 *
 * const sayHelloTo = partial(greet, 'hello');
 * sayHelloTo('jeff'); // 'hello jeff'
 *
 * const greetJeff = partial(greet, partial._, 'jeff');
 * greetJeff('hi'); // 'hi jeff'
 *
 */
const partial = function (func) {
    const argsOrig = arrayProtoSlice.call(arguments, 1);
    return function () {
        const args = [];
        const argsPartial = arrayProtoSlice.call(arguments);
        for (let i = 0; i < argsOrig.length; i++) {
            args[i] = argsOrig[i] === PLACEHOLDER ? argsPartial.shift() : argsOrig[i];
        }
        return func.apply(this, args.concat(argsPartial));
    };
};
partial.placeholder = partial._ = PLACEHOLDER;
export default partial;