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.
		
		
		
		
		
			
		
			
				
					45 lines
				
				1.1 KiB
			
		
		
			
		
	
	
					45 lines
				
				1.1 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'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_);
							 | 
						||
| 
								 | 
							
								};
							 |