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.
		
		
		
		
		
			
		
			
				
					127 lines
				
				2.4 KiB
			
		
		
			
		
	
	
					127 lines
				
				2.4 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var xtend = require('xtend')
							 | 
						||
| 
								 | 
							
								var reusify = require('reusify')
							 | 
						||
| 
								 | 
							
								var defaults = {
							 | 
						||
| 
								 | 
							
								  released: nop,
							 | 
						||
| 
								 | 
							
								  results: true
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function fastseries (options) {
							 | 
						||
| 
								 | 
							
								  options = xtend(defaults, options)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var released = options.released
							 | 
						||
| 
								 | 
							
								  var queue = reusify(options.results ? ResultsHolder : NoResultsHolder)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return series
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function series (that, toCall, arg, done) {
							 | 
						||
| 
								 | 
							
								    var holder = queue.get()
							 | 
						||
| 
								 | 
							
								    holder._released = release
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    done = done || nop
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (toCall.length === 0) {
							 | 
						||
| 
								 | 
							
								      done.call(that)
							 | 
						||
| 
								 | 
							
								      release(holder)
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      holder._callback = done
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (toCall.call) {
							 | 
						||
| 
								 | 
							
								        holder._list = arg
							 | 
						||
| 
								 | 
							
								        holder._each = toCall
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        holder._list = toCall
							 | 
						||
| 
								 | 
							
								        holder._arg = arg
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      holder._callThat = that
							 | 
						||
| 
								 | 
							
								      holder.release()
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function release (holder) {
							 | 
						||
| 
								 | 
							
								    queue.release(holder)
							 | 
						||
| 
								 | 
							
								    released()
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function reset () {
							 | 
						||
| 
								 | 
							
								  this._list = null
							 | 
						||
| 
								 | 
							
								  this._arg = null
							 | 
						||
| 
								 | 
							
								  this._callThat = null
							 | 
						||
| 
								 | 
							
								  this._callback = nop
							 | 
						||
| 
								 | 
							
								  this._each = null
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function NoResultsHolder () {
							 | 
						||
| 
								 | 
							
								  reset.call(this)
							 | 
						||
| 
								 | 
							
								  this.next = null
							 | 
						||
| 
								 | 
							
								  this._released = null
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var that = this
							 | 
						||
| 
								 | 
							
								  var i = 0
							 | 
						||
| 
								 | 
							
								  this.release = function () {
							 | 
						||
| 
								 | 
							
								    if (i < that._list.length) {
							 | 
						||
| 
								 | 
							
								      if (that._each) {
							 | 
						||
| 
								 | 
							
								        makeCall(that._callThat, that._each, that._list[i++], that.release)
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        makeCall(that._callThat, that._list[i++], that._arg, that.release)
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      that._callback.call(that._callThat)
							 | 
						||
| 
								 | 
							
								      reset.call(that)
							 | 
						||
| 
								 | 
							
								      i = 0
							 | 
						||
| 
								 | 
							
								      that._released(that)
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function ResultsHolder (_release) {
							 | 
						||
| 
								 | 
							
								  reset.call(this)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  this._results = []
							 | 
						||
| 
								 | 
							
								  this.next = null
							 | 
						||
| 
								 | 
							
								  this._released = null
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var that = this
							 | 
						||
| 
								 | 
							
								  var i = 0
							 | 
						||
| 
								 | 
							
								  this.release = function (err, result) {
							 | 
						||
| 
								 | 
							
								    if (i !== 0) that._results[i - 1] = result
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (!err && i < that._list.length) {
							 | 
						||
| 
								 | 
							
								      if (that._each) {
							 | 
						||
| 
								 | 
							
								        makeCall(that._callThat, that._each, that._list[i++], that.release)
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        makeCall(that._callThat, that._list[i++], that._arg, that.release)
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      that._callback.call(that._callThat, err, that._results)
							 | 
						||
| 
								 | 
							
								      reset.call(that)
							 | 
						||
| 
								 | 
							
								      that._results = []
							 | 
						||
| 
								 | 
							
								      i = 0
							 | 
						||
| 
								 | 
							
								      that._released(that)
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function makeCall (that, cb, arg, release) {
							 | 
						||
| 
								 | 
							
								  if (that) {
							 | 
						||
| 
								 | 
							
								    if (cb.length === 1) {
							 | 
						||
| 
								 | 
							
								      cb.call(that, release)
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      cb.call(that, arg, release)
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  } else {
							 | 
						||
| 
								 | 
							
								    if (cb.length === 1) {
							 | 
						||
| 
								 | 
							
								      cb(release)
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      cb(arg, release)
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function nop () { }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = fastseries
							 |