import defaultTo from './defaultTo';
import { FUNC_ERROR_TEXT } from './internals/helpers';
import { nativeUndefined } from './internals/native';
import toNumber from './toNumber';
/**
* 创建一个调用 `func` 的函数,调用次数少于 `n` 次。之后再调用这个函数,将返回最后一次调用 `func` 的结果。
*
* @alias module:Function.before
* @since 1.0.0
* @param {number} n 不再调用 `func` 的次数。
* @param {Function} func 限制执行的函数。
* @returns {Function} 新的限定函数。
* @example
*
* let count = 0;
*
* const increment = before(3, () => {
* return ++count;
* });
*
* increment(); // 1
* increment(); // 2
* increment(); // 2 返回之前的结果
*
*/
function before(n, func) {
if (typeof func !== 'function') {
throw new TypeError(FUNC_ERROR_TEXT);
}
let result;
n = defaultTo(toNumber(n), 0);
return function () {
if (--n > 0) {
// @ts-expect-error
// eslint-disable-next-line prefer-rest-params
result = func.apply(this, arguments);
}
if (n <= 1) {
// @ts-expect-error
func = nativeUndefined;
}
return result;
};
}
export default before;