const calledFunctions = new WeakMap();
-const oneTime = (fn, options = {}) => {
- if (typeof fn !== 'function') {
+const onetime = (function_, options = {}) => {
+ if (typeof function_ !== 'function') {
throw new TypeError('Expected a function');
}
- let ret;
- let isCalled = false;
+ let returnValue;
let callCount = 0;
- const functionName = fn.displayName || fn.name || '<anonymous>';
+ const functionName = function_.displayName || function_.name || '<anonymous>';
- const onetime = function (...args) {
+ const onetime = function (...arguments_) {
calledFunctions.set(onetime, ++callCount);
- if (isCalled) {
- if (options.throw === true) {
- throw new Error(`Function \`${functionName}\` can only be called once`);
- }
-
- return ret;
+ if (callCount === 1) {
+ returnValue = function_.apply(this, arguments_);
+ function_ = null;
+ } else if (options.throw === true) {
+ throw new Error(`Function \`${functionName}\` can only be called once`);
}
- isCalled = true;
- ret = fn.apply(this, args);
- fn = null;
-
- return ret;
+ return returnValue;
};
- mimicFn(onetime, fn);
+ mimicFn(onetime, function_);
calledFunctions.set(onetime, callCount);
return onetime;
};
-module.exports = oneTime;
+module.exports = onetime;
// TODO: Remove this for the next major release
-module.exports.default = oneTime;
+module.exports.default = onetime;
-module.exports.callCount = fn => {
- if (!calledFunctions.has(fn)) {
- throw new Error(`The given function \`${fn.name}\` is not wrapped by the \`onetime\` package`);
+module.exports.callCount = function_ => {
+ if (!calledFunctions.has(function_)) {
+ throw new Error(`The given function \`${function_.name}\` is not wrapped by the \`onetime\` package`);
}
- return calledFunctions.get(fn);
+ return calledFunctions.get(function_);
};