time-to-botec

Benchmark sampling in different programming languages
Log | Files | Refs | README

index.js (1022B)


      1 import mimicFunction from 'mimic-fn';
      2 
      3 const calledFunctions = new WeakMap();
      4 
      5 const onetime = (function_, options = {}) => {
      6 	if (typeof function_ !== 'function') {
      7 		throw new TypeError('Expected a function');
      8 	}
      9 
     10 	let returnValue;
     11 	let callCount = 0;
     12 	const functionName = function_.displayName || function_.name || '<anonymous>';
     13 
     14 	const onetime = function (...arguments_) {
     15 		calledFunctions.set(onetime, ++callCount);
     16 
     17 		if (callCount === 1) {
     18 			returnValue = function_.apply(this, arguments_);
     19 			function_ = null;
     20 		} else if (options.throw === true) {
     21 			throw new Error(`Function \`${functionName}\` can only be called once`);
     22 		}
     23 
     24 		return returnValue;
     25 	};
     26 
     27 	mimicFunction(onetime, function_);
     28 	calledFunctions.set(onetime, callCount);
     29 
     30 	return onetime;
     31 };
     32 
     33 onetime.callCount = function_ => {
     34 	if (!calledFunctions.has(function_)) {
     35 		throw new Error(`The given function \`${function_.name}\` is not wrapped by the \`onetime\` package`);
     36 	}
     37 
     38 	return calledFunctions.get(function_);
     39 };
     40 
     41 export default onetime;