/* 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;