You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
44 lines
1.1 KiB
44 lines
1.1 KiB
'use strict'; |
|
const mimicFn = require('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; |
|
}; |
|
|
|
mimicFn(onetime, function_); |
|
calledFunctions.set(onetime, callCount); |
|
|
|
return onetime; |
|
}; |
|
|
|
module.exports = onetime; |
|
// TODO: Remove this for the next major release |
|
module.exports.default = onetime; |
|
|
|
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(function_); |
|
};
|
|
|