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
						
					
					
				'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
 |