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
							 |