|
import mimicFunction from 'mimic-fn'; |
|
|
|
const calledFunctions = new WeakMap(); |
|
|
|
const onetime = (function_, options = {}) => { |
|
if (typeof function_ !== 'function') { |
|
throw new TypeError('Expected a function'); |
|
} |
|
|
|
let returnValue; |
|
let callCount = 0; |
|
const functionName = function_.displayName || function_.name || '<anonymous>'; |
|
|
|
const onetime = function (...arguments_) { |
|
calledFunctions.set(onetime, ++callCount); |
|
|
|
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`); |
|
} |
|
|
|
return returnValue; |
|
}; |
|
|
|
mimicFunction(onetime, function_); |
|
calledFunctions.set(onetime, callCount); |
|
|
|
return onetime; |
|
}; |
|
|
|
onetime.callCount = function_ => { |
|
if (!calledFunctions.has(function_)) { |
|
throw new Error(`The given function \`${function_.name}\` is not wrapped by the \`onetime\` package`); |
|
} |
|
|
|
return calledFunctions.get(function_); |
|
}; |
|
|
|
export default onetime; |
|
|