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.
		
		
		
		
		
			
		
			
				
					151 lines
				
				3.5 KiB
			
		
		
			
		
	
	
					151 lines
				
				3.5 KiB
			| 
											3 years ago
										 | 'use strict' | ||
|  | 
 | ||
|  | var reusify = require('reusify') | ||
|  | var empty = [] | ||
|  | 
 | ||
|  | function fastfall (context, template) { | ||
|  |   if (Array.isArray(context)) { | ||
|  |     template = context | ||
|  |     context = null | ||
|  |   } | ||
|  | 
 | ||
|  |   var queue = reusify(Holder) | ||
|  | 
 | ||
|  |   return template ? compiled : fall | ||
|  | 
 | ||
|  |   function fall () { | ||
|  |     var current = queue.get() | ||
|  |     current.release = release | ||
|  | 
 | ||
|  |     if (arguments.length === 3) { | ||
|  |       current.context = arguments[0] | ||
|  |       current.list = arguments[1] | ||
|  |       current.callback = arguments[2] || noop | ||
|  |     } else { | ||
|  |       current.context = context | ||
|  |       current.list = arguments[0] | ||
|  |       current.callback = arguments[1] || noop | ||
|  |     } | ||
|  | 
 | ||
|  |     current.work() | ||
|  |   } | ||
|  | 
 | ||
|  |   function release (holder) { | ||
|  |     queue.release(holder) | ||
|  |   } | ||
|  | 
 | ||
|  |   function compiled () { | ||
|  |     var current = queue.get() | ||
|  |     current.release = release | ||
|  | 
 | ||
|  |     current.list = template | ||
|  | 
 | ||
|  |     var args | ||
|  |     var i | ||
|  |     var len = arguments.length - 1 | ||
|  | 
 | ||
|  |     current.context = this || context | ||
|  |     current.callback = arguments[len] || noop | ||
|  | 
 | ||
|  |     switch (len) { | ||
|  |       case 0: | ||
|  |         current.work() | ||
|  |         break | ||
|  |       case 1: | ||
|  |         current.work(null, arguments[0]) | ||
|  |         break | ||
|  |       case 2: | ||
|  |         current.work(null, arguments[0], arguments[1]) | ||
|  |         break | ||
|  |       case 3: | ||
|  |         current.work(null, arguments[0], arguments[1], arguments[2]) | ||
|  |         break | ||
|  |       case 4: | ||
|  |         current.work(null, arguments[0], arguments[1], arguments[2], arguments[3]) | ||
|  |         break | ||
|  |       default: | ||
|  |         args = new Array(len + 1) | ||
|  |         args[0] = null | ||
|  |         for (i = 0; i < len; i++) { | ||
|  |           args[i + 1] = arguments[i] | ||
|  |         } | ||
|  |         current.work.apply(null, args) | ||
|  |     } | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | function noop () {} | ||
|  | 
 | ||
|  | function Holder () { | ||
|  |   this.list = empty | ||
|  |   this.callback = noop | ||
|  |   this.count = 0 | ||
|  |   this.context = undefined | ||
|  |   this.release = noop | ||
|  | 
 | ||
|  |   var that = this | ||
|  | 
 | ||
|  |   this.work = function work () { | ||
|  |     if (arguments.length > 0 && arguments[0]) { | ||
|  |       return that.callback.call(that.context, arguments[0]) | ||
|  |     } | ||
|  | 
 | ||
|  |     var len = arguments.length | ||
|  |     var i | ||
|  |     var args | ||
|  |     var func | ||
|  | 
 | ||
|  |     if (that.count < that.list.length) { | ||
|  |       func = that.list[that.count++] | ||
|  |       switch (len) { | ||
|  |         case 0: | ||
|  |         case 1: | ||
|  |           return func.call(that.context, work) | ||
|  |         case 2: | ||
|  |           return func.call(that.context, arguments[1], work) | ||
|  |         case 3: | ||
|  |           return func.call(that.context, arguments[1], arguments[2], work) | ||
|  |         case 4: | ||
|  |           return func.call(that.context, arguments[1], arguments[2], arguments[3], work) | ||
|  |         default: | ||
|  |           args = new Array(len) | ||
|  |           for (i = 1; i < len; i++) { | ||
|  |             args[i - 1] = arguments[i] | ||
|  |           } | ||
|  |           args[len - 1] = work | ||
|  |           func.apply(that.context, args) | ||
|  |       } | ||
|  |     } else { | ||
|  |       switch (len) { | ||
|  |         case 0: | ||
|  |           that.callback.call(that.context) | ||
|  |           break | ||
|  |         case 1: | ||
|  |           that.callback.call(that.context, arguments[0]) | ||
|  |           break | ||
|  |         case 2: | ||
|  |           that.callback.call(that.context, arguments[0], arguments[1]) | ||
|  |           break | ||
|  |         case 3: | ||
|  |           that.callback.call(that.context, arguments[0], arguments[1], arguments[2]) | ||
|  |           break | ||
|  |         case 4: | ||
|  |           that.callback.call(that.context, arguments[0], arguments[1], arguments[2], arguments[3]) | ||
|  |           break | ||
|  |         default: | ||
|  |           args = new Array(len) | ||
|  |           for (i = 0; i < len; i++) { | ||
|  |             args[i] = arguments[i] | ||
|  |           } | ||
|  |           that.callback.apply(that.context, args) | ||
|  |       } | ||
|  |       that.context = undefined | ||
|  |       that.list = empty | ||
|  |       that.count = 0 | ||
|  |       that.release(that) | ||
|  |     } | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = fastfall |