43 lines
		
	
	
		
			935 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			43 lines
		
	
	
		
			935 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | var wrappy = require('wrappy') | ||
|  | module.exports = wrappy(once) | ||
|  | module.exports.strict = wrappy(onceStrict) | ||
|  | 
 | ||
|  | once.proto = once(function () { | ||
|  |   Object.defineProperty(Function.prototype, 'once', { | ||
|  |     value: function () { | ||
|  |       return once(this) | ||
|  |     }, | ||
|  |     configurable: true | ||
|  |   }) | ||
|  | 
 | ||
|  |   Object.defineProperty(Function.prototype, 'onceStrict', { | ||
|  |     value: function () { | ||
|  |       return onceStrict(this) | ||
|  |     }, | ||
|  |     configurable: true | ||
|  |   }) | ||
|  | }) | ||
|  | 
 | ||
|  | function once (fn) { | ||
|  |   var f = function () { | ||
|  |     if (f.called) return f.value | ||
|  |     f.called = true | ||
|  |     return f.value = fn.apply(this, arguments) | ||
|  |   } | ||
|  |   f.called = false | ||
|  |   return f | ||
|  | } | ||
|  | 
 | ||
|  | function onceStrict (fn) { | ||
|  |   var f = function () { | ||
|  |     if (f.called) | ||
|  |       throw new Error(f.onceError) | ||
|  |     f.called = true | ||
|  |     return f.value = fn.apply(this, arguments) | ||
|  |   } | ||
|  |   var name = fn.name || 'Function wrapped with `once`' | ||
|  |   f.onceError = name + " shouldn't be called more than once" | ||
|  |   f.called = false | ||
|  |   return f | ||
|  | } |