38 lines
		
	
	
		
			941 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			38 lines
		
	
	
		
			941 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | /** Used to detect hot functions by number of calls within a span of milliseconds. */ | ||
|  | var HOT_COUNT = 800, | ||
|  |     HOT_SPAN = 16; | ||
|  | 
 | ||
|  | /* Built-in method references for those with the same name as other `lodash` methods. */ | ||
|  | var nativeNow = Date.now; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Creates a function that'll short out and invoke `identity` instead | ||
|  |  * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` | ||
|  |  * milliseconds. | ||
|  |  * | ||
|  |  * @private | ||
|  |  * @param {Function} func The function to restrict. | ||
|  |  * @returns {Function} Returns the new shortable function. | ||
|  |  */ | ||
|  | function shortOut(func) { | ||
|  |   var count = 0, | ||
|  |       lastCalled = 0; | ||
|  | 
 | ||
|  |   return function() { | ||
|  |     var stamp = nativeNow(), | ||
|  |         remaining = HOT_SPAN - (stamp - lastCalled); | ||
|  | 
 | ||
|  |     lastCalled = stamp; | ||
|  |     if (remaining > 0) { | ||
|  |       if (++count >= HOT_COUNT) { | ||
|  |         return arguments[0]; | ||
|  |       } | ||
|  |     } else { | ||
|  |       count = 0; | ||
|  |     } | ||
|  |     return func.apply(undefined, arguments); | ||
|  |   }; | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = shortOut; |