9185 lines
		
	
	
		
			230 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			9185 lines
		
	
	
		
			230 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| (function(global, factory) {
 | |
|   /*jshint -W030 */
 | |
|   'use strict';
 | |
|   typeof exports === 'object' && typeof module !== 'undefined'
 | |
|     ? factory(exports)
 | |
|     : typeof define === 'function' && define.amd
 | |
|     ? define(['exports'], factory)
 | |
|     : global.async
 | |
|     ? factory((global.neo_async = global.neo_async || {}))
 | |
|     : factory((global.async = global.async || {}));
 | |
| })(this, function(exports) {
 | |
|   'use strict';
 | |
| 
 | |
|   var noop = function noop() {};
 | |
|   var throwError = function throwError() {
 | |
|     throw new Error('Callback was already called.');
 | |
|   };
 | |
| 
 | |
|   var DEFAULT_TIMES = 5;
 | |
|   var DEFAULT_INTERVAL = 0;
 | |
| 
 | |
|   var obj = 'object';
 | |
|   var func = 'function';
 | |
|   var isArray = Array.isArray;
 | |
|   var nativeKeys = Object.keys;
 | |
|   var nativePush = Array.prototype.push;
 | |
|   var iteratorSymbol = typeof Symbol === func && Symbol.iterator;
 | |
| 
 | |
|   var nextTick, asyncNextTick, asyncSetImmediate;
 | |
|   createImmediate();
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace each
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.each(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // undefined
 | |
|    *   console.log(order); // [1, 2, 3]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.each(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // undefined
 | |
|    *   console.log(order); // [[1, 0], [2, 2], [3, 1]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.each(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // undefined
 | |
|    *   console.log(order); // [1, 2, 3]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.each(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // undefined
 | |
|    *   console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b']]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // break
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num !== 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.each(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // undefined
 | |
|    *   console.log(order); // [1, 2]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var each = createEach(arrayEach, baseEach, symbolEach);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace map
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.map(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3, 2];
 | |
|    *   console.log(order); // [1, 2, 3]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.map(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3, 2]
 | |
|    *   console.log(order); // [[1, 0], [2, 2], [3, 1]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.map(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3, 2]
 | |
|    *   console.log(order); // [1, 2, 3]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.map(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3, 2]
 | |
|    *   console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var map = createMap(arrayEachIndex, baseEachIndex, symbolEachIndex, true);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace mapValues
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.mapValues(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '0': 1, '1': 3, '2': 2 }
 | |
|    *   console.log(order); // [1, 2, 3]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.mapValues(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '0': 1, '1': 3, '2': 2 }
 | |
|    *   console.log(order); // [[1, 0], [2, 2], [3, 1]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.mapValues(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // { a: 1, b: 3, c: 2 }
 | |
|    *   console.log(order); // [1, 2, 3]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.mapValues(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // { a: 1, b: 3, c: 2 }
 | |
|    *   console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var mapValues = createMap(arrayEachIndex, baseEachKey, symbolEachKey, false);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace filter
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.filter(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3];
 | |
|    *   console.log(order); // [1, 2, 3]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.filter(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3];
 | |
|    *   console.log(order); // [[1, 0], [2, 2], [3, 1]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.filter(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3];
 | |
|    *   console.log(order); // [1, 2, 3]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.filter(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3];
 | |
|    *   console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var filter = createFilter(arrayEachIndexValue, baseEachIndexValue, symbolEachIndexValue, true);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace filterSeries
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.filterSeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3];
 | |
|    *   console.log(order); // [1, 3, 2]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.filterSeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3]
 | |
|    *   console.log(order); // [[1, 0], [3, 1], [2, 2]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.filterSeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3]
 | |
|    *   console.log(order); // [1, 3, 2]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.filterSeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3]
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'b'], [2, 'c']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var filterSeries = createFilterSeries(true);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace filterLimit
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {number} limit - limit >= 1
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.filterLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 5, 3]
 | |
|    *   console.log(order); // [1, 3, 5, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.filterLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 5, 3]
 | |
|    *   console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.filterLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 5, 3]
 | |
|    *   console.log(order); // [1, 3, 5, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.filterLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 5, 3]
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var filterLimit = createFilterLimit(true);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace reject
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.reject(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // [2];
 | |
|    *   console.log(order); // [1, 2, 3]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.reject(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // [2];
 | |
|    *   console.log(order); // [[1, 0], [2, 2], [3, 1]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.reject(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // [2];
 | |
|    *   console.log(order); // [1, 2, 3]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.reject(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // [2];
 | |
|    *   console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var reject = createFilter(arrayEachIndexValue, baseEachIndexValue, symbolEachIndexValue, false);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace rejectSeries
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.rejectSeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // [2];
 | |
|    *   console.log(order); // [1, 3, 2]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.rejectSeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // [2];
 | |
|    *   console.log(order); // [1, 3, 2]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.rejectSeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // [2];
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'b'], [2, 'c']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var rejectSeries = createFilterSeries(false);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace rejectLimit
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {number} limit - limit >= 1
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.rejectLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // [4, 2]
 | |
|    *   console.log(order); // [1, 3, 5, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.rejectLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // [4, 2]
 | |
|    *   console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.rejectLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // [4, 2]
 | |
|    *   console.log(order); // [1, 3, 5, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.rejectLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // [4, 2]
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var rejectLimit = createFilterLimit(false);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace detect
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.detect(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // 1
 | |
|    *   console.log(order); // [1]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.detect(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // 1
 | |
|    *   console.log(order); // [[1, 0]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.detect(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // 1
 | |
|    *   console.log(order); // [1]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.detect(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // 1
 | |
|    *   console.log(order); // [[1, 'a']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var detect = createDetect(arrayEachValue, baseEachValue, symbolEachValue, true);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace detectSeries
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.detectSeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // 1
 | |
|    *   console.log(order); // [1]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.detectSeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // 1
 | |
|    *   console.log(order); // [[1, 0]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.detectSeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // 1
 | |
|    *   console.log(order); // [1]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.detectSeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // 1
 | |
|    *   console.log(order); // [[1, 'a']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var detectSeries = createDetectSeries(true);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace detectLimit
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {number} limit - limit >= 1
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.detectLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // 1
 | |
|    *   console.log(order); // [1]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.detectLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // 1
 | |
|    *   console.log(order); // [[1, 0]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.detectLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // 1
 | |
|    *   console.log(order); // [1]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.detectLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // 1
 | |
|    *   console.log(order); // [[1, 'a']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var detectLimit = createDetectLimit(true);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace every
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.every(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // false
 | |
|    *   console.log(order); // [1, 2]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.every(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // false
 | |
|    *   console.log(order); // [[1, 0], [2, 2]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.every(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // false
 | |
|    *   console.log(order); // [1, 2]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.every(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // false
 | |
|    *   console.log(order); // [[1, 'a'], [2, 'c']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var every = createEvery(arrayEachValue, baseEachValue, symbolEachValue);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace everySeries
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.everySeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // false
 | |
|    *   console.log(order); // [1, 3, 2]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.everySeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // false
 | |
|    *   console.log(order); // [[1, 0], [3, 1], [2, 2]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.everySeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // false
 | |
|    *   console.log(order); // [1, 3, 2]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.everySeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // false
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'b'] [2, 'c']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var everySeries = createEverySeries();
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace everyLimit
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {number} limit - limit >= 1
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.everyLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // false
 | |
|    *   console.log(order); // [1, 3, 5, 2]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.everyLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // false
 | |
|    *   console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.everyLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // false
 | |
|    *   console.log(order); // [1, 3, 5, 2]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.everyLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // false
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var everyLimit = createEveryLimit();
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace pick
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2, 4];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.pick(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '0': 1, '1': 3 }
 | |
|    *   console.log(order); // [1, 2, 3, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2, 4];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.pick(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '0': 1, '1': 3 }
 | |
|    *   console.log(order); // [[0, 1], [2, 2], [3, 1], [4, 3]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2, d: 4 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.pick(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // { a: 1, b: 3 }
 | |
|    *   console.log(order); // [1, 2, 3, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2, d: 4 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.pick(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // { a: 1, b: 3 }
 | |
|    *   console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b'], [4, 'd']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var pick = createPick(arrayEachIndexValue, baseEachKeyValue, symbolEachKeyValue, true);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace pickSeries
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2, 4];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.pickSeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '0': 1, '1': 3 }
 | |
|    *   console.log(order); // [1, 3, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2, 4];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.pickSeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '0': 1, '1': 3 }
 | |
|    *   console.log(order); // [[0, 1], [3, 1], [2, 2], [4, 3]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2, d: 4 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.pickSeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // { a: 1, b: 3 }
 | |
|    *   console.log(order); // [1, 3, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2, d: 4 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.pickSeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // { a: 1, b: 3 }
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'b'], [2, 'c'], [4, 'd']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var pickSeries = createPickSeries(true);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace pickLimit
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {number} limit - limit >= 1
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.pickLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '0': 1, '1': 5, '2': 3 }
 | |
|    *   console.log(order); // [1, 3, 5, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.pickLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '0': 1, '1': 5, '2': 3 }
 | |
|    *   console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.pickLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // { a: 1, b: 5, c: 3 }
 | |
|    *   console.log(order); // [1, 3, 5, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.pickLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // { a: 1, b: 5, c: 3 }
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var pickLimit = createPickLimit(true);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace omit
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2, 4];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.omit(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '2': 2, '3': 4 }
 | |
|    *   console.log(order); // [1, 2, 3, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2, 4];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.omit(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '2': 2, '3': 4 }
 | |
|    *   console.log(order); // [[0, 1], [2, 2], [3, 1], [4, 3]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2, d: 4 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.omit(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // { c: 2, d: 4 }
 | |
|    *   console.log(order); // [1, 2, 3, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2, d: 4 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.omit(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // { c: 2, d: 4 }
 | |
|    *   console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b'], [4, 'd']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var omit = createPick(arrayEachIndexValue, baseEachKeyValue, symbolEachKeyValue, false);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace omitSeries
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2, 4];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.omitSeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '2': 2, '3': 4 }
 | |
|    *   console.log(order); // [1, 3, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2, 4];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.omitSeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '2': 2, '3': 4 }
 | |
|    *   console.log(order); // [[0, 1], [3, 1], [2, 2], [4, 3]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2, d: 4 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.omitSeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // { c: 2, d: 4 }
 | |
|    *   console.log(order); // [1, 3, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2, d: 4 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.omitSeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // { c: 2, d: 4 }
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'b'], [2, 'c'], [4, 'd']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var omitSeries = createPickSeries(false);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace omitLimit
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {number} limit - limit >= 1
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.omitLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '3': 4, '4': 2 }
 | |
|    *   console.log(order); // [1, 3, 5, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.omitLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '3': 4, '4': 2 }
 | |
|    *   console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.omitLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // { d: 4, e: 2 }
 | |
|    *   console.log(order); // [1, 3, 5, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.omitLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // { d: 4, e: 2 }
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var omitLimit = createPickLimit(false);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace transform
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Array|Object|Function} [accumulator]
 | |
|    * @param {Function} [iterator]
 | |
|    * @param {Function} [callback]
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var collection = [1, 3, 2, 4];
 | |
|    * var iterator = function(result, num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     result.push(num)
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.transform(collection, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 2, 3, 4]
 | |
|    *   console.log(order); // [1, 2, 3, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index and accumulator
 | |
|    * var order = [];
 | |
|    * var collection = [1, 3, 2, 4];
 | |
|    * var iterator = function(result, num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     result[index] = num;
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.transform(collection, {}, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '0': 1, '1': 3, '2': 2, '3': 4 }
 | |
|    *   console.log(order); // [[1, 0], [2, 2], [3, 1], [4, 3]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with accumulator
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2, d: 4 };
 | |
|    * var iterator = function(result, num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     result.push(num);
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.transform(collection, [], iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 2, 3, 4]
 | |
|    *   console.log(order); // [1, 2, 3, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2, d: 4 };
 | |
|    * var iterator = function(result, num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     result[key] = num;
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.transform(collection, iterator, function(err, res) {
 | |
|    *   console.log(res); //  { a: 1, b: 3, c: 2, d: 4 }
 | |
|    *   console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b'], [4, 'd']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var transform = createTransform(arrayEachResult, baseEachResult, symbolEachResult);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace sortBy
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.sortBy(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 2, 3];
 | |
|    *   console.log(order); // [1, 2, 3]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.sortBy(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 2, 3]
 | |
|    *   console.log(order); // [[1, 0], [2, 2], [3, 1]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.sortBy(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 2, 3]
 | |
|    *   console.log(order); // [1, 2, 3]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.sortBy(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 2, 3]
 | |
|    *   console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var sortBy = createSortBy(arrayEachIndexValue, baseEachIndexValue, symbolEachIndexValue);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace concat
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, [num]);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.concat(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 2, 3];
 | |
|    *   console.log(order); // [1, 2, 3]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, [num]);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.concat(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 2, 3]
 | |
|    *   console.log(order); // [[1, 0], [2, 2], [3, 1]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, [num]);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.concat(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 2, 3]
 | |
|    *   console.log(order); // [1, 2, 3]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, [num]);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.concat(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 2, 3]
 | |
|    *   console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var concat = createConcat(arrayEachIndex, baseEachIndex, symbolEachIndex);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace groupBy
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [4.2, 6.4, 6.1];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, Math.floor(num));
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.groupBy(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '4': [4.2], '6': [6.1, 6.4] }
 | |
|    *   console.log(order); // [4.2, 6.1, 6.4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [4.2, 6.4, 6.1];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, Math.floor(num));
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.groupBy(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '4': [4.2], '6': [6.1, 6.4] }
 | |
|    *   console.log(order); // [[4.2, 0], [6.1, 2], [6.4, 1]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 4.2, b: 6.4, c: 6.1 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, Math.floor(num));
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.groupBy(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '4': [4.2], '6': [6.1, 6.4] }
 | |
|    *   console.log(order); // [4.2, 6.1, 6.4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 4.2, b: 6.4, c: 6.1 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, Math.floor(num));
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.groupBy(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '4': [4.2], '6': [6.1, 6.4] }
 | |
|    *   console.log(order); // [[4.2, 'a'], [6.1, 'c'], [6.4, 'b']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var groupBy = createGroupBy(arrayEachValue, baseEachValue, symbolEachValue);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace parallel
 | |
|    * @param {Array|Object} tasks - functions
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * var order = [];
 | |
|    * var tasks = [
 | |
|    *  function(done) {
 | |
|    *    setTimeout(function() {
 | |
|    *      order.push(1);
 | |
|    *      done(null, 1);
 | |
|    *    }, 10);
 | |
|    *  },
 | |
|    *  function(done) {
 | |
|    *    setTimeout(function() {
 | |
|    *      order.push(2);
 | |
|    *      done(null, 2);
 | |
|    *    }, 30);
 | |
|    *  },
 | |
|    *  function(done) {
 | |
|    *    setTimeout(function() {
 | |
|    *      order.push(3);
 | |
|    *      done(null, 3);
 | |
|    *    }, 40);
 | |
|    *  },
 | |
|    *  function(done) {
 | |
|    *    setTimeout(function() {
 | |
|    *      order.push(4);
 | |
|    *      done(null, 4);
 | |
|    *    }, 20);
 | |
|    *  }
 | |
|    * ];
 | |
|    * async.parallel(tasks, function(err, res) {
 | |
|    *   console.log(res); // [1, 2, 3, 4];
 | |
|    *   console.log(order); // [1, 4, 2, 3]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * var order = [];
 | |
|    * var tasks = {
 | |
|    *   'a': function(done) {
 | |
|    *     setTimeout(function() {
 | |
|    *       order.push(1);
 | |
|    *       done(null, 1);
 | |
|    *     }, 10);
 | |
|    *   },
 | |
|    *   'b': function(done) {
 | |
|    *     setTimeout(function() {
 | |
|    *       order.push(2);
 | |
|    *       done(null, 2);
 | |
|    *     }, 30);
 | |
|    *   },
 | |
|    *   'c': function(done) {
 | |
|    *     setTimeout(function() {
 | |
|    *       order.push(3);
 | |
|    *       done(null, 3);
 | |
|    *     }, 40);
 | |
|    *   },
 | |
|    *   'd': function(done) {
 | |
|    *     setTimeout(function() {
 | |
|    *       order.push(4);
 | |
|    *       done(null, 4);
 | |
|    *     }, 20);
 | |
|    *   }
 | |
|    * };
 | |
|    * async.parallel(tasks, function(err, res) {
 | |
|    *   console.log(res); // { a: 1, b: 2, c: 3, d:4 }
 | |
|    *   console.log(order); // [1, 4, 2, 3]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   var parallel = createParallel(arrayEachFunc, baseEachFunc);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace applyEach
 | |
|    */
 | |
|   var applyEach = createApplyEach(map);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace applyEachSeries
 | |
|    */
 | |
|   var applyEachSeries = createApplyEach(mapSeries);
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace log
 | |
|    */
 | |
|   var log = createLogger('log');
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace dir
 | |
|    */
 | |
|   var dir = createLogger('dir');
 | |
| 
 | |
|   /**
 | |
|    * @version 2.6.2
 | |
|    * @namespace async
 | |
|    */
 | |
|   var index = {
 | |
|     VERSION: '2.6.2',
 | |
| 
 | |
|     // Collections
 | |
|     each: each,
 | |
|     eachSeries: eachSeries,
 | |
|     eachLimit: eachLimit,
 | |
|     forEach: each,
 | |
|     forEachSeries: eachSeries,
 | |
|     forEachLimit: eachLimit,
 | |
|     eachOf: each,
 | |
|     eachOfSeries: eachSeries,
 | |
|     eachOfLimit: eachLimit,
 | |
|     forEachOf: each,
 | |
|     forEachOfSeries: eachSeries,
 | |
|     forEachOfLimit: eachLimit,
 | |
|     map: map,
 | |
|     mapSeries: mapSeries,
 | |
|     mapLimit: mapLimit,
 | |
|     mapValues: mapValues,
 | |
|     mapValuesSeries: mapValuesSeries,
 | |
|     mapValuesLimit: mapValuesLimit,
 | |
|     filter: filter,
 | |
|     filterSeries: filterSeries,
 | |
|     filterLimit: filterLimit,
 | |
|     select: filter,
 | |
|     selectSeries: filterSeries,
 | |
|     selectLimit: filterLimit,
 | |
|     reject: reject,
 | |
|     rejectSeries: rejectSeries,
 | |
|     rejectLimit: rejectLimit,
 | |
|     detect: detect,
 | |
|     detectSeries: detectSeries,
 | |
|     detectLimit: detectLimit,
 | |
|     find: detect,
 | |
|     findSeries: detectSeries,
 | |
|     findLimit: detectLimit,
 | |
|     pick: pick,
 | |
|     pickSeries: pickSeries,
 | |
|     pickLimit: pickLimit,
 | |
|     omit: omit,
 | |
|     omitSeries: omitSeries,
 | |
|     omitLimit: omitLimit,
 | |
|     reduce: reduce,
 | |
|     inject: reduce,
 | |
|     foldl: reduce,
 | |
|     reduceRight: reduceRight,
 | |
|     foldr: reduceRight,
 | |
|     transform: transform,
 | |
|     transformSeries: transformSeries,
 | |
|     transformLimit: transformLimit,
 | |
|     sortBy: sortBy,
 | |
|     sortBySeries: sortBySeries,
 | |
|     sortByLimit: sortByLimit,
 | |
|     some: some,
 | |
|     someSeries: someSeries,
 | |
|     someLimit: someLimit,
 | |
|     any: some,
 | |
|     anySeries: someSeries,
 | |
|     anyLimit: someLimit,
 | |
|     every: every,
 | |
|     everySeries: everySeries,
 | |
|     everyLimit: everyLimit,
 | |
|     all: every,
 | |
|     allSeries: everySeries,
 | |
|     allLimit: everyLimit,
 | |
|     concat: concat,
 | |
|     concatSeries: concatSeries,
 | |
|     concatLimit: concatLimit,
 | |
|     groupBy: groupBy,
 | |
|     groupBySeries: groupBySeries,
 | |
|     groupByLimit: groupByLimit,
 | |
| 
 | |
|     // Control Flow
 | |
|     parallel: parallel,
 | |
|     series: series,
 | |
|     parallelLimit: parallelLimit,
 | |
|     tryEach: tryEach,
 | |
|     waterfall: waterfall,
 | |
|     angelFall: angelFall,
 | |
|     angelfall: angelFall,
 | |
|     whilst: whilst,
 | |
|     doWhilst: doWhilst,
 | |
|     until: until,
 | |
|     doUntil: doUntil,
 | |
|     during: during,
 | |
|     doDuring: doDuring,
 | |
|     forever: forever,
 | |
|     compose: compose,
 | |
|     seq: seq,
 | |
|     applyEach: applyEach,
 | |
|     applyEachSeries: applyEachSeries,
 | |
|     queue: queue,
 | |
|     priorityQueue: priorityQueue,
 | |
|     cargo: cargo,
 | |
|     auto: auto,
 | |
|     autoInject: autoInject,
 | |
|     retry: retry,
 | |
|     retryable: retryable,
 | |
|     iterator: iterator,
 | |
|     times: times,
 | |
|     timesSeries: timesSeries,
 | |
|     timesLimit: timesLimit,
 | |
|     race: race,
 | |
| 
 | |
|     // Utils
 | |
|     apply: apply,
 | |
|     nextTick: asyncNextTick,
 | |
|     setImmediate: asyncSetImmediate,
 | |
|     memoize: memoize,
 | |
|     unmemoize: unmemoize,
 | |
|     ensureAsync: ensureAsync,
 | |
|     constant: constant,
 | |
|     asyncify: asyncify,
 | |
|     wrapSync: asyncify,
 | |
|     log: log,
 | |
|     dir: dir,
 | |
|     reflect: reflect,
 | |
|     reflectAll: reflectAll,
 | |
|     timeout: timeout,
 | |
|     createLogger: createLogger,
 | |
| 
 | |
|     // Mode
 | |
|     safe: safe,
 | |
|     fast: fast
 | |
|   };
 | |
| 
 | |
|   exports['default'] = index;
 | |
|   baseEachSync(
 | |
|     index,
 | |
|     function(func, key) {
 | |
|       exports[key] = func;
 | |
|     },
 | |
|     nativeKeys(index)
 | |
|   );
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function createImmediate(safeMode) {
 | |
|     var delay = function delay(fn) {
 | |
|       var args = slice(arguments, 1);
 | |
|       setTimeout(function() {
 | |
|         fn.apply(null, args);
 | |
|       });
 | |
|     };
 | |
|     asyncSetImmediate = typeof setImmediate === func ? setImmediate : delay;
 | |
|     if (typeof process === obj && typeof process.nextTick === func) {
 | |
|       nextTick = /^v0.10/.test(process.version) ? asyncSetImmediate : process.nextTick;
 | |
|       asyncNextTick = /^v0/.test(process.version) ? asyncSetImmediate : process.nextTick;
 | |
|     } else {
 | |
|       asyncNextTick = nextTick = asyncSetImmediate;
 | |
|     }
 | |
|     if (safeMode === false) {
 | |
|       nextTick = function(cb) {
 | |
|         cb();
 | |
|       };
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /* sync functions based on lodash */
 | |
| 
 | |
|   /**
 | |
|    * Converts `arguments` to an array.
 | |
|    *
 | |
|    * @private
 | |
|    * @param {Array} array = The array to slice.
 | |
|    */
 | |
|   function createArray(array) {
 | |
|     var index = -1;
 | |
|     var size = array.length;
 | |
|     var result = Array(size);
 | |
| 
 | |
|     while (++index < size) {
 | |
|       result[index] = array[index];
 | |
|     }
 | |
|     return result;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Create an array from `start`
 | |
|    *
 | |
|    * @private
 | |
|    * @param {Array} array - The array to slice.
 | |
|    * @param {number} start - The start position.
 | |
|    */
 | |
|   function slice(array, start) {
 | |
|     var end = array.length;
 | |
|     var index = -1;
 | |
|     var size = end - start;
 | |
|     if (size <= 0) {
 | |
|       return [];
 | |
|     }
 | |
|     var result = Array(size);
 | |
| 
 | |
|     while (++index < size) {
 | |
|       result[index] = array[index + start];
 | |
|     }
 | |
|     return result;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {Object} object
 | |
|    */
 | |
|   function objectClone(object) {
 | |
|     var keys = nativeKeys(object);
 | |
|     var size = keys.length;
 | |
|     var index = -1;
 | |
|     var result = {};
 | |
| 
 | |
|     while (++index < size) {
 | |
|       var key = keys[index];
 | |
|       result[key] = object[key];
 | |
|     }
 | |
|     return result;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Create an array with all falsey values removed.
 | |
|    *
 | |
|    * @private
 | |
|    * @param {Array} array - The array to compact.
 | |
|    */
 | |
|   function compact(array) {
 | |
|     var index = -1;
 | |
|     var size = array.length;
 | |
|     var result = [];
 | |
| 
 | |
|     while (++index < size) {
 | |
|       var value = array[index];
 | |
|       if (value) {
 | |
|         result[result.length] = value;
 | |
|       }
 | |
|     }
 | |
|     return result;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Create an array of reverse sequence.
 | |
|    *
 | |
|    * @private
 | |
|    * @param {Array} array - The array to reverse.
 | |
|    */
 | |
|   function reverse(array) {
 | |
|     var index = -1;
 | |
|     var size = array.length;
 | |
|     var result = Array(size);
 | |
|     var resIndex = size;
 | |
| 
 | |
|     while (++index < size) {
 | |
|       result[--resIndex] = array[index];
 | |
|     }
 | |
|     return result;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Checks if key exists in object property.
 | |
|    *
 | |
|    * @private
 | |
|    * @param {Object} object - The object to inspect.
 | |
|    * @param {string} key - The key to check.
 | |
|    */
 | |
|   function has(object, key) {
 | |
|     return object.hasOwnProperty(key);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * Check if target exists in array.
 | |
|    * @private
 | |
|    * @param {Array} array
 | |
|    * @param {*} target
 | |
|    */
 | |
|   function notInclude(array, target) {
 | |
|     var index = -1;
 | |
|     var size = array.length;
 | |
| 
 | |
|     while (++index < size) {
 | |
|       if (array[index] === target) {
 | |
|         return false;
 | |
|       }
 | |
|     }
 | |
|     return true;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {Array} array - The array to iterate over.
 | |
|    * @param {Function} iterator - The function invoked per iteration.
 | |
|    */
 | |
|   function arrayEachSync(array, iterator) {
 | |
|     var index = -1;
 | |
|     var size = array.length;
 | |
| 
 | |
|     while (++index < size) {
 | |
|       iterator(array[index], index);
 | |
|     }
 | |
|     return array;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {Object} object - The object to iterate over.
 | |
|    * @param {Function} iterator - The function invoked per iteration.
 | |
|    * @param {Array} keys
 | |
|    */
 | |
|   function baseEachSync(object, iterator, keys) {
 | |
|     var index = -1;
 | |
|     var size = keys.length;
 | |
| 
 | |
|     while (++index < size) {
 | |
|       var key = keys[index];
 | |
|       iterator(object[key], key);
 | |
|     }
 | |
|     return object;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {number} n
 | |
|    * @param {Function} iterator
 | |
|    */
 | |
|   function timesSync(n, iterator) {
 | |
|     var index = -1;
 | |
|     while (++index < n) {
 | |
|       iterator(index);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {Array} array
 | |
|    * @param {number[]} criteria
 | |
|    */
 | |
|   function sortByCriteria(array, criteria) {
 | |
|     var l = array.length;
 | |
|     var indices = Array(l);
 | |
|     var i;
 | |
|     for (i = 0; i < l; i++) {
 | |
|       indices[i] = i;
 | |
|     }
 | |
|     quickSort(criteria, 0, l - 1, indices);
 | |
|     var result = Array(l);
 | |
|     for (var n = 0; n < l; n++) {
 | |
|       i = indices[n];
 | |
|       result[n] = i === undefined ? array[n] : array[i];
 | |
|     }
 | |
|     return result;
 | |
|   }
 | |
| 
 | |
|   function partition(array, i, j, mid, indices) {
 | |
|     var l = i;
 | |
|     var r = j;
 | |
|     while (l <= r) {
 | |
|       i = l;
 | |
|       while (l < r && array[l] < mid) {
 | |
|         l++;
 | |
|       }
 | |
|       while (r >= i && array[r] >= mid) {
 | |
|         r--;
 | |
|       }
 | |
|       if (l > r) {
 | |
|         break;
 | |
|       }
 | |
|       swap(array, indices, l++, r--);
 | |
|     }
 | |
|     return l;
 | |
|   }
 | |
| 
 | |
|   function swap(array, indices, l, r) {
 | |
|     var n = array[l];
 | |
|     array[l] = array[r];
 | |
|     array[r] = n;
 | |
|     var i = indices[l];
 | |
|     indices[l] = indices[r];
 | |
|     indices[r] = i;
 | |
|   }
 | |
| 
 | |
|   function quickSort(array, i, j, indices) {
 | |
|     if (i === j) {
 | |
|       return;
 | |
|     }
 | |
|     var k = i;
 | |
|     while (++k <= j && array[i] === array[k]) {
 | |
|       var l = k - 1;
 | |
|       if (indices[l] > indices[k]) {
 | |
|         var index = indices[l];
 | |
|         indices[l] = indices[k];
 | |
|         indices[k] = index;
 | |
|       }
 | |
|     }
 | |
|     if (k > j) {
 | |
|       return;
 | |
|     }
 | |
|     var p = array[i] > array[k] ? i : k;
 | |
|     k = partition(array, i, j, array[p], indices);
 | |
|     quickSort(array, i, k - 1, indices);
 | |
|     quickSort(array, k, j, indices);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @Private
 | |
|    */
 | |
|   function makeConcatResult(array) {
 | |
|     var result = [];
 | |
|     arrayEachSync(array, function(value) {
 | |
|       if (value === noop) {
 | |
|         return;
 | |
|       }
 | |
|       if (isArray(value)) {
 | |
|         nativePush.apply(result, value);
 | |
|       } else {
 | |
|         result.push(value);
 | |
|       }
 | |
|     });
 | |
|     return result;
 | |
|   }
 | |
| 
 | |
|   /* async functions */
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function arrayEach(array, iterator, callback) {
 | |
|     var index = -1;
 | |
|     var size = array.length;
 | |
| 
 | |
|     if (iterator.length === 3) {
 | |
|       while (++index < size) {
 | |
|         iterator(array[index], index, onlyOnce(callback));
 | |
|       }
 | |
|     } else {
 | |
|       while (++index < size) {
 | |
|         iterator(array[index], onlyOnce(callback));
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function baseEach(object, iterator, callback, keys) {
 | |
|     var key;
 | |
|     var index = -1;
 | |
|     var size = keys.length;
 | |
| 
 | |
|     if (iterator.length === 3) {
 | |
|       while (++index < size) {
 | |
|         key = keys[index];
 | |
|         iterator(object[key], key, onlyOnce(callback));
 | |
|       }
 | |
|     } else {
 | |
|       while (++index < size) {
 | |
|         iterator(object[keys[index]], onlyOnce(callback));
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function symbolEach(collection, iterator, callback) {
 | |
|     var iter = collection[iteratorSymbol]();
 | |
|     var index = 0;
 | |
|     var item;
 | |
|     if (iterator.length === 3) {
 | |
|       while ((item = iter.next()).done === false) {
 | |
|         iterator(item.value, index++, onlyOnce(callback));
 | |
|       }
 | |
|     } else {
 | |
|       while ((item = iter.next()).done === false) {
 | |
|         index++;
 | |
|         iterator(item.value, onlyOnce(callback));
 | |
|       }
 | |
|     }
 | |
|     return index;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function arrayEachResult(array, result, iterator, callback) {
 | |
|     var index = -1;
 | |
|     var size = array.length;
 | |
| 
 | |
|     if (iterator.length === 4) {
 | |
|       while (++index < size) {
 | |
|         iterator(result, array[index], index, onlyOnce(callback));
 | |
|       }
 | |
|     } else {
 | |
|       while (++index < size) {
 | |
|         iterator(result, array[index], onlyOnce(callback));
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function baseEachResult(object, result, iterator, callback, keys) {
 | |
|     var key;
 | |
|     var index = -1;
 | |
|     var size = keys.length;
 | |
| 
 | |
|     if (iterator.length === 4) {
 | |
|       while (++index < size) {
 | |
|         key = keys[index];
 | |
|         iterator(result, object[key], key, onlyOnce(callback));
 | |
|       }
 | |
|     } else {
 | |
|       while (++index < size) {
 | |
|         iterator(result, object[keys[index]], onlyOnce(callback));
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function symbolEachResult(collection, result, iterator, callback) {
 | |
|     var item;
 | |
|     var index = 0;
 | |
|     var iter = collection[iteratorSymbol]();
 | |
| 
 | |
|     if (iterator.length === 4) {
 | |
|       while ((item = iter.next()).done === false) {
 | |
|         iterator(result, item.value, index++, onlyOnce(callback));
 | |
|       }
 | |
|     } else {
 | |
|       while ((item = iter.next()).done === false) {
 | |
|         index++;
 | |
|         iterator(result, item.value, onlyOnce(callback));
 | |
|       }
 | |
|     }
 | |
|     return index;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function arrayEachFunc(array, createCallback) {
 | |
|     var index = -1;
 | |
|     var size = array.length;
 | |
| 
 | |
|     while (++index < size) {
 | |
|       array[index](createCallback(index));
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function baseEachFunc(object, createCallback, keys) {
 | |
|     var key;
 | |
|     var index = -1;
 | |
|     var size = keys.length;
 | |
| 
 | |
|     while (++index < size) {
 | |
|       key = keys[index];
 | |
|       object[key](createCallback(key));
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function arrayEachIndex(array, iterator, createCallback) {
 | |
|     var index = -1;
 | |
|     var size = array.length;
 | |
| 
 | |
|     if (iterator.length === 3) {
 | |
|       while (++index < size) {
 | |
|         iterator(array[index], index, createCallback(index));
 | |
|       }
 | |
|     } else {
 | |
|       while (++index < size) {
 | |
|         iterator(array[index], createCallback(index));
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function baseEachIndex(object, iterator, createCallback, keys) {
 | |
|     var key;
 | |
|     var index = -1;
 | |
|     var size = keys.length;
 | |
| 
 | |
|     if (iterator.length === 3) {
 | |
|       while (++index < size) {
 | |
|         key = keys[index];
 | |
|         iterator(object[key], key, createCallback(index));
 | |
|       }
 | |
|     } else {
 | |
|       while (++index < size) {
 | |
|         iterator(object[keys[index]], createCallback(index));
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function symbolEachIndex(collection, iterator, createCallback) {
 | |
|     var item;
 | |
|     var index = 0;
 | |
|     var iter = collection[iteratorSymbol]();
 | |
| 
 | |
|     if (iterator.length === 3) {
 | |
|       while ((item = iter.next()).done === false) {
 | |
|         iterator(item.value, index, createCallback(index++));
 | |
|       }
 | |
|     } else {
 | |
|       while ((item = iter.next()).done === false) {
 | |
|         iterator(item.value, createCallback(index++));
 | |
|       }
 | |
|     }
 | |
|     return index;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function baseEachKey(object, iterator, createCallback, keys) {
 | |
|     var key;
 | |
|     var index = -1;
 | |
|     var size = keys.length;
 | |
| 
 | |
|     if (iterator.length === 3) {
 | |
|       while (++index < size) {
 | |
|         key = keys[index];
 | |
|         iterator(object[key], key, createCallback(key));
 | |
|       }
 | |
|     } else {
 | |
|       while (++index < size) {
 | |
|         key = keys[index];
 | |
|         iterator(object[key], createCallback(key));
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function symbolEachKey(collection, iterator, createCallback) {
 | |
|     var item;
 | |
|     var index = 0;
 | |
|     var iter = collection[iteratorSymbol]();
 | |
| 
 | |
|     if (iterator.length === 3) {
 | |
|       while ((item = iter.next()).done === false) {
 | |
|         iterator(item.value, index, createCallback(index++));
 | |
|       }
 | |
|     } else {
 | |
|       while ((item = iter.next()).done === false) {
 | |
|         iterator(item.value, createCallback(index++));
 | |
|       }
 | |
|     }
 | |
|     return index;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function arrayEachValue(array, iterator, createCallback) {
 | |
|     var value;
 | |
|     var index = -1;
 | |
|     var size = array.length;
 | |
| 
 | |
|     if (iterator.length === 3) {
 | |
|       while (++index < size) {
 | |
|         value = array[index];
 | |
|         iterator(value, index, createCallback(value));
 | |
|       }
 | |
|     } else {
 | |
|       while (++index < size) {
 | |
|         value = array[index];
 | |
|         iterator(value, createCallback(value));
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function baseEachValue(object, iterator, createCallback, keys) {
 | |
|     var key, value;
 | |
|     var index = -1;
 | |
|     var size = keys.length;
 | |
| 
 | |
|     if (iterator.length === 3) {
 | |
|       while (++index < size) {
 | |
|         key = keys[index];
 | |
|         value = object[key];
 | |
|         iterator(value, key, createCallback(value));
 | |
|       }
 | |
|     } else {
 | |
|       while (++index < size) {
 | |
|         value = object[keys[index]];
 | |
|         iterator(value, createCallback(value));
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function symbolEachValue(collection, iterator, createCallback) {
 | |
|     var value, item;
 | |
|     var index = 0;
 | |
|     var iter = collection[iteratorSymbol]();
 | |
| 
 | |
|     if (iterator.length === 3) {
 | |
|       while ((item = iter.next()).done === false) {
 | |
|         value = item.value;
 | |
|         iterator(value, index++, createCallback(value));
 | |
|       }
 | |
|     } else {
 | |
|       while ((item = iter.next()).done === false) {
 | |
|         index++;
 | |
|         value = item.value;
 | |
|         iterator(value, createCallback(value));
 | |
|       }
 | |
|     }
 | |
|     return index;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function arrayEachIndexValue(array, iterator, createCallback) {
 | |
|     var value;
 | |
|     var index = -1;
 | |
|     var size = array.length;
 | |
| 
 | |
|     if (iterator.length === 3) {
 | |
|       while (++index < size) {
 | |
|         value = array[index];
 | |
|         iterator(value, index, createCallback(index, value));
 | |
|       }
 | |
|     } else {
 | |
|       while (++index < size) {
 | |
|         value = array[index];
 | |
|         iterator(value, createCallback(index, value));
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function baseEachIndexValue(object, iterator, createCallback, keys) {
 | |
|     var key, value;
 | |
|     var index = -1;
 | |
|     var size = keys.length;
 | |
| 
 | |
|     if (iterator.length === 3) {
 | |
|       while (++index < size) {
 | |
|         key = keys[index];
 | |
|         value = object[key];
 | |
|         iterator(value, key, createCallback(index, value));
 | |
|       }
 | |
|     } else {
 | |
|       while (++index < size) {
 | |
|         value = object[keys[index]];
 | |
|         iterator(value, createCallback(index, value));
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function symbolEachIndexValue(collection, iterator, createCallback) {
 | |
|     var value, item;
 | |
|     var index = 0;
 | |
|     var iter = collection[iteratorSymbol]();
 | |
| 
 | |
|     if (iterator.length === 3) {
 | |
|       while ((item = iter.next()).done === false) {
 | |
|         value = item.value;
 | |
|         iterator(value, index, createCallback(index++, value));
 | |
|       }
 | |
|     } else {
 | |
|       while ((item = iter.next()).done === false) {
 | |
|         value = item.value;
 | |
|         iterator(value, createCallback(index++, value));
 | |
|       }
 | |
|     }
 | |
|     return index;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function baseEachKeyValue(object, iterator, createCallback, keys) {
 | |
|     var key, value;
 | |
|     var index = -1;
 | |
|     var size = keys.length;
 | |
| 
 | |
|     if (iterator.length === 3) {
 | |
|       while (++index < size) {
 | |
|         key = keys[index];
 | |
|         value = object[key];
 | |
|         iterator(value, key, createCallback(key, value));
 | |
|       }
 | |
|     } else {
 | |
|       while (++index < size) {
 | |
|         key = keys[index];
 | |
|         value = object[key];
 | |
|         iterator(value, createCallback(key, value));
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function symbolEachKeyValue(collection, iterator, createCallback) {
 | |
|     var value, item;
 | |
|     var index = 0;
 | |
|     var iter = collection[iteratorSymbol]();
 | |
| 
 | |
|     if (iterator.length === 3) {
 | |
|       while ((item = iter.next()).done === false) {
 | |
|         value = item.value;
 | |
|         iterator(value, index, createCallback(index++, value));
 | |
|       }
 | |
|     } else {
 | |
|       while ((item = iter.next()).done === false) {
 | |
|         value = item.value;
 | |
|         iterator(value, createCallback(index++, value));
 | |
|       }
 | |
|     }
 | |
|     return index;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {Function} func
 | |
|    */
 | |
|   function onlyOnce(func) {
 | |
|     return function(err, res) {
 | |
|       var fn = func;
 | |
|       func = throwError;
 | |
|       fn(err, res);
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {Function} func
 | |
|    */
 | |
|   function once(func) {
 | |
|     return function(err, res) {
 | |
|       var fn = func;
 | |
|       func = noop;
 | |
|       fn(err, res);
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {Function} arrayEach
 | |
|    * @param {Function} baseEach
 | |
|    */
 | |
|   function createEach(arrayEach, baseEach, symbolEach) {
 | |
|     return function each(collection, iterator, callback) {
 | |
|       callback = once(callback || noop);
 | |
|       var size, keys;
 | |
|       var completed = 0;
 | |
|       if (isArray(collection)) {
 | |
|         size = collection.length;
 | |
|         arrayEach(collection, iterator, done);
 | |
|       } else if (!collection) {
 | |
|       } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|         size = symbolEach(collection, iterator, done);
 | |
|         size && size === completed && callback(null);
 | |
|       } else if (typeof collection === obj) {
 | |
|         keys = nativeKeys(collection);
 | |
|         size = keys.length;
 | |
|         baseEach(collection, iterator, done, keys);
 | |
|       }
 | |
|       if (!size) {
 | |
|         callback(null);
 | |
|       }
 | |
| 
 | |
|       function done(err, bool) {
 | |
|         if (err) {
 | |
|           callback = once(callback);
 | |
|           callback(err);
 | |
|         } else if (++completed === size) {
 | |
|           callback(null);
 | |
|         } else if (bool === false) {
 | |
|           callback = once(callback);
 | |
|           callback(null);
 | |
|         }
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {Function} arrayEach
 | |
|    * @param {Function} baseEach
 | |
|    * @param {Function} symbolEach
 | |
|    */
 | |
|   function createMap(arrayEach, baseEach, symbolEach, useArray) {
 | |
|     var init, clone;
 | |
|     if (useArray) {
 | |
|       init = Array;
 | |
|       clone = createArray;
 | |
|     } else {
 | |
|       init = function() {
 | |
|         return {};
 | |
|       };
 | |
|       clone = objectClone;
 | |
|     }
 | |
| 
 | |
|     return function(collection, iterator, callback) {
 | |
|       callback = callback || noop;
 | |
|       var size, keys, result;
 | |
|       var completed = 0;
 | |
| 
 | |
|       if (isArray(collection)) {
 | |
|         size = collection.length;
 | |
|         result = init(size);
 | |
|         arrayEach(collection, iterator, createCallback);
 | |
|       } else if (!collection) {
 | |
|       } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|         // TODO: size could be changed
 | |
|         result = init(0);
 | |
|         size = symbolEach(collection, iterator, createCallback);
 | |
|         size && size === completed && callback(null, result);
 | |
|       } else if (typeof collection === obj) {
 | |
|         keys = nativeKeys(collection);
 | |
|         size = keys.length;
 | |
|         result = init(size);
 | |
|         baseEach(collection, iterator, createCallback, keys);
 | |
|       }
 | |
|       if (!size) {
 | |
|         callback(null, init());
 | |
|       }
 | |
| 
 | |
|       function createCallback(key) {
 | |
|         return function done(err, res) {
 | |
|           if (key === null) {
 | |
|             throwError();
 | |
|           }
 | |
|           if (err) {
 | |
|             key = null;
 | |
|             callback = once(callback);
 | |
|             callback(err, clone(result));
 | |
|             return;
 | |
|           }
 | |
|           result[key] = res;
 | |
|           key = null;
 | |
|           if (++completed === size) {
 | |
|             callback(null, result);
 | |
|           }
 | |
|         };
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {Function} arrayEach
 | |
|    * @param {Function} baseEach
 | |
|    * @param {Function} symbolEach
 | |
|    * @param {boolean} bool
 | |
|    */
 | |
|   function createFilter(arrayEach, baseEach, symbolEach, bool) {
 | |
|     return function(collection, iterator, callback) {
 | |
|       callback = callback || noop;
 | |
|       var size, keys, result;
 | |
|       var completed = 0;
 | |
| 
 | |
|       if (isArray(collection)) {
 | |
|         size = collection.length;
 | |
|         result = Array(size);
 | |
|         arrayEach(collection, iterator, createCallback);
 | |
|       } else if (!collection) {
 | |
|       } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|         result = [];
 | |
|         size = symbolEach(collection, iterator, createCallback);
 | |
|         size && size === completed && callback(null, compact(result));
 | |
|       } else if (typeof collection === obj) {
 | |
|         keys = nativeKeys(collection);
 | |
|         size = keys.length;
 | |
|         result = Array(size);
 | |
|         baseEach(collection, iterator, createCallback, keys);
 | |
|       }
 | |
|       if (!size) {
 | |
|         return callback(null, []);
 | |
|       }
 | |
| 
 | |
|       function createCallback(index, value) {
 | |
|         return function done(err, res) {
 | |
|           if (index === null) {
 | |
|             throwError();
 | |
|           }
 | |
|           if (err) {
 | |
|             index = null;
 | |
|             callback = once(callback);
 | |
|             callback(err);
 | |
|             return;
 | |
|           }
 | |
|           if (!!res === bool) {
 | |
|             result[index] = value;
 | |
|           }
 | |
|           index = null;
 | |
|           if (++completed === size) {
 | |
|             callback(null, compact(result));
 | |
|           }
 | |
|         };
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {boolean} bool
 | |
|    */
 | |
|   function createFilterSeries(bool) {
 | |
|     return function(collection, iterator, callback) {
 | |
|       callback = onlyOnce(callback || noop);
 | |
|       var size, key, value, keys, iter, item, iterate;
 | |
|       var sync = false;
 | |
|       var completed = 0;
 | |
|       var result = [];
 | |
| 
 | |
|       if (isArray(collection)) {
 | |
|         size = collection.length;
 | |
|         iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator;
 | |
|       } else if (!collection) {
 | |
|       } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|         size = Infinity;
 | |
|         iter = collection[iteratorSymbol]();
 | |
|         iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator;
 | |
|       } else if (typeof collection === obj) {
 | |
|         keys = nativeKeys(collection);
 | |
|         size = keys.length;
 | |
|         iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator;
 | |
|       }
 | |
|       if (!size) {
 | |
|         return callback(null, []);
 | |
|       }
 | |
|       iterate();
 | |
| 
 | |
|       function arrayIterator() {
 | |
|         value = collection[completed];
 | |
|         iterator(value, done);
 | |
|       }
 | |
| 
 | |
|       function arrayIteratorWithIndex() {
 | |
|         value = collection[completed];
 | |
|         iterator(value, completed, done);
 | |
|       }
 | |
| 
 | |
|       function symbolIterator() {
 | |
|         item = iter.next();
 | |
|         value = item.value;
 | |
|         item.done ? callback(null, result) : iterator(value, done);
 | |
|       }
 | |
| 
 | |
|       function symbolIteratorWithKey() {
 | |
|         item = iter.next();
 | |
|         value = item.value;
 | |
|         item.done ? callback(null, result) : iterator(value, completed, done);
 | |
|       }
 | |
| 
 | |
|       function objectIterator() {
 | |
|         key = keys[completed];
 | |
|         value = collection[key];
 | |
|         iterator(value, done);
 | |
|       }
 | |
| 
 | |
|       function objectIteratorWithKey() {
 | |
|         key = keys[completed];
 | |
|         value = collection[key];
 | |
|         iterator(value, key, done);
 | |
|       }
 | |
| 
 | |
|       function done(err, res) {
 | |
|         if (err) {
 | |
|           callback(err);
 | |
|           return;
 | |
|         }
 | |
|         if (!!res === bool) {
 | |
|           result[result.length] = value;
 | |
|         }
 | |
|         if (++completed === size) {
 | |
|           iterate = throwError;
 | |
|           callback(null, result);
 | |
|         } else if (sync) {
 | |
|           nextTick(iterate);
 | |
|         } else {
 | |
|           sync = true;
 | |
|           iterate();
 | |
|         }
 | |
|         sync = false;
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {boolean} bool
 | |
|    */
 | |
|   function createFilterLimit(bool) {
 | |
|     return function(collection, limit, iterator, callback) {
 | |
|       callback = callback || noop;
 | |
|       var size, index, key, value, keys, iter, item, iterate, result;
 | |
|       var sync = false;
 | |
|       var started = 0;
 | |
|       var completed = 0;
 | |
| 
 | |
|       if (isArray(collection)) {
 | |
|         size = collection.length;
 | |
|         iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator;
 | |
|       } else if (!collection) {
 | |
|       } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|         size = Infinity;
 | |
|         result = [];
 | |
|         iter = collection[iteratorSymbol]();
 | |
|         iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator;
 | |
|       } else if (typeof collection === obj) {
 | |
|         keys = nativeKeys(collection);
 | |
|         size = keys.length;
 | |
|         iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator;
 | |
|       }
 | |
|       if (!size || isNaN(limit) || limit < 1) {
 | |
|         return callback(null, []);
 | |
|       }
 | |
|       result = result || Array(size);
 | |
|       timesSync(limit > size ? size : limit, iterate);
 | |
| 
 | |
|       function arrayIterator() {
 | |
|         index = started++;
 | |
|         if (index < size) {
 | |
|           value = collection[index];
 | |
|           iterator(value, createCallback(value, index));
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       function arrayIteratorWithIndex() {
 | |
|         index = started++;
 | |
|         if (index < size) {
 | |
|           value = collection[index];
 | |
|           iterator(value, index, createCallback(value, index));
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       function symbolIterator() {
 | |
|         item = iter.next();
 | |
|         if (item.done === false) {
 | |
|           value = item.value;
 | |
|           iterator(value, createCallback(value, started++));
 | |
|         } else if (completed === started && iterator !== noop) {
 | |
|           iterator = noop;
 | |
|           callback(null, compact(result));
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       function symbolIteratorWithKey() {
 | |
|         item = iter.next();
 | |
|         if (item.done === false) {
 | |
|           value = item.value;
 | |
|           iterator(value, started, createCallback(value, started++));
 | |
|         } else if (completed === started && iterator !== noop) {
 | |
|           iterator = noop;
 | |
|           callback(null, compact(result));
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       function objectIterator() {
 | |
|         index = started++;
 | |
|         if (index < size) {
 | |
|           value = collection[keys[index]];
 | |
|           iterator(value, createCallback(value, index));
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       function objectIteratorWithKey() {
 | |
|         index = started++;
 | |
|         if (index < size) {
 | |
|           key = keys[index];
 | |
|           value = collection[key];
 | |
|           iterator(value, key, createCallback(value, index));
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       function createCallback(value, index) {
 | |
|         return function(err, res) {
 | |
|           if (index === null) {
 | |
|             throwError();
 | |
|           }
 | |
|           if (err) {
 | |
|             index = null;
 | |
|             iterate = noop;
 | |
|             callback = once(callback);
 | |
|             callback(err);
 | |
|             return;
 | |
|           }
 | |
|           if (!!res === bool) {
 | |
|             result[index] = value;
 | |
|           }
 | |
|           index = null;
 | |
|           if (++completed === size) {
 | |
|             callback = onlyOnce(callback);
 | |
|             callback(null, compact(result));
 | |
|           } else if (sync) {
 | |
|             nextTick(iterate);
 | |
|           } else {
 | |
|             sync = true;
 | |
|             iterate();
 | |
|           }
 | |
|           sync = false;
 | |
|         };
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace eachSeries
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.eachSeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // undefined
 | |
|    *   console.log(order); // [1, 3, 2]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.eachSeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // undefined
 | |
|    *   console.log(order); // [[1, 0], [3, 1], [2, 2]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.eachSeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // undefined
 | |
|    *   console.log(order); // [1, 3, 2]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.eachSeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // undefined
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'b'], [2, 'b']]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // break
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num !== 3);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.eachSeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // undefined
 | |
|    *   console.log(order); // [1, 3]
 | |
|    * });
 | |
|    */
 | |
|   function eachSeries(collection, iterator, callback) {
 | |
|     callback = onlyOnce(callback || noop);
 | |
|     var size, key, keys, iter, item, iterate;
 | |
|     var sync = false;
 | |
|     var completed = 0;
 | |
| 
 | |
|     if (isArray(collection)) {
 | |
|       size = collection.length;
 | |
|       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator;
 | |
|     } else if (!collection) {
 | |
|     } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|       size = Infinity;
 | |
|       iter = collection[iteratorSymbol]();
 | |
|       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator;
 | |
|     } else if (typeof collection === obj) {
 | |
|       keys = nativeKeys(collection);
 | |
|       size = keys.length;
 | |
|       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator;
 | |
|     }
 | |
|     if (!size) {
 | |
|       return callback(null);
 | |
|     }
 | |
|     iterate();
 | |
| 
 | |
|     function arrayIterator() {
 | |
|       iterator(collection[completed], done);
 | |
|     }
 | |
| 
 | |
|     function arrayIteratorWithIndex() {
 | |
|       iterator(collection[completed], completed, done);
 | |
|     }
 | |
| 
 | |
|     function symbolIterator() {
 | |
|       item = iter.next();
 | |
|       item.done ? callback(null) : iterator(item.value, done);
 | |
|     }
 | |
| 
 | |
|     function symbolIteratorWithKey() {
 | |
|       item = iter.next();
 | |
|       item.done ? callback(null) : iterator(item.value, completed, done);
 | |
|     }
 | |
| 
 | |
|     function objectIterator() {
 | |
|       iterator(collection[keys[completed]], done);
 | |
|     }
 | |
| 
 | |
|     function objectIteratorWithKey() {
 | |
|       key = keys[completed];
 | |
|       iterator(collection[key], key, done);
 | |
|     }
 | |
| 
 | |
|     function done(err, bool) {
 | |
|       if (err) {
 | |
|         callback(err);
 | |
|       } else if (++completed === size || bool === false) {
 | |
|         iterate = throwError;
 | |
|         callback(null);
 | |
|       } else if (sync) {
 | |
|         nextTick(iterate);
 | |
|       } else {
 | |
|         sync = true;
 | |
|         iterate();
 | |
|       }
 | |
|       sync = false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace eachLimit
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {number} limit - limit >= 1
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.eachLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // undefined
 | |
|    *   console.log(order); // [1, 3, 5, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.eachLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // undefined
 | |
|    *   console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.eachLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // undefined
 | |
|    *   console.log(order); // [1, 3, 5, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.eachLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // undefined
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // break
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num !== 5);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.eachLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // undefined
 | |
|    *   console.log(order); // [1, 3, 5]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function eachLimit(collection, limit, iterator, callback) {
 | |
|     callback = callback || noop;
 | |
|     var size, index, key, keys, iter, item, iterate;
 | |
|     var sync = false;
 | |
|     var started = 0;
 | |
|     var completed = 0;
 | |
| 
 | |
|     if (isArray(collection)) {
 | |
|       size = collection.length;
 | |
|       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator;
 | |
|     } else if (!collection) {
 | |
|     } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|       size = Infinity;
 | |
|       iter = collection[iteratorSymbol]();
 | |
|       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator;
 | |
|     } else if (typeof collection === obj) {
 | |
|       keys = nativeKeys(collection);
 | |
|       size = keys.length;
 | |
|       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator;
 | |
|     } else {
 | |
|       return callback(null);
 | |
|     }
 | |
|     if (!size || isNaN(limit) || limit < 1) {
 | |
|       return callback(null);
 | |
|     }
 | |
|     timesSync(limit > size ? size : limit, iterate);
 | |
| 
 | |
|     function arrayIterator() {
 | |
|       if (started < size) {
 | |
|         iterator(collection[started++], done);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function arrayIteratorWithIndex() {
 | |
|       index = started++;
 | |
|       if (index < size) {
 | |
|         iterator(collection[index], index, done);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function symbolIterator() {
 | |
|       item = iter.next();
 | |
|       if (item.done === false) {
 | |
|         started++;
 | |
|         iterator(item.value, done);
 | |
|       } else if (completed === started && iterator !== noop) {
 | |
|         iterator = noop;
 | |
|         callback(null);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function symbolIteratorWithKey() {
 | |
|       item = iter.next();
 | |
|       if (item.done === false) {
 | |
|         iterator(item.value, started++, done);
 | |
|       } else if (completed === started && iterator !== noop) {
 | |
|         iterator = noop;
 | |
|         callback(null);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function objectIterator() {
 | |
|       if (started < size) {
 | |
|         iterator(collection[keys[started++]], done);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function objectIteratorWithKey() {
 | |
|       index = started++;
 | |
|       if (index < size) {
 | |
|         key = keys[index];
 | |
|         iterator(collection[key], key, done);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function done(err, bool) {
 | |
|       if (err || bool === false) {
 | |
|         iterate = noop;
 | |
|         callback = once(callback);
 | |
|         callback(err);
 | |
|       } else if (++completed === size) {
 | |
|         iterator = noop;
 | |
|         iterate = throwError;
 | |
|         callback = onlyOnce(callback);
 | |
|         callback(null);
 | |
|       } else if (sync) {
 | |
|         nextTick(iterate);
 | |
|       } else {
 | |
|         sync = true;
 | |
|         iterate();
 | |
|       }
 | |
|       sync = false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace mapSeries
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.mapSeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3, 2];
 | |
|    *   console.log(order); // [1, 3, 2]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.mapSeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3, 2]
 | |
|    *   console.log(order); // [[1, 0], [3, 1], [2, 2]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.mapSeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3, 2]
 | |
|    *   console.log(order); // [1, 3, 2]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.mapSeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3, 2]
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'b'], [2, 'c']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function mapSeries(collection, iterator, callback) {
 | |
|     callback = callback || noop;
 | |
|     var size, key, keys, iter, item, result, iterate;
 | |
|     var sync = false;
 | |
|     var completed = 0;
 | |
| 
 | |
|     if (isArray(collection)) {
 | |
|       size = collection.length;
 | |
|       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator;
 | |
|     } else if (!collection) {
 | |
|     } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|       size = Infinity;
 | |
|       result = [];
 | |
|       iter = collection[iteratorSymbol]();
 | |
|       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator;
 | |
|     } else if (typeof collection === obj) {
 | |
|       keys = nativeKeys(collection);
 | |
|       size = keys.length;
 | |
|       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator;
 | |
|     }
 | |
|     if (!size) {
 | |
|       return callback(null, []);
 | |
|     }
 | |
|     result = result || Array(size);
 | |
|     iterate();
 | |
| 
 | |
|     function arrayIterator() {
 | |
|       iterator(collection[completed], done);
 | |
|     }
 | |
| 
 | |
|     function arrayIteratorWithIndex() {
 | |
|       iterator(collection[completed], completed, done);
 | |
|     }
 | |
| 
 | |
|     function symbolIterator() {
 | |
|       item = iter.next();
 | |
|       item.done ? callback(null, result) : iterator(item.value, done);
 | |
|     }
 | |
| 
 | |
|     function symbolIteratorWithKey() {
 | |
|       item = iter.next();
 | |
|       item.done ? callback(null, result) : iterator(item.value, completed, done);
 | |
|     }
 | |
| 
 | |
|     function objectIterator() {
 | |
|       iterator(collection[keys[completed]], done);
 | |
|     }
 | |
| 
 | |
|     function objectIteratorWithKey() {
 | |
|       key = keys[completed];
 | |
|       iterator(collection[key], key, done);
 | |
|     }
 | |
| 
 | |
|     function done(err, res) {
 | |
|       if (err) {
 | |
|         iterate = throwError;
 | |
|         callback = onlyOnce(callback);
 | |
|         callback(err, createArray(result));
 | |
|         return;
 | |
|       }
 | |
|       result[completed] = res;
 | |
|       if (++completed === size) {
 | |
|         iterate = throwError;
 | |
|         callback(null, result);
 | |
|         callback = throwError;
 | |
|       } else if (sync) {
 | |
|         nextTick(iterate);
 | |
|       } else {
 | |
|         sync = true;
 | |
|         iterate();
 | |
|       }
 | |
|       sync = false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace mapLimit
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {number} limit - limit >= 1
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.mapLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 5, 3, 4, 2]
 | |
|    *   console.log(order); // [1, 3, 5, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.mapLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 5, 3, 4, 2]
 | |
|    *   console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.mapLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 5, 3, 4, 2]
 | |
|    *   console.log(order); // [1, 3, 5, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.mapLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 5, 3, 4, 2]
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function mapLimit(collection, limit, iterator, callback) {
 | |
|     callback = callback || noop;
 | |
|     var size, index, key, keys, iter, item, result, iterate;
 | |
|     var sync = false;
 | |
|     var started = 0;
 | |
|     var completed = 0;
 | |
| 
 | |
|     if (isArray(collection)) {
 | |
|       size = collection.length;
 | |
|       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator;
 | |
|     } else if (!collection) {
 | |
|     } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|       size = Infinity;
 | |
|       result = [];
 | |
|       iter = collection[iteratorSymbol]();
 | |
|       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator;
 | |
|     } else if (typeof collection === obj) {
 | |
|       keys = nativeKeys(collection);
 | |
|       size = keys.length;
 | |
|       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator;
 | |
|     }
 | |
|     if (!size || isNaN(limit) || limit < 1) {
 | |
|       return callback(null, []);
 | |
|     }
 | |
|     result = result || Array(size);
 | |
|     timesSync(limit > size ? size : limit, iterate);
 | |
| 
 | |
|     function arrayIterator() {
 | |
|       index = started++;
 | |
|       if (index < size) {
 | |
|         iterator(collection[index], createCallback(index));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function arrayIteratorWithIndex() {
 | |
|       index = started++;
 | |
|       if (index < size) {
 | |
|         iterator(collection[index], index, createCallback(index));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function symbolIterator() {
 | |
|       item = iter.next();
 | |
|       if (item.done === false) {
 | |
|         iterator(item.value, createCallback(started++));
 | |
|       } else if (completed === started && iterator !== noop) {
 | |
|         iterator = noop;
 | |
|         callback(null, result);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function symbolIteratorWithKey() {
 | |
|       item = iter.next();
 | |
|       if (item.done === false) {
 | |
|         iterator(item.value, started, createCallback(started++));
 | |
|       } else if (completed === started && iterator !== noop) {
 | |
|         iterator = noop;
 | |
|         callback(null, result);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function objectIterator() {
 | |
|       index = started++;
 | |
|       if (index < size) {
 | |
|         iterator(collection[keys[index]], createCallback(index));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function objectIteratorWithKey() {
 | |
|       index = started++;
 | |
|       if (index < size) {
 | |
|         key = keys[index];
 | |
|         iterator(collection[key], key, createCallback(index));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function createCallback(index) {
 | |
|       return function(err, res) {
 | |
|         if (index === null) {
 | |
|           throwError();
 | |
|         }
 | |
|         if (err) {
 | |
|           index = null;
 | |
|           iterate = noop;
 | |
|           callback = once(callback);
 | |
|           callback(err, createArray(result));
 | |
|           return;
 | |
|         }
 | |
|         result[index] = res;
 | |
|         index = null;
 | |
|         if (++completed === size) {
 | |
|           iterate = throwError;
 | |
|           callback(null, result);
 | |
|           callback = throwError;
 | |
|         } else if (sync) {
 | |
|           nextTick(iterate);
 | |
|         } else {
 | |
|           sync = true;
 | |
|           iterate();
 | |
|         }
 | |
|         sync = false;
 | |
|       };
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace mapValuesSeries
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.mapValuesSeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '0': 1, '1': 3, '2': 2 }
 | |
|    *   console.log(order); // [1, 3, 2]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.mapValuesSeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '0': 1, '1': 3, '2': 2 }
 | |
|    *   console.log(order); // [[1, 0], [3, 1], [2, 2]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.mapValuesSeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // { a: 1, b: 3, c: 2 }
 | |
|    *   console.log(order); // [1, 3, 2]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.mapValuesSeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // { a: 1, b: 3, c: 2 }
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'b'], [2, 'c']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function mapValuesSeries(collection, iterator, callback) {
 | |
|     callback = callback || noop;
 | |
|     var size, key, keys, iter, item, iterate;
 | |
|     var sync = false;
 | |
|     var result = {};
 | |
|     var completed = 0;
 | |
| 
 | |
|     if (isArray(collection)) {
 | |
|       size = collection.length;
 | |
|       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator;
 | |
|     } else if (!collection) {
 | |
|     } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|       size = Infinity;
 | |
|       iter = collection[iteratorSymbol]();
 | |
|       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator;
 | |
|     } else if (typeof collection === obj) {
 | |
|       keys = nativeKeys(collection);
 | |
|       size = keys.length;
 | |
|       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator;
 | |
|     }
 | |
|     if (!size) {
 | |
|       return callback(null, result);
 | |
|     }
 | |
|     iterate();
 | |
| 
 | |
|     function arrayIterator() {
 | |
|       key = completed;
 | |
|       iterator(collection[completed], done);
 | |
|     }
 | |
| 
 | |
|     function arrayIteratorWithIndex() {
 | |
|       key = completed;
 | |
|       iterator(collection[completed], completed, done);
 | |
|     }
 | |
| 
 | |
|     function symbolIterator() {
 | |
|       key = completed;
 | |
|       item = iter.next();
 | |
|       item.done ? callback(null, result) : iterator(item.value, done);
 | |
|     }
 | |
| 
 | |
|     function symbolIteratorWithKey() {
 | |
|       key = completed;
 | |
|       item = iter.next();
 | |
|       item.done ? callback(null, result) : iterator(item.value, completed, done);
 | |
|     }
 | |
| 
 | |
|     function objectIterator() {
 | |
|       key = keys[completed];
 | |
|       iterator(collection[key], done);
 | |
|     }
 | |
| 
 | |
|     function objectIteratorWithKey() {
 | |
|       key = keys[completed];
 | |
|       iterator(collection[key], key, done);
 | |
|     }
 | |
| 
 | |
|     function done(err, res) {
 | |
|       if (err) {
 | |
|         iterate = throwError;
 | |
|         callback = onlyOnce(callback);
 | |
|         callback(err, objectClone(result));
 | |
|         return;
 | |
|       }
 | |
|       result[key] = res;
 | |
|       if (++completed === size) {
 | |
|         iterate = throwError;
 | |
|         callback(null, result);
 | |
|         callback = throwError;
 | |
|       } else if (sync) {
 | |
|         nextTick(iterate);
 | |
|       } else {
 | |
|         sync = true;
 | |
|         iterate();
 | |
|       }
 | |
|       sync = false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace mapValuesLimit
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {number} limit - limit >= 1
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.mapValuesLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '0': 1, '1': 5, '2': 3, '3': 4, '4': 2 }
 | |
|    *   console.log(order); // [1, 3, 5, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.mapValuesLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '0': 1, '1': 5, '2': 3, '3': 4, '4': 2 }
 | |
|    *   console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.mapValuesLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // { a: 1, b: 5, c: 3, d: 4, e: 2 }
 | |
|    *   console.log(order); // [1, 3, 5, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.mapValuesLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // { a: 1, b: 5, c: 3, d: 4, e: 2 }
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function mapValuesLimit(collection, limit, iterator, callback) {
 | |
|     callback = callback || noop;
 | |
|     var size, index, key, keys, iter, item, iterate;
 | |
|     var sync = false;
 | |
|     var result = {};
 | |
|     var started = 0;
 | |
|     var completed = 0;
 | |
| 
 | |
|     if (isArray(collection)) {
 | |
|       size = collection.length;
 | |
|       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator;
 | |
|     } else if (!collection) {
 | |
|     } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|       size = Infinity;
 | |
|       iter = collection[iteratorSymbol]();
 | |
|       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator;
 | |
|     } else if (typeof collection === obj) {
 | |
|       keys = nativeKeys(collection);
 | |
|       size = keys.length;
 | |
|       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator;
 | |
|     }
 | |
|     if (!size || isNaN(limit) || limit < 1) {
 | |
|       return callback(null, result);
 | |
|     }
 | |
|     timesSync(limit > size ? size : limit, iterate);
 | |
| 
 | |
|     function arrayIterator() {
 | |
|       index = started++;
 | |
|       if (index < size) {
 | |
|         iterator(collection[index], createCallback(index));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function arrayIteratorWithIndex() {
 | |
|       index = started++;
 | |
|       if (index < size) {
 | |
|         iterator(collection[index], index, createCallback(index));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function symbolIterator() {
 | |
|       item = iter.next();
 | |
|       if (item.done === false) {
 | |
|         iterator(item.value, createCallback(started++));
 | |
|       } else if (completed === started && iterator !== noop) {
 | |
|         iterator = noop;
 | |
|         callback(null, result);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function symbolIteratorWithKey() {
 | |
|       item = iter.next();
 | |
|       if (item.done === false) {
 | |
|         iterator(item.value, started, createCallback(started++));
 | |
|       } else if (completed === started && iterator !== noop) {
 | |
|         iterator = noop;
 | |
|         callback(null, result);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function objectIterator() {
 | |
|       index = started++;
 | |
|       if (index < size) {
 | |
|         key = keys[index];
 | |
|         iterator(collection[key], createCallback(key));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function objectIteratorWithKey() {
 | |
|       index = started++;
 | |
|       if (index < size) {
 | |
|         key = keys[index];
 | |
|         iterator(collection[key], key, createCallback(key));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function createCallback(key) {
 | |
|       return function(err, res) {
 | |
|         if (key === null) {
 | |
|           throwError();
 | |
|         }
 | |
|         if (err) {
 | |
|           key = null;
 | |
|           iterate = noop;
 | |
|           callback = once(callback);
 | |
|           callback(err, objectClone(result));
 | |
|           return;
 | |
|         }
 | |
|         result[key] = res;
 | |
|         key = null;
 | |
|         if (++completed === size) {
 | |
|           callback(null, result);
 | |
|         } else if (sync) {
 | |
|           nextTick(iterate);
 | |
|         } else {
 | |
|           sync = true;
 | |
|           iterate();
 | |
|         }
 | |
|         sync = false;
 | |
|       };
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {Function} arrayEach
 | |
|    * @param {Function} baseEach
 | |
|    * @param {Function} symbolEach
 | |
|    * @param {boolean} bool
 | |
|    */
 | |
|   function createDetect(arrayEach, baseEach, symbolEach, bool) {
 | |
|     return function(collection, iterator, callback) {
 | |
|       callback = callback || noop;
 | |
|       var size, keys;
 | |
|       var completed = 0;
 | |
| 
 | |
|       if (isArray(collection)) {
 | |
|         size = collection.length;
 | |
|         arrayEach(collection, iterator, createCallback);
 | |
|       } else if (!collection) {
 | |
|       } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|         size = symbolEach(collection, iterator, createCallback);
 | |
|         size && size === completed && callback(null);
 | |
|       } else if (typeof collection === obj) {
 | |
|         keys = nativeKeys(collection);
 | |
|         size = keys.length;
 | |
|         baseEach(collection, iterator, createCallback, keys);
 | |
|       }
 | |
|       if (!size) {
 | |
|         callback(null);
 | |
|       }
 | |
| 
 | |
|       function createCallback(value) {
 | |
|         var called = false;
 | |
|         return function done(err, res) {
 | |
|           if (called) {
 | |
|             throwError();
 | |
|           }
 | |
|           called = true;
 | |
|           if (err) {
 | |
|             callback = once(callback);
 | |
|             callback(err);
 | |
|           } else if (!!res === bool) {
 | |
|             callback = once(callback);
 | |
|             callback(null, value);
 | |
|           } else if (++completed === size) {
 | |
|             callback(null);
 | |
|           }
 | |
|         };
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {boolean} bool
 | |
|    */
 | |
|   function createDetectSeries(bool) {
 | |
|     return function(collection, iterator, callback) {
 | |
|       callback = onlyOnce(callback || noop);
 | |
|       var size, key, value, keys, iter, item, iterate;
 | |
|       var sync = false;
 | |
|       var completed = 0;
 | |
| 
 | |
|       if (isArray(collection)) {
 | |
|         size = collection.length;
 | |
|         iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator;
 | |
|       } else if (!collection) {
 | |
|       } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|         size = Infinity;
 | |
|         iter = collection[iteratorSymbol]();
 | |
|         iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator;
 | |
|       } else if (typeof collection === obj) {
 | |
|         keys = nativeKeys(collection);
 | |
|         size = keys.length;
 | |
|         iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator;
 | |
|       }
 | |
|       if (!size) {
 | |
|         return callback(null);
 | |
|       }
 | |
|       iterate();
 | |
| 
 | |
|       function arrayIterator() {
 | |
|         value = collection[completed];
 | |
|         iterator(value, done);
 | |
|       }
 | |
| 
 | |
|       function arrayIteratorWithIndex() {
 | |
|         value = collection[completed];
 | |
|         iterator(value, completed, done);
 | |
|       }
 | |
| 
 | |
|       function symbolIterator() {
 | |
|         item = iter.next();
 | |
|         value = item.value;
 | |
|         item.done ? callback(null) : iterator(value, done);
 | |
|       }
 | |
| 
 | |
|       function symbolIteratorWithKey() {
 | |
|         item = iter.next();
 | |
|         value = item.value;
 | |
|         item.done ? callback(null) : iterator(value, completed, done);
 | |
|       }
 | |
| 
 | |
|       function objectIterator() {
 | |
|         value = collection[keys[completed]];
 | |
|         iterator(value, done);
 | |
|       }
 | |
| 
 | |
|       function objectIteratorWithKey() {
 | |
|         key = keys[completed];
 | |
|         value = collection[key];
 | |
|         iterator(value, key, done);
 | |
|       }
 | |
| 
 | |
|       function done(err, res) {
 | |
|         if (err) {
 | |
|           callback(err);
 | |
|         } else if (!!res === bool) {
 | |
|           iterate = throwError;
 | |
|           callback(null, value);
 | |
|         } else if (++completed === size) {
 | |
|           iterate = throwError;
 | |
|           callback(null);
 | |
|         } else if (sync) {
 | |
|           nextTick(iterate);
 | |
|         } else {
 | |
|           sync = true;
 | |
|           iterate();
 | |
|         }
 | |
|         sync = false;
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {boolean} bool
 | |
|    */
 | |
|   function createDetectLimit(bool) {
 | |
|     return function(collection, limit, iterator, callback) {
 | |
|       callback = callback || noop;
 | |
|       var size, index, key, value, keys, iter, item, iterate;
 | |
|       var sync = false;
 | |
|       var started = 0;
 | |
|       var completed = 0;
 | |
| 
 | |
|       if (isArray(collection)) {
 | |
|         size = collection.length;
 | |
|         iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator;
 | |
|       } else if (!collection) {
 | |
|       } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|         size = Infinity;
 | |
|         iter = collection[iteratorSymbol]();
 | |
|         iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator;
 | |
|       } else if (typeof collection === obj) {
 | |
|         keys = nativeKeys(collection);
 | |
|         size = keys.length;
 | |
|         iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator;
 | |
|       }
 | |
|       if (!size || isNaN(limit) || limit < 1) {
 | |
|         return callback(null);
 | |
|       }
 | |
|       timesSync(limit > size ? size : limit, iterate);
 | |
| 
 | |
|       function arrayIterator() {
 | |
|         index = started++;
 | |
|         if (index < size) {
 | |
|           value = collection[index];
 | |
|           iterator(value, createCallback(value));
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       function arrayIteratorWithIndex() {
 | |
|         index = started++;
 | |
|         if (index < size) {
 | |
|           value = collection[index];
 | |
|           iterator(value, index, createCallback(value));
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       function symbolIterator() {
 | |
|         item = iter.next();
 | |
|         if (item.done === false) {
 | |
|           started++;
 | |
|           value = item.value;
 | |
|           iterator(value, createCallback(value));
 | |
|         } else if (completed === started && iterator !== noop) {
 | |
|           iterator = noop;
 | |
|           callback(null);
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       function symbolIteratorWithKey() {
 | |
|         item = iter.next();
 | |
|         if (item.done === false) {
 | |
|           value = item.value;
 | |
|           iterator(value, started++, createCallback(value));
 | |
|         } else if (completed === started && iterator !== noop) {
 | |
|           iterator = noop;
 | |
|           callback(null);
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       function objectIterator() {
 | |
|         index = started++;
 | |
|         if (index < size) {
 | |
|           value = collection[keys[index]];
 | |
|           iterator(value, createCallback(value));
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       function objectIteratorWithKey() {
 | |
|         if (started < size) {
 | |
|           key = keys[started++];
 | |
|           value = collection[key];
 | |
|           iterator(value, key, createCallback(value));
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       function createCallback(value) {
 | |
|         var called = false;
 | |
|         return function(err, res) {
 | |
|           if (called) {
 | |
|             throwError();
 | |
|           }
 | |
|           called = true;
 | |
|           if (err) {
 | |
|             iterate = noop;
 | |
|             callback = once(callback);
 | |
|             callback(err);
 | |
|           } else if (!!res === bool) {
 | |
|             iterate = noop;
 | |
|             callback = once(callback);
 | |
|             callback(null, value);
 | |
|           } else if (++completed === size) {
 | |
|             callback(null);
 | |
|           } else if (sync) {
 | |
|             nextTick(iterate);
 | |
|           } else {
 | |
|             sync = true;
 | |
|             iterate();
 | |
|           }
 | |
|           sync = false;
 | |
|         };
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {Function} arrayEach
 | |
|    * @param {Function} baseEach
 | |
|    * @param {Function} symbolEach
 | |
|    * @param {boolean} bool
 | |
|    */
 | |
|   function createPick(arrayEach, baseEach, symbolEach, bool) {
 | |
|     return function(collection, iterator, callback) {
 | |
|       callback = callback || noop;
 | |
|       var size, keys;
 | |
|       var completed = 0;
 | |
|       var result = {};
 | |
| 
 | |
|       if (isArray(collection)) {
 | |
|         size = collection.length;
 | |
|         arrayEach(collection, iterator, createCallback);
 | |
|       } else if (!collection) {
 | |
|       } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|         size = symbolEach(collection, iterator, createCallback);
 | |
|         size && size === completed && callback(null, result);
 | |
|       } else if (typeof collection === obj) {
 | |
|         keys = nativeKeys(collection);
 | |
|         size = keys.length;
 | |
|         baseEach(collection, iterator, createCallback, keys);
 | |
|       }
 | |
|       if (!size) {
 | |
|         return callback(null, {});
 | |
|       }
 | |
| 
 | |
|       function createCallback(key, value) {
 | |
|         return function done(err, res) {
 | |
|           if (key === null) {
 | |
|             throwError();
 | |
|           }
 | |
|           if (err) {
 | |
|             key = null;
 | |
|             callback = once(callback);
 | |
|             callback(err, objectClone(result));
 | |
|             return;
 | |
|           }
 | |
|           if (!!res === bool) {
 | |
|             result[key] = value;
 | |
|           }
 | |
|           key = null;
 | |
|           if (++completed === size) {
 | |
|             callback(null, result);
 | |
|           }
 | |
|         };
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {boolean} bool
 | |
|    */
 | |
|   function createPickSeries(bool) {
 | |
|     return function(collection, iterator, callback) {
 | |
|       callback = onlyOnce(callback || noop);
 | |
|       var size, key, value, keys, iter, item, iterate;
 | |
|       var sync = false;
 | |
|       var result = {};
 | |
|       var completed = 0;
 | |
| 
 | |
|       if (isArray(collection)) {
 | |
|         size = collection.length;
 | |
|         iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator;
 | |
|       } else if (!collection) {
 | |
|       } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|         size = Infinity;
 | |
|         iter = collection[iteratorSymbol]();
 | |
|         iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator;
 | |
|       } else if (typeof collection === obj) {
 | |
|         keys = nativeKeys(collection);
 | |
|         size = keys.length;
 | |
|         iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator;
 | |
|       }
 | |
|       if (!size) {
 | |
|         return callback(null, {});
 | |
|       }
 | |
|       iterate();
 | |
| 
 | |
|       function arrayIterator() {
 | |
|         key = completed;
 | |
|         value = collection[completed];
 | |
|         iterator(value, done);
 | |
|       }
 | |
| 
 | |
|       function arrayIteratorWithIndex() {
 | |
|         key = completed;
 | |
|         value = collection[completed];
 | |
|         iterator(value, completed, done);
 | |
|       }
 | |
| 
 | |
|       function symbolIterator() {
 | |
|         key = completed;
 | |
|         item = iter.next();
 | |
|         value = item.value;
 | |
|         item.done ? callback(null, result) : iterator(value, done);
 | |
|       }
 | |
| 
 | |
|       function symbolIteratorWithKey() {
 | |
|         key = completed;
 | |
|         item = iter.next();
 | |
|         value = item.value;
 | |
|         item.done ? callback(null, result) : iterator(value, key, done);
 | |
|       }
 | |
| 
 | |
|       function objectIterator() {
 | |
|         key = keys[completed];
 | |
|         value = collection[key];
 | |
|         iterator(value, done);
 | |
|       }
 | |
| 
 | |
|       function objectIteratorWithKey() {
 | |
|         key = keys[completed];
 | |
|         value = collection[key];
 | |
|         iterator(value, key, done);
 | |
|       }
 | |
| 
 | |
|       function done(err, res) {
 | |
|         if (err) {
 | |
|           callback(err, result);
 | |
|           return;
 | |
|         }
 | |
|         if (!!res === bool) {
 | |
|           result[key] = value;
 | |
|         }
 | |
|         if (++completed === size) {
 | |
|           iterate = throwError;
 | |
|           callback(null, result);
 | |
|         } else if (sync) {
 | |
|           nextTick(iterate);
 | |
|         } else {
 | |
|           sync = true;
 | |
|           iterate();
 | |
|         }
 | |
|         sync = false;
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {boolean} bool
 | |
|    */
 | |
|   function createPickLimit(bool) {
 | |
|     return function(collection, limit, iterator, callback) {
 | |
|       callback = callback || noop;
 | |
|       var size, index, key, value, keys, iter, item, iterate;
 | |
|       var sync = false;
 | |
|       var result = {};
 | |
|       var started = 0;
 | |
|       var completed = 0;
 | |
| 
 | |
|       if (isArray(collection)) {
 | |
|         size = collection.length;
 | |
|         iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator;
 | |
|       } else if (!collection) {
 | |
|       } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|         size = Infinity;
 | |
|         iter = collection[iteratorSymbol]();
 | |
|         iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator;
 | |
|       } else if (typeof collection === obj) {
 | |
|         keys = nativeKeys(collection);
 | |
|         size = keys.length;
 | |
|         iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator;
 | |
|       }
 | |
|       if (!size || isNaN(limit) || limit < 1) {
 | |
|         return callback(null, {});
 | |
|       }
 | |
|       timesSync(limit > size ? size : limit, iterate);
 | |
| 
 | |
|       function arrayIterator() {
 | |
|         index = started++;
 | |
|         if (index < size) {
 | |
|           value = collection[index];
 | |
|           iterator(value, createCallback(value, index));
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       function arrayIteratorWithIndex() {
 | |
|         index = started++;
 | |
|         if (index < size) {
 | |
|           value = collection[index];
 | |
|           iterator(value, index, createCallback(value, index));
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       function symbolIterator() {
 | |
|         item = iter.next();
 | |
|         if (item.done === false) {
 | |
|           value = item.value;
 | |
|           iterator(value, createCallback(value, started++));
 | |
|         } else if (completed === started && iterator !== noop) {
 | |
|           iterator = noop;
 | |
|           callback(null, result);
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       function symbolIteratorWithKey() {
 | |
|         item = iter.next();
 | |
|         if (item.done === false) {
 | |
|           value = item.value;
 | |
|           iterator(value, started, createCallback(value, started++));
 | |
|         } else if (completed === started && iterator !== noop) {
 | |
|           iterator = noop;
 | |
|           callback(null, result);
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       function objectIterator() {
 | |
|         if (started < size) {
 | |
|           key = keys[started++];
 | |
|           value = collection[key];
 | |
|           iterator(value, createCallback(value, key));
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       function objectIteratorWithKey() {
 | |
|         if (started < size) {
 | |
|           key = keys[started++];
 | |
|           value = collection[key];
 | |
|           iterator(value, key, createCallback(value, key));
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       function createCallback(value, key) {
 | |
|         return function(err, res) {
 | |
|           if (key === null) {
 | |
|             throwError();
 | |
|           }
 | |
|           if (err) {
 | |
|             key = null;
 | |
|             iterate = noop;
 | |
|             callback = once(callback);
 | |
|             callback(err, objectClone(result));
 | |
|             return;
 | |
|           }
 | |
|           if (!!res === bool) {
 | |
|             result[key] = value;
 | |
|           }
 | |
|           key = null;
 | |
|           if (++completed === size) {
 | |
|             iterate = throwError;
 | |
|             callback = onlyOnce(callback);
 | |
|             callback(null, result);
 | |
|           } else if (sync) {
 | |
|             nextTick(iterate);
 | |
|           } else {
 | |
|             sync = true;
 | |
|             iterate();
 | |
|           }
 | |
|           sync = false;
 | |
|         };
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace reduce
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {*} result
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var collection = [1, 3, 2, 4];
 | |
|    * var iterator = function(result, num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, result + num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.reduce(collection, 0, iterator, function(err, res) {
 | |
|    *   console.log(res); // 10
 | |
|    *   console.log(order); // [1, 3, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var collection = [1, 3, 2, 4];
 | |
|    * var iterator = function(result, num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, result + num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.reduce(collection, '', iterator, function(err, res) {
 | |
|    *   console.log(res); // '1324'
 | |
|    *   console.log(order); // [[1, 0], [3, 1], [2, 2], [4, 3]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2, d: 4 };
 | |
|    * var iterator = function(result, num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, result + num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.reduce(collection, '', iterator, function(err, res) {
 | |
|    *   console.log(res); // '1324'
 | |
|    *   console.log(order); // [1, 3, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2, d: 4 };
 | |
|    * var iterator = function(result, num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, result + num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.reduce(collection, 0, iterator, function(err, res) {
 | |
|    *   console.log(res); // 10
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'b'], [2, 'b'], [4, 'd']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function reduce(collection, result, iterator, callback) {
 | |
|     callback = onlyOnce(callback || noop);
 | |
|     var size, key, keys, iter, item, iterate;
 | |
|     var sync = false;
 | |
|     var completed = 0;
 | |
| 
 | |
|     if (isArray(collection)) {
 | |
|       size = collection.length;
 | |
|       iterate = iterator.length === 4 ? arrayIteratorWithIndex : arrayIterator;
 | |
|     } else if (!collection) {
 | |
|     } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|       size = Infinity;
 | |
|       iter = collection[iteratorSymbol]();
 | |
|       iterate = iterator.length === 4 ? symbolIteratorWithKey : symbolIterator;
 | |
|     } else if (typeof collection === obj) {
 | |
|       keys = nativeKeys(collection);
 | |
|       size = keys.length;
 | |
|       iterate = iterator.length === 4 ? objectIteratorWithKey : objectIterator;
 | |
|     }
 | |
|     if (!size) {
 | |
|       return callback(null, result);
 | |
|     }
 | |
|     iterate(result);
 | |
| 
 | |
|     function arrayIterator(result) {
 | |
|       iterator(result, collection[completed], done);
 | |
|     }
 | |
| 
 | |
|     function arrayIteratorWithIndex(result) {
 | |
|       iterator(result, collection[completed], completed, done);
 | |
|     }
 | |
| 
 | |
|     function symbolIterator(result) {
 | |
|       item = iter.next();
 | |
|       item.done ? callback(null, result) : iterator(result, item.value, done);
 | |
|     }
 | |
| 
 | |
|     function symbolIteratorWithKey(result) {
 | |
|       item = iter.next();
 | |
|       item.done ? callback(null, result) : iterator(result, item.value, completed, done);
 | |
|     }
 | |
| 
 | |
|     function objectIterator(result) {
 | |
|       iterator(result, collection[keys[completed]], done);
 | |
|     }
 | |
| 
 | |
|     function objectIteratorWithKey(result) {
 | |
|       key = keys[completed];
 | |
|       iterator(result, collection[key], key, done);
 | |
|     }
 | |
| 
 | |
|     function done(err, result) {
 | |
|       if (err) {
 | |
|         callback(err, result);
 | |
|       } else if (++completed === size) {
 | |
|         iterator = throwError;
 | |
|         callback(null, result);
 | |
|       } else if (sync) {
 | |
|         nextTick(function() {
 | |
|           iterate(result);
 | |
|         });
 | |
|       } else {
 | |
|         sync = true;
 | |
|         iterate(result);
 | |
|       }
 | |
|       sync = false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace reduceRight
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {*} result
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var collection = [1, 3, 2, 4];
 | |
|    * var iterator = function(result, num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, result + num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.reduceRight(collection, 0, iterator, function(err, res) {
 | |
|    *   console.log(res); // 10
 | |
|    *   console.log(order); // [4, 2, 3, 1]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var collection = [1, 3, 2, 4];
 | |
|    * var iterator = function(result, num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, result + num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.reduceRight(collection, '', iterator, function(err, res) {
 | |
|    *   console.log(res); // '4231'
 | |
|    *   console.log(order); // [[4, 3], [2, 2], [3, 1], [1, 0]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2, d: 4 };
 | |
|    * var iterator = function(result, num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, result + num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.reduceRight(collection, '', iterator, function(err, res) {
 | |
|    *   console.log(res); // '4231'
 | |
|    *   console.log(order); // [4, 2, 3, 1]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2, d: 4 };
 | |
|    * var iterator = function(result, num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, result + num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.reduceRight(collection, 0, iterator, function(err, res) {
 | |
|    *   console.log(res); // 10
 | |
|    *   console.log(order); // [[4, 3], [2, 2], [3, 1], [1, 0]]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function reduceRight(collection, result, iterator, callback) {
 | |
|     callback = onlyOnce(callback || noop);
 | |
|     var resIndex, index, key, keys, iter, item, col, iterate;
 | |
|     var sync = false;
 | |
| 
 | |
|     if (isArray(collection)) {
 | |
|       resIndex = collection.length;
 | |
|       iterate = iterator.length === 4 ? arrayIteratorWithIndex : arrayIterator;
 | |
|     } else if (!collection) {
 | |
|     } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|       col = [];
 | |
|       iter = collection[iteratorSymbol]();
 | |
|       index = -1;
 | |
|       while ((item = iter.next()).done === false) {
 | |
|         col[++index] = item.value;
 | |
|       }
 | |
|       collection = col;
 | |
|       resIndex = col.length;
 | |
|       iterate = iterator.length === 4 ? arrayIteratorWithIndex : arrayIterator;
 | |
|     } else if (typeof collection === obj) {
 | |
|       keys = nativeKeys(collection);
 | |
|       resIndex = keys.length;
 | |
|       iterate = iterator.length === 4 ? objectIteratorWithKey : objectIterator;
 | |
|     }
 | |
|     if (!resIndex) {
 | |
|       return callback(null, result);
 | |
|     }
 | |
|     iterate(result);
 | |
| 
 | |
|     function arrayIterator(result) {
 | |
|       iterator(result, collection[--resIndex], done);
 | |
|     }
 | |
| 
 | |
|     function arrayIteratorWithIndex(result) {
 | |
|       iterator(result, collection[--resIndex], resIndex, done);
 | |
|     }
 | |
| 
 | |
|     function objectIterator(result) {
 | |
|       iterator(result, collection[keys[--resIndex]], done);
 | |
|     }
 | |
| 
 | |
|     function objectIteratorWithKey(result) {
 | |
|       key = keys[--resIndex];
 | |
|       iterator(result, collection[key], key, done);
 | |
|     }
 | |
| 
 | |
|     function done(err, result) {
 | |
|       if (err) {
 | |
|         callback(err, result);
 | |
|       } else if (resIndex === 0) {
 | |
|         iterate = throwError;
 | |
|         callback(null, result);
 | |
|       } else if (sync) {
 | |
|         nextTick(function() {
 | |
|           iterate(result);
 | |
|         });
 | |
|       } else {
 | |
|         sync = true;
 | |
|         iterate(result);
 | |
|       }
 | |
|       sync = false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {Function} arrayEach
 | |
|    * @param {Function} baseEach
 | |
|    * @param {Function} symbolEach
 | |
|    */
 | |
|   function createTransform(arrayEach, baseEach, symbolEach) {
 | |
|     return function transform(collection, accumulator, iterator, callback) {
 | |
|       if (arguments.length === 3) {
 | |
|         callback = iterator;
 | |
|         iterator = accumulator;
 | |
|         accumulator = undefined;
 | |
|       }
 | |
|       callback = callback || noop;
 | |
|       var size, keys, result;
 | |
|       var completed = 0;
 | |
| 
 | |
|       if (isArray(collection)) {
 | |
|         size = collection.length;
 | |
|         result = accumulator !== undefined ? accumulator : [];
 | |
|         arrayEach(collection, result, iterator, done);
 | |
|       } else if (!collection) {
 | |
|       } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|         result = accumulator !== undefined ? accumulator : {};
 | |
|         size = symbolEach(collection, result, iterator, done);
 | |
|         size && size === completed && callback(null, result);
 | |
|       } else if (typeof collection === obj) {
 | |
|         keys = nativeKeys(collection);
 | |
|         size = keys.length;
 | |
|         result = accumulator !== undefined ? accumulator : {};
 | |
|         baseEach(collection, result, iterator, done, keys);
 | |
|       }
 | |
|       if (!size) {
 | |
|         callback(null, accumulator !== undefined ? accumulator : result || {});
 | |
|       }
 | |
| 
 | |
|       function done(err, bool) {
 | |
|         if (err) {
 | |
|           callback = once(callback);
 | |
|           callback(err, isArray(result) ? createArray(result) : objectClone(result));
 | |
|         } else if (++completed === size) {
 | |
|           callback(null, result);
 | |
|         } else if (bool === false) {
 | |
|           callback = once(callback);
 | |
|           callback(null, isArray(result) ? createArray(result) : objectClone(result));
 | |
|         }
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace transformSeries
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Array|Object|Function} [accumulator]
 | |
|    * @param {Function} [iterator]
 | |
|    * @param {Function} [callback]
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var collection = [1, 3, 2, 4];
 | |
|    * var iterator = function(result, num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     result.push(num)
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.transformSeries(collection, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3, 2, 4]
 | |
|    *   console.log(order); // [1, 3, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index and accumulator
 | |
|    * var order = [];
 | |
|    * var collection = [1, 3, 2, 4];
 | |
|    * var iterator = function(result, num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     result[index] = num;
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.transformSeries(collection, {}, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '0': 1, '1': 3, '2': 2, '3': 4 }
 | |
|    *   console.log(order); // [[1, 0], [3, 1], [2, 2], [4, 3]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with accumulator
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2, d: 4 };
 | |
|    * var iterator = function(result, num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     result.push(num);
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.transformSeries(collection, [], iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3, 2, 4]
 | |
|    *   console.log(order); // [1, 3, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2, d: 4 };
 | |
|    * var iterator = function(result, num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     result[key] = num;
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.transformSeries(collection, iterator, function(err, res) {
 | |
|    *   console.log(res); //  { a: 1, b: 3, c: 2, d: 4 }
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'b'], [2, 'b'], [4, 'd']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function transformSeries(collection, accumulator, iterator, callback) {
 | |
|     if (arguments.length === 3) {
 | |
|       callback = iterator;
 | |
|       iterator = accumulator;
 | |
|       accumulator = undefined;
 | |
|     }
 | |
|     callback = onlyOnce(callback || noop);
 | |
|     var size, key, keys, iter, item, iterate, result;
 | |
|     var sync = false;
 | |
|     var completed = 0;
 | |
| 
 | |
|     if (isArray(collection)) {
 | |
|       size = collection.length;
 | |
|       result = accumulator !== undefined ? accumulator : [];
 | |
|       iterate = iterator.length === 4 ? arrayIteratorWithIndex : arrayIterator;
 | |
|     } else if (!collection) {
 | |
|     } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|       size = Infinity;
 | |
|       iter = collection[iteratorSymbol]();
 | |
|       result = accumulator !== undefined ? accumulator : {};
 | |
|       iterate = iterator.length === 4 ? symbolIteratorWithKey : symbolIterator;
 | |
|     } else if (typeof collection === obj) {
 | |
|       keys = nativeKeys(collection);
 | |
|       size = keys.length;
 | |
|       result = accumulator !== undefined ? accumulator : {};
 | |
|       iterate = iterator.length === 4 ? objectIteratorWithKey : objectIterator;
 | |
|     }
 | |
|     if (!size) {
 | |
|       return callback(null, accumulator !== undefined ? accumulator : result || {});
 | |
|     }
 | |
|     iterate();
 | |
| 
 | |
|     function arrayIterator() {
 | |
|       iterator(result, collection[completed], done);
 | |
|     }
 | |
| 
 | |
|     function arrayIteratorWithIndex() {
 | |
|       iterator(result, collection[completed], completed, done);
 | |
|     }
 | |
| 
 | |
|     function symbolIterator() {
 | |
|       item = iter.next();
 | |
|       item.done ? callback(null, result) : iterator(result, item.value, done);
 | |
|     }
 | |
| 
 | |
|     function symbolIteratorWithKey() {
 | |
|       item = iter.next();
 | |
|       item.done ? callback(null, result) : iterator(result, item.value, completed, done);
 | |
|     }
 | |
| 
 | |
|     function objectIterator() {
 | |
|       iterator(result, collection[keys[completed]], done);
 | |
|     }
 | |
| 
 | |
|     function objectIteratorWithKey() {
 | |
|       key = keys[completed];
 | |
|       iterator(result, collection[key], key, done);
 | |
|     }
 | |
| 
 | |
|     function done(err, bool) {
 | |
|       if (err) {
 | |
|         callback(err, result);
 | |
|       } else if (++completed === size || bool === false) {
 | |
|         iterate = throwError;
 | |
|         callback(null, result);
 | |
|       } else if (sync) {
 | |
|         nextTick(iterate);
 | |
|       } else {
 | |
|         sync = true;
 | |
|         iterate();
 | |
|       }
 | |
|       sync = false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace transformLimit
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {number} limit - limit >= 1
 | |
|    * @param {Array|Object|Function} [accumulator]
 | |
|    * @param {Function} [iterator]
 | |
|    * @param {Function} [callback]
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(result, num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     result.push(num);
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.transformLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3, 5, 2, 4]
 | |
|    *   console.log(order); // [1, 3, 5, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index and accumulator
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(result, num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     result[index] = key;
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.transformLimit(array, 2, {}, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '0': 1, '1': 5, '2': 3, '3': 4, '4': 2 }
 | |
|    *   console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with accumulator
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(result, num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     result.push(num);
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.transformLimit(object, 2, [], iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3, 5, 2, 4]
 | |
|    *   console.log(order); // [1, 3, 5, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(result, num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     result[key] = num;
 | |
|    *     done();
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.transformLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function transformLimit(collection, limit, accumulator, iterator, callback) {
 | |
|     if (arguments.length === 4) {
 | |
|       callback = iterator;
 | |
|       iterator = accumulator;
 | |
|       accumulator = undefined;
 | |
|     }
 | |
|     callback = callback || noop;
 | |
|     var size, index, key, keys, iter, item, iterate, result;
 | |
|     var sync = false;
 | |
|     var started = 0;
 | |
|     var completed = 0;
 | |
| 
 | |
|     if (isArray(collection)) {
 | |
|       size = collection.length;
 | |
|       result = accumulator !== undefined ? accumulator : [];
 | |
|       iterate = iterator.length === 4 ? arrayIteratorWithIndex : arrayIterator;
 | |
|     } else if (!collection) {
 | |
|     } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|       size = Infinity;
 | |
|       iter = collection[iteratorSymbol]();
 | |
|       result = accumulator !== undefined ? accumulator : {};
 | |
|       iterate = iterator.length === 4 ? symbolIteratorWithKey : symbolIterator;
 | |
|     } else if (typeof collection === obj) {
 | |
|       keys = nativeKeys(collection);
 | |
|       size = keys.length;
 | |
|       result = accumulator !== undefined ? accumulator : {};
 | |
|       iterate = iterator.length === 4 ? objectIteratorWithKey : objectIterator;
 | |
|     }
 | |
|     if (!size || isNaN(limit) || limit < 1) {
 | |
|       return callback(null, accumulator !== undefined ? accumulator : result || {});
 | |
|     }
 | |
|     timesSync(limit > size ? size : limit, iterate);
 | |
| 
 | |
|     function arrayIterator() {
 | |
|       index = started++;
 | |
|       if (index < size) {
 | |
|         iterator(result, collection[index], onlyOnce(done));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function arrayIteratorWithIndex() {
 | |
|       index = started++;
 | |
|       if (index < size) {
 | |
|         iterator(result, collection[index], index, onlyOnce(done));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function symbolIterator() {
 | |
|       item = iter.next();
 | |
|       if (item.done === false) {
 | |
|         started++;
 | |
|         iterator(result, item.value, onlyOnce(done));
 | |
|       } else if (completed === started && iterator !== noop) {
 | |
|         iterator = noop;
 | |
|         callback(null, result);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function symbolIteratorWithKey() {
 | |
|       item = iter.next();
 | |
|       if (item.done === false) {
 | |
|         iterator(result, item.value, started++, onlyOnce(done));
 | |
|       } else if (completed === started && iterator !== noop) {
 | |
|         iterator = noop;
 | |
|         callback(null, result);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function objectIterator() {
 | |
|       index = started++;
 | |
|       if (index < size) {
 | |
|         iterator(result, collection[keys[index]], onlyOnce(done));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function objectIteratorWithKey() {
 | |
|       index = started++;
 | |
|       if (index < size) {
 | |
|         key = keys[index];
 | |
|         iterator(result, collection[key], key, onlyOnce(done));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function done(err, bool) {
 | |
|       if (err || bool === false) {
 | |
|         iterate = noop;
 | |
|         callback(err || null, isArray(result) ? createArray(result) : objectClone(result));
 | |
|         callback = noop;
 | |
|       } else if (++completed === size) {
 | |
|         iterator = noop;
 | |
|         callback(null, result);
 | |
|       } else if (sync) {
 | |
|         nextTick(iterate);
 | |
|       } else {
 | |
|         sync = true;
 | |
|         iterate();
 | |
|       }
 | |
|       sync = false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {function} arrayEach
 | |
|    * @param {function} baseEach
 | |
|    * @param {function} symbolEach
 | |
|    */
 | |
|   function createSortBy(arrayEach, baseEach, symbolEach) {
 | |
|     return function sortBy(collection, iterator, callback) {
 | |
|       callback = callback || noop;
 | |
|       var size, array, criteria;
 | |
|       var completed = 0;
 | |
| 
 | |
|       if (isArray(collection)) {
 | |
|         size = collection.length;
 | |
|         array = Array(size);
 | |
|         criteria = Array(size);
 | |
|         arrayEach(collection, iterator, createCallback);
 | |
|       } else if (!collection) {
 | |
|       } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|         array = [];
 | |
|         criteria = [];
 | |
|         size = symbolEach(collection, iterator, createCallback);
 | |
|         size && size === completed && callback(null, sortByCriteria(array, criteria));
 | |
|       } else if (typeof collection === obj) {
 | |
|         var keys = nativeKeys(collection);
 | |
|         size = keys.length;
 | |
|         array = Array(size);
 | |
|         criteria = Array(size);
 | |
|         baseEach(collection, iterator, createCallback, keys);
 | |
|       }
 | |
|       if (!size) {
 | |
|         callback(null, []);
 | |
|       }
 | |
| 
 | |
|       function createCallback(index, value) {
 | |
|         var called = false;
 | |
|         array[index] = value;
 | |
|         return function done(err, criterion) {
 | |
|           if (called) {
 | |
|             throwError();
 | |
|           }
 | |
|           called = true;
 | |
|           criteria[index] = criterion;
 | |
|           if (err) {
 | |
|             callback = once(callback);
 | |
|             callback(err);
 | |
|           } else if (++completed === size) {
 | |
|             callback(null, sortByCriteria(array, criteria));
 | |
|           }
 | |
|         };
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace sortBySeries
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.sortBySeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 2, 3];
 | |
|    *   console.log(order); // [1, 3, 2]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.sortBySeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 2, 3]
 | |
|    *   console.log(order); // [[1, 0], [3, 1], [2, 2]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.sortBySeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 2, 3]
 | |
|    *   console.log(order); // [1, 3, 2]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.sortBySeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 2, 3]
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'b'], [2, 'c']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function sortBySeries(collection, iterator, callback) {
 | |
|     callback = onlyOnce(callback || noop);
 | |
|     var size, key, value, keys, iter, item, array, criteria, iterate;
 | |
|     var sync = false;
 | |
|     var completed = 0;
 | |
| 
 | |
|     if (isArray(collection)) {
 | |
|       size = collection.length;
 | |
|       array = collection;
 | |
|       criteria = Array(size);
 | |
|       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator;
 | |
|     } else if (!collection) {
 | |
|     } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|       size = Infinity;
 | |
|       array = [];
 | |
|       criteria = [];
 | |
|       iter = collection[iteratorSymbol]();
 | |
|       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator;
 | |
|     } else if (typeof collection === obj) {
 | |
|       keys = nativeKeys(collection);
 | |
|       size = keys.length;
 | |
|       array = Array(size);
 | |
|       criteria = Array(size);
 | |
|       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator;
 | |
|     }
 | |
|     if (!size) {
 | |
|       return callback(null, []);
 | |
|     }
 | |
|     iterate();
 | |
| 
 | |
|     function arrayIterator() {
 | |
|       value = collection[completed];
 | |
|       iterator(value, done);
 | |
|     }
 | |
| 
 | |
|     function arrayIteratorWithIndex() {
 | |
|       value = collection[completed];
 | |
|       iterator(value, completed, done);
 | |
|     }
 | |
| 
 | |
|     function symbolIterator() {
 | |
|       item = iter.next();
 | |
|       if (item.done) {
 | |
|         return callback(null, sortByCriteria(array, criteria));
 | |
|       }
 | |
|       value = item.value;
 | |
|       array[completed] = value;
 | |
|       iterator(value, done);
 | |
|     }
 | |
| 
 | |
|     function symbolIteratorWithKey() {
 | |
|       item = iter.next();
 | |
|       if (item.done) {
 | |
|         return callback(null, sortByCriteria(array, criteria));
 | |
|       }
 | |
|       value = item.value;
 | |
|       array[completed] = value;
 | |
|       iterator(value, completed, done);
 | |
|     }
 | |
| 
 | |
|     function objectIterator() {
 | |
|       value = collection[keys[completed]];
 | |
|       array[completed] = value;
 | |
|       iterator(value, done);
 | |
|     }
 | |
| 
 | |
|     function objectIteratorWithKey() {
 | |
|       key = keys[completed];
 | |
|       value = collection[key];
 | |
|       array[completed] = value;
 | |
|       iterator(value, key, done);
 | |
|     }
 | |
| 
 | |
|     function done(err, criterion) {
 | |
|       criteria[completed] = criterion;
 | |
|       if (err) {
 | |
|         callback(err);
 | |
|       } else if (++completed === size) {
 | |
|         iterate = throwError;
 | |
|         callback(null, sortByCriteria(array, criteria));
 | |
|       } else if (sync) {
 | |
|         nextTick(iterate);
 | |
|       } else {
 | |
|         sync = true;
 | |
|         iterate();
 | |
|       }
 | |
|       sync = false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace sortByLimit
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {number} limit - limit >= 1
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.sortByLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 2, 3, 4, 5]
 | |
|    *   console.log(order); // [1, 3, 5, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.sortByLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 2, 3, 4, 5]
 | |
|    *   console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.sortByLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 2, 3, 4, 5]
 | |
|    *   console.log(order); // [1, 3, 5, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.sortByLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 2, 3, 4, 5]
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function sortByLimit(collection, limit, iterator, callback) {
 | |
|     callback = callback || noop;
 | |
|     var size, index, key, value, array, keys, iter, item, criteria, iterate;
 | |
|     var sync = false;
 | |
|     var started = 0;
 | |
|     var completed = 0;
 | |
| 
 | |
|     if (isArray(collection)) {
 | |
|       size = collection.length;
 | |
|       array = collection;
 | |
|       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator;
 | |
|     } else if (!collection) {
 | |
|     } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|       size = Infinity;
 | |
|       iter = collection[iteratorSymbol]();
 | |
|       array = [];
 | |
|       criteria = [];
 | |
|       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator;
 | |
|     } else if (typeof collection === obj) {
 | |
|       keys = nativeKeys(collection);
 | |
|       size = keys.length;
 | |
|       array = Array(size);
 | |
|       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator;
 | |
|     }
 | |
|     if (!size || isNaN(limit) || limit < 1) {
 | |
|       return callback(null, []);
 | |
|     }
 | |
|     criteria = criteria || Array(size);
 | |
|     timesSync(limit > size ? size : limit, iterate);
 | |
| 
 | |
|     function arrayIterator() {
 | |
|       if (started < size) {
 | |
|         value = collection[started];
 | |
|         iterator(value, createCallback(value, started++));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function arrayIteratorWithIndex() {
 | |
|       index = started++;
 | |
|       if (index < size) {
 | |
|         value = collection[index];
 | |
|         iterator(value, index, createCallback(value, index));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function symbolIterator() {
 | |
|       item = iter.next();
 | |
|       if (item.done === false) {
 | |
|         value = item.value;
 | |
|         array[started] = value;
 | |
|         iterator(value, createCallback(value, started++));
 | |
|       } else if (completed === started && iterator !== noop) {
 | |
|         iterator = noop;
 | |
|         callback(null, sortByCriteria(array, criteria));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function symbolIteratorWithKey() {
 | |
|       item = iter.next();
 | |
|       if (item.done === false) {
 | |
|         value = item.value;
 | |
|         array[started] = value;
 | |
|         iterator(value, started, createCallback(value, started++));
 | |
|       } else if (completed === started && iterator !== noop) {
 | |
|         iterator = noop;
 | |
|         callback(null, sortByCriteria(array, criteria));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function objectIterator() {
 | |
|       if (started < size) {
 | |
|         value = collection[keys[started]];
 | |
|         array[started] = value;
 | |
|         iterator(value, createCallback(value, started++));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function objectIteratorWithKey() {
 | |
|       if (started < size) {
 | |
|         key = keys[started];
 | |
|         value = collection[key];
 | |
|         array[started] = value;
 | |
|         iterator(value, key, createCallback(value, started++));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function createCallback(value, index) {
 | |
|       var called = false;
 | |
|       return function(err, criterion) {
 | |
|         if (called) {
 | |
|           throwError();
 | |
|         }
 | |
|         called = true;
 | |
|         criteria[index] = criterion;
 | |
|         if (err) {
 | |
|           iterate = noop;
 | |
|           callback(err);
 | |
|           callback = noop;
 | |
|         } else if (++completed === size) {
 | |
|           callback(null, sortByCriteria(array, criteria));
 | |
|         } else if (sync) {
 | |
|           nextTick(iterate);
 | |
|         } else {
 | |
|           sync = true;
 | |
|           iterate();
 | |
|         }
 | |
|         sync = false;
 | |
|       };
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace some
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.some(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // true
 | |
|    *   console.log(order); // [1]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.some(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // true
 | |
|    *   console.log(order); // [[1, 0]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.some(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // true
 | |
|    *   console.log(order); // [1]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.some(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // true
 | |
|    *   console.log(order); // [[1, 'a']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function some(collection, iterator, callback) {
 | |
|     callback = callback || noop;
 | |
|     detect(collection, iterator, done);
 | |
| 
 | |
|     function done(err, res) {
 | |
|       if (err) {
 | |
|         return callback(err);
 | |
|       }
 | |
|       callback(null, !!res);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace someSeries
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.someSeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // true
 | |
|    *   console.log(order); // [1]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.someSeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // true
 | |
|    *   console.log(order); // [[1, 0]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.someSeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // true
 | |
|    *   console.log(order); // [1]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.someSeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // true
 | |
|    *   console.log(order); // [[1, 'a']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function someSeries(collection, iterator, callback) {
 | |
|     callback = callback || noop;
 | |
|     detectSeries(collection, iterator, done);
 | |
| 
 | |
|     function done(err, res) {
 | |
|       if (err) {
 | |
|         return callback(err);
 | |
|       }
 | |
|       callback(null, !!res);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace someLimit
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {number} limit - limit >= 1
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.someLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // true
 | |
|    *   console.log(order); // [1]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.someLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // true
 | |
|    *   console.log(order); // [[1, 0]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.someLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // true
 | |
|    *   console.log(order); // [1]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num % 2);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.someLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // true
 | |
|    *   console.log(order); // [[1, 'a']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function someLimit(collection, limit, iterator, callback) {
 | |
|     callback = callback || noop;
 | |
|     detectLimit(collection, limit, iterator, done);
 | |
| 
 | |
|     function done(err, res) {
 | |
|       if (err) {
 | |
|         return callback(err);
 | |
|       }
 | |
|       callback(null, !!res);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {Function} arrayEach
 | |
|    * @param {Function} baseEach
 | |
|    * @param {Function} symbolEach
 | |
|    */
 | |
|   function createEvery(arrayEach, baseEach, symbolEach) {
 | |
|     var deny = createDetect(arrayEach, baseEach, symbolEach, false);
 | |
| 
 | |
|     return function every(collection, iterator, callback) {
 | |
|       callback = callback || noop;
 | |
|       deny(collection, iterator, done);
 | |
| 
 | |
|       function done(err, res) {
 | |
|         if (err) {
 | |
|           return callback(err);
 | |
|         }
 | |
|         callback(null, !res);
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function createEverySeries() {
 | |
|     var denySeries = createDetectSeries(false);
 | |
| 
 | |
|     return function everySeries(collection, iterator, callback) {
 | |
|       callback = callback || noop;
 | |
|       denySeries(collection, iterator, done);
 | |
| 
 | |
|       function done(err, res) {
 | |
|         if (err) {
 | |
|           return callback(err);
 | |
|         }
 | |
|         callback(null, !res);
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function createEveryLimit() {
 | |
|     var denyLimit = createDetectLimit(false);
 | |
| 
 | |
|     return function everyLimit(collection, limit, iterator, callback) {
 | |
|       callback = callback || noop;
 | |
|       denyLimit(collection, limit, iterator, done);
 | |
| 
 | |
|       function done(err, res) {
 | |
|         if (err) {
 | |
|           return callback(err);
 | |
|         }
 | |
|         callback(null, !res);
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {Function} arrayEach
 | |
|    * @param {Function} baseEach
 | |
|    * @param {Function} symbolEach
 | |
|    */
 | |
|   function createConcat(arrayEach, baseEach, symbolEach) {
 | |
|     return function concat(collection, iterator, callback) {
 | |
|       callback = callback || noop;
 | |
|       var size, result;
 | |
|       var completed = 0;
 | |
| 
 | |
|       if (isArray(collection)) {
 | |
|         size = collection.length;
 | |
|         result = Array(size);
 | |
|         arrayEach(collection, iterator, createCallback);
 | |
|       } else if (!collection) {
 | |
|       } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|         result = [];
 | |
|         size = symbolEach(collection, iterator, createCallback);
 | |
|         size && size === completed && callback(null, result);
 | |
|       } else if (typeof collection === obj) {
 | |
|         var keys = nativeKeys(collection);
 | |
|         size = keys.length;
 | |
|         result = Array(size);
 | |
|         baseEach(collection, iterator, createCallback, keys);
 | |
|       }
 | |
|       if (!size) {
 | |
|         callback(null, []);
 | |
|       }
 | |
| 
 | |
|       function createCallback(index) {
 | |
|         return function done(err, res) {
 | |
|           if (index === null) {
 | |
|             throwError();
 | |
|           }
 | |
|           if (err) {
 | |
|             index = null;
 | |
|             callback = once(callback);
 | |
|             arrayEachSync(result, function(array, index) {
 | |
|               if (array === undefined) {
 | |
|                 result[index] = noop;
 | |
|               }
 | |
|             });
 | |
|             callback(err, makeConcatResult(result));
 | |
|             return;
 | |
|           }
 | |
|           switch (arguments.length) {
 | |
|             case 0:
 | |
|             case 1:
 | |
|               result[index] = noop;
 | |
|               break;
 | |
|             case 2:
 | |
|               result[index] = res;
 | |
|               break;
 | |
|             default:
 | |
|               result[index] = slice(arguments, 1);
 | |
|               break;
 | |
|           }
 | |
|           index = null;
 | |
|           if (++completed === size) {
 | |
|             callback(null, makeConcatResult(result));
 | |
|           }
 | |
|         };
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace concatSeries
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, [num]);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.concatSeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3, 2];
 | |
|    *   console.log(order); // [1, 3, 2]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 3, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, [num]);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.concatSeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3, 2]
 | |
|    *   console.log(order); // [[1, 0], [3, 1], [2, 2]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, [num]);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.concatSeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3, 2]
 | |
|    *   console.log(order); // [1, 3, 2]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 3, c: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, [num]);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.concatSeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3, 2]
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'b'], [2, 'c']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function concatSeries(collection, iterator, callback) {
 | |
|     callback = onlyOnce(callback || noop);
 | |
|     var size, key, keys, iter, item, iterate;
 | |
|     var sync = false;
 | |
|     var result = [];
 | |
|     var completed = 0;
 | |
| 
 | |
|     if (isArray(collection)) {
 | |
|       size = collection.length;
 | |
|       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator;
 | |
|     } else if (!collection) {
 | |
|     } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|       size = Infinity;
 | |
|       iter = collection[iteratorSymbol]();
 | |
|       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator;
 | |
|     } else if (typeof collection === obj) {
 | |
|       keys = nativeKeys(collection);
 | |
|       size = keys.length;
 | |
|       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator;
 | |
|     }
 | |
|     if (!size) {
 | |
|       return callback(null, result);
 | |
|     }
 | |
|     iterate();
 | |
| 
 | |
|     function arrayIterator() {
 | |
|       iterator(collection[completed], done);
 | |
|     }
 | |
| 
 | |
|     function arrayIteratorWithIndex() {
 | |
|       iterator(collection[completed], completed, done);
 | |
|     }
 | |
| 
 | |
|     function symbolIterator() {
 | |
|       item = iter.next();
 | |
|       item.done ? callback(null, result) : iterator(item.value, done);
 | |
|     }
 | |
| 
 | |
|     function symbolIteratorWithKey() {
 | |
|       item = iter.next();
 | |
|       item.done ? callback(null, result) : iterator(item.value, completed, done);
 | |
|     }
 | |
| 
 | |
|     function objectIterator() {
 | |
|       iterator(collection[keys[completed]], done);
 | |
|     }
 | |
| 
 | |
|     function objectIteratorWithKey() {
 | |
|       key = keys[completed];
 | |
|       iterator(collection[key], key, done);
 | |
|     }
 | |
| 
 | |
|     function done(err, array) {
 | |
|       if (isArray(array)) {
 | |
|         nativePush.apply(result, array);
 | |
|       } else if (arguments.length >= 2) {
 | |
|         nativePush.apply(result, slice(arguments, 1));
 | |
|       }
 | |
|       if (err) {
 | |
|         callback(err, result);
 | |
|       } else if (++completed === size) {
 | |
|         iterate = throwError;
 | |
|         callback(null, result);
 | |
|       } else if (sync) {
 | |
|         nextTick(iterate);
 | |
|       } else {
 | |
|         sync = true;
 | |
|         iterate();
 | |
|       }
 | |
|       sync = false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace concatLimit
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {number} limit - limit >= 1
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, [num]);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.concatLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3, 5, 2, 4]
 | |
|    *   console.log(order); // [1, 3, 5, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1, 5, 3, 4, 2];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, [num]);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.cocnatLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3, 5, 2, 4]
 | |
|    *   console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, [num]);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.concatLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3, 5, 2, 4]
 | |
|    *   console.log(order); // [1, 3, 5, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, num);
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.cocnatLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // [1, 3, 5, 2, 4]
 | |
|    *   console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function concatLimit(collection, limit, iterator, callback) {
 | |
|     callback = callback || noop;
 | |
|     var size, key, iter, item, iterate, result;
 | |
|     var sync = false;
 | |
|     var started = 0;
 | |
|     var completed = 0;
 | |
| 
 | |
|     if (isArray(collection)) {
 | |
|       size = collection.length;
 | |
|       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator;
 | |
|     } else if (!collection) {
 | |
|     } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|       size = Infinity;
 | |
|       result = [];
 | |
|       iter = collection[iteratorSymbol]();
 | |
|       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator;
 | |
|     } else if (typeof collection === obj) {
 | |
|       var keys = nativeKeys(collection);
 | |
|       size = keys.length;
 | |
|       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator;
 | |
|     }
 | |
|     if (!size || isNaN(limit) || limit < 1) {
 | |
|       return callback(null, []);
 | |
|     }
 | |
|     result = result || Array(size);
 | |
|     timesSync(limit > size ? size : limit, iterate);
 | |
| 
 | |
|     function arrayIterator() {
 | |
|       if (started < size) {
 | |
|         iterator(collection[started], createCallback(started++));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function arrayIteratorWithIndex() {
 | |
|       if (started < size) {
 | |
|         iterator(collection[started], started, createCallback(started++));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function symbolIterator() {
 | |
|       item = iter.next();
 | |
|       if (item.done === false) {
 | |
|         iterator(item.value, createCallback(started++));
 | |
|       } else if (completed === started && iterator !== noop) {
 | |
|         iterator = noop;
 | |
|         callback(null, makeConcatResult(result));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function symbolIteratorWithKey() {
 | |
|       item = iter.next();
 | |
|       if (item.done === false) {
 | |
|         iterator(item.value, started, createCallback(started++));
 | |
|       } else if (completed === started && iterator !== noop) {
 | |
|         iterator = noop;
 | |
|         callback(null, makeConcatResult(result));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function objectIterator() {
 | |
|       if (started < size) {
 | |
|         iterator(collection[keys[started]], createCallback(started++));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function objectIteratorWithKey() {
 | |
|       if (started < size) {
 | |
|         key = keys[started];
 | |
|         iterator(collection[key], key, createCallback(started++));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function createCallback(index) {
 | |
|       return function(err, res) {
 | |
|         if (index === null) {
 | |
|           throwError();
 | |
|         }
 | |
|         if (err) {
 | |
|           index = null;
 | |
|           iterate = noop;
 | |
|           callback = once(callback);
 | |
|           arrayEachSync(result, function(array, index) {
 | |
|             if (array === undefined) {
 | |
|               result[index] = noop;
 | |
|             }
 | |
|           });
 | |
|           callback(err, makeConcatResult(result));
 | |
|           return;
 | |
|         }
 | |
|         switch (arguments.length) {
 | |
|           case 0:
 | |
|           case 1:
 | |
|             result[index] = noop;
 | |
|             break;
 | |
|           case 2:
 | |
|             result[index] = res;
 | |
|             break;
 | |
|           default:
 | |
|             result[index] = slice(arguments, 1);
 | |
|             break;
 | |
|         }
 | |
|         index = null;
 | |
|         if (++completed === size) {
 | |
|           iterate = throwError;
 | |
|           callback(null, makeConcatResult(result));
 | |
|           callback = throwError;
 | |
|         } else if (sync) {
 | |
|           nextTick(iterate);
 | |
|         } else {
 | |
|           sync = true;
 | |
|           iterate();
 | |
|         }
 | |
|         sync = false;
 | |
|       };
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {Function} arrayEach
 | |
|    * @param {Function} baseEach
 | |
|    * @param {Function} symbolEach
 | |
|    */
 | |
|   function createGroupBy(arrayEach, baseEach, symbolEach) {
 | |
|     return function groupBy(collection, iterator, callback) {
 | |
|       callback = callback || noop;
 | |
|       var size;
 | |
|       var completed = 0;
 | |
|       var result = {};
 | |
| 
 | |
|       if (isArray(collection)) {
 | |
|         size = collection.length;
 | |
|         arrayEach(collection, iterator, createCallback);
 | |
|       } else if (!collection) {
 | |
|       } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|         size = symbolEach(collection, iterator, createCallback);
 | |
|         size && size === completed && callback(null, result);
 | |
|       } else if (typeof collection === obj) {
 | |
|         var keys = nativeKeys(collection);
 | |
|         size = keys.length;
 | |
|         baseEach(collection, iterator, createCallback, keys);
 | |
|       }
 | |
|       if (!size) {
 | |
|         callback(null, {});
 | |
|       }
 | |
| 
 | |
|       function createCallback(value) {
 | |
|         var called = false;
 | |
|         return function done(err, key) {
 | |
|           if (called) {
 | |
|             throwError();
 | |
|           }
 | |
|           called = true;
 | |
|           if (err) {
 | |
|             callback = once(callback);
 | |
|             callback(err, objectClone(result));
 | |
|             return;
 | |
|           }
 | |
|           var array = result[key];
 | |
|           if (!array) {
 | |
|             result[key] = [value];
 | |
|           } else {
 | |
|             array.push(value);
 | |
|           }
 | |
|           if (++completed === size) {
 | |
|             callback(null, result);
 | |
|           }
 | |
|         };
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace groupBySeries
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [4.2, 6.4, 6.1];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, Math.floor(num));
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.groupBySeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '4': [4.2], '6': [6.4, 6.1] }
 | |
|    *   console.log(order); // [4.2, 6.4, 6.1]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [4.2, 6.4, 6.1];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, Math.floor(num));
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.groupBySeries(array, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '4': [4.2], '6': [6.4, 6.1] }
 | |
|    *   console.log(order); // [[4.2, 0], [6.4, 1], [6.1, 2]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 4.2, b: 6.4, c: 6.1 };
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, Math.floor(num));
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.groupBySeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '4': [4.2], '6': [6.4, 6.1] }
 | |
|    *   console.log(order); // [4.2, 6.4, 6.1]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 4.2, b: 6.4, c: 6.1 };
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, Math.floor(num));
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.groupBySeries(object, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '4': [4.2], '6': [6.4, 6.1] }
 | |
|    *   console.log(order); // [[4.2, 'a'], [6.4, 'b'], [6.1, 'c']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function groupBySeries(collection, iterator, callback) {
 | |
|     callback = onlyOnce(callback || noop);
 | |
|     var size, key, value, keys, iter, item, iterate;
 | |
|     var sync = false;
 | |
|     var completed = 0;
 | |
|     var result = {};
 | |
| 
 | |
|     if (isArray(collection)) {
 | |
|       size = collection.length;
 | |
|       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator;
 | |
|     } else if (!collection) {
 | |
|     } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|       size = Infinity;
 | |
|       iter = collection[iteratorSymbol]();
 | |
|       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator;
 | |
|     } else if (typeof collection === obj) {
 | |
|       keys = nativeKeys(collection);
 | |
|       size = keys.length;
 | |
|       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator;
 | |
|     }
 | |
|     if (!size) {
 | |
|       return callback(null, result);
 | |
|     }
 | |
|     iterate();
 | |
| 
 | |
|     function arrayIterator() {
 | |
|       value = collection[completed];
 | |
|       iterator(value, done);
 | |
|     }
 | |
| 
 | |
|     function arrayIteratorWithIndex() {
 | |
|       value = collection[completed];
 | |
|       iterator(value, completed, done);
 | |
|     }
 | |
| 
 | |
|     function symbolIterator() {
 | |
|       item = iter.next();
 | |
|       value = item.value;
 | |
|       item.done ? callback(null, result) : iterator(value, done);
 | |
|     }
 | |
| 
 | |
|     function symbolIteratorWithKey() {
 | |
|       item = iter.next();
 | |
|       value = item.value;
 | |
|       item.done ? callback(null, result) : iterator(value, completed, done);
 | |
|     }
 | |
| 
 | |
|     function objectIterator() {
 | |
|       value = collection[keys[completed]];
 | |
|       iterator(value, done);
 | |
|     }
 | |
| 
 | |
|     function objectIteratorWithKey() {
 | |
|       key = keys[completed];
 | |
|       value = collection[key];
 | |
|       iterator(value, key, done);
 | |
|     }
 | |
| 
 | |
|     function done(err, key) {
 | |
|       if (err) {
 | |
|         iterate = throwError;
 | |
|         callback = onlyOnce(callback);
 | |
|         callback(err, objectClone(result));
 | |
|         return;
 | |
|       }
 | |
|       var array = result[key];
 | |
|       if (!array) {
 | |
|         result[key] = [value];
 | |
|       } else {
 | |
|         array.push(value);
 | |
|       }
 | |
|       if (++completed === size) {
 | |
|         iterate = throwError;
 | |
|         callback(null, result);
 | |
|       } else if (sync) {
 | |
|         nextTick(iterate);
 | |
|       } else {
 | |
|         sync = true;
 | |
|         iterate();
 | |
|       }
 | |
|       sync = false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace groupByLimit
 | |
|    * @param {Array|Object} collection
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var order = [];
 | |
|    * var array = [1.1, 5.9, 3.2, 3.9, 2.1];
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, Math.floor(num));
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.groupByLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '1': [1.1], '3': [3.2, 3.9], '5': [5.9], '2': [2.1] }
 | |
|    *   console.log(order); // [1.1, 3.2, 5.9, 2.1, 3.9]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // array with index
 | |
|    * var order = [];
 | |
|    * var array = [1.1, 5.9, 3.2, 3.9, 2.1];
 | |
|    * var iterator = function(num, index, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, index]);
 | |
|    *     done(null, Math.floor(num));
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.groupByLimit(array, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '1': [1.1], '3': [3.2, 3.9], '5': [5.9], '2': [2.1] }
 | |
|    *   console.log(order); // [[1.1, 0], [3.2, 2], [5.9, 1], [2.1, 4], [3.9, 3]]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var order = [];
 | |
|    * var object = { a: 1.1, b: 5.9, c: 3.2, d: 3.9, e: 2.1 }
 | |
|    * var iterator = function(num, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push(num);
 | |
|    *     done(null, Math.floor(num));
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.groupByLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '1': [1.1], '3': [3.2, 3.9], '5': [5.9], '2': [2.1] }
 | |
|    *   console.log(order); // [1.1, 3.2, 5.9, 2.1, 3.9]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object with key
 | |
|    * var order = [];
 | |
|    * var object = { a: 1.1, b: 5.9, c: 3.2, d: 3.9, e: 2.1 }
 | |
|    * var iterator = function(num, key, done) {
 | |
|    *   setTimeout(function() {
 | |
|    *     order.push([num, key]);
 | |
|    *     done(null, Math.floor(num));
 | |
|    *   }, num * 10);
 | |
|    * };
 | |
|    * async.groupByLimit(object, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // { '1': [1.1], '3': [3.2, 3.9], '5': [5.9], '2': [2.1] }
 | |
|    *   console.log(order); // [[1.1, 'a'], [3.2, 'c'], [5.9, 'b'], [2.1, 'e'], [3.9, 'd']]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function groupByLimit(collection, limit, iterator, callback) {
 | |
|     callback = callback || noop;
 | |
|     var size, index, key, value, keys, iter, item, iterate;
 | |
|     var sync = false;
 | |
|     var started = 0;
 | |
|     var completed = 0;
 | |
|     var result = {};
 | |
| 
 | |
|     if (isArray(collection)) {
 | |
|       size = collection.length;
 | |
|       iterate = iterator.length === 3 ? arrayIteratorWithIndex : arrayIterator;
 | |
|     } else if (!collection) {
 | |
|     } else if (iteratorSymbol && collection[iteratorSymbol]) {
 | |
|       size = Infinity;
 | |
|       iter = collection[iteratorSymbol]();
 | |
|       iterate = iterator.length === 3 ? symbolIteratorWithKey : symbolIterator;
 | |
|     } else if (typeof collection === obj) {
 | |
|       keys = nativeKeys(collection);
 | |
|       size = keys.length;
 | |
|       iterate = iterator.length === 3 ? objectIteratorWithKey : objectIterator;
 | |
|     }
 | |
|     if (!size || isNaN(limit) || limit < 1) {
 | |
|       return callback(null, result);
 | |
|     }
 | |
|     timesSync(limit > size ? size : limit, iterate);
 | |
| 
 | |
|     function arrayIterator() {
 | |
|       if (started < size) {
 | |
|         value = collection[started++];
 | |
|         iterator(value, createCallback(value));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function arrayIteratorWithIndex() {
 | |
|       index = started++;
 | |
|       if (index < size) {
 | |
|         value = collection[index];
 | |
|         iterator(value, index, createCallback(value));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function symbolIterator() {
 | |
|       item = iter.next();
 | |
|       if (item.done === false) {
 | |
|         started++;
 | |
|         value = item.value;
 | |
|         iterator(value, createCallback(value));
 | |
|       } else if (completed === started && iterator !== noop) {
 | |
|         iterator = noop;
 | |
|         callback(null, result);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function symbolIteratorWithKey() {
 | |
|       item = iter.next();
 | |
|       if (item.done === false) {
 | |
|         value = item.value;
 | |
|         iterator(value, started++, createCallback(value));
 | |
|       } else if (completed === started && iterator !== noop) {
 | |
|         iterator = noop;
 | |
|         callback(null, result);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function objectIterator() {
 | |
|       if (started < size) {
 | |
|         value = collection[keys[started++]];
 | |
|         iterator(value, createCallback(value));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function objectIteratorWithKey() {
 | |
|       if (started < size) {
 | |
|         key = keys[started++];
 | |
|         value = collection[key];
 | |
|         iterator(value, key, createCallback(value));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function createCallback(value) {
 | |
|       var called = false;
 | |
|       return function(err, key) {
 | |
|         if (called) {
 | |
|           throwError();
 | |
|         }
 | |
|         called = true;
 | |
|         if (err) {
 | |
|           iterate = noop;
 | |
|           callback = once(callback);
 | |
|           callback(err, objectClone(result));
 | |
|           return;
 | |
|         }
 | |
|         var array = result[key];
 | |
|         if (!array) {
 | |
|           result[key] = [value];
 | |
|         } else {
 | |
|           array.push(value);
 | |
|         }
 | |
|         if (++completed === size) {
 | |
|           callback(null, result);
 | |
|         } else if (sync) {
 | |
|           nextTick(iterate);
 | |
|         } else {
 | |
|           sync = true;
 | |
|           iterate();
 | |
|         }
 | |
|         sync = false;
 | |
|       };
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    * @param {Function} arrayEach
 | |
|    * @param {Function} baseEach
 | |
|    */
 | |
|   function createParallel(arrayEach, baseEach) {
 | |
|     return function parallel(tasks, callback) {
 | |
|       callback = callback || noop;
 | |
|       var size, keys, result;
 | |
|       var completed = 0;
 | |
| 
 | |
|       if (isArray(tasks)) {
 | |
|         size = tasks.length;
 | |
|         result = Array(size);
 | |
|         arrayEach(tasks, createCallback);
 | |
|       } else if (tasks && typeof tasks === obj) {
 | |
|         keys = nativeKeys(tasks);
 | |
|         size = keys.length;
 | |
|         result = {};
 | |
|         baseEach(tasks, createCallback, keys);
 | |
|       }
 | |
|       if (!size) {
 | |
|         callback(null, result);
 | |
|       }
 | |
| 
 | |
|       function createCallback(key) {
 | |
|         return function(err, res) {
 | |
|           if (key === null) {
 | |
|             throwError();
 | |
|           }
 | |
|           if (err) {
 | |
|             key = null;
 | |
|             callback = once(callback);
 | |
|             callback(err, result);
 | |
|             return;
 | |
|           }
 | |
|           result[key] = arguments.length <= 2 ? res : slice(arguments, 1);
 | |
|           key = null;
 | |
|           if (++completed === size) {
 | |
|             callback(null, result);
 | |
|           }
 | |
|         };
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace series
 | |
|    * @param {Array|Object} tasks - functions
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * var order = [];
 | |
|    * var tasks = [
 | |
|    *  function(done) {
 | |
|    *    setTimeout(function() {
 | |
|    *      order.push(1);
 | |
|    *      done(null, 1);
 | |
|    *    }, 10);
 | |
|    *  },
 | |
|    *  function(done) {
 | |
|    *    setTimeout(function() {
 | |
|    *      order.push(2);
 | |
|    *      done(null, 2);
 | |
|    *    }, 30);
 | |
|    *  },
 | |
|    *  function(done) {
 | |
|    *    setTimeout(function() {
 | |
|    *      order.push(3);
 | |
|    *      done(null, 3);
 | |
|    *    }, 40);
 | |
|    *  },
 | |
|    *  function(done) {
 | |
|    *    setTimeout(function() {
 | |
|    *      order.push(4);
 | |
|    *      done(null, 4);
 | |
|    *    }, 20);
 | |
|    *  }
 | |
|    * ];
 | |
|    * async.series(tasks, function(err, res) {
 | |
|    *   console.log(res); // [1, 2, 3, 4];
 | |
|    *   console.log(order); // [1, 2, 3, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * var order = [];
 | |
|    * var tasks = {
 | |
|    *   'a': function(done) {
 | |
|    *     setTimeout(function() {
 | |
|    *       order.push(1);
 | |
|    *       done(null, 1);
 | |
|    *     }, 10);
 | |
|    *   },
 | |
|    *   'b': function(done) {
 | |
|    *     setTimeout(function() {
 | |
|    *       order.push(2);
 | |
|    *       done(null, 2);
 | |
|    *     }, 30);
 | |
|    *   },
 | |
|    *   'c': function(done) {
 | |
|    *     setTimeout(function() {
 | |
|    *       order.push(3);
 | |
|    *       done(null, 3);
 | |
|    *     }, 40);
 | |
|    *   },
 | |
|    *   'd': function(done) {
 | |
|    *     setTimeout(function() {
 | |
|    *       order.push(4);
 | |
|    *       done(null, 4);
 | |
|    *     }, 20);
 | |
|    *   }
 | |
|    * };
 | |
|    * async.series(tasks, function(err, res) {
 | |
|    *   console.log(res); // { a: 1, b: 2, c: 3, d:4 }
 | |
|    *   console.log(order); // [1, 4, 2, 3]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function series(tasks, callback) {
 | |
|     callback = callback || noop;
 | |
|     var size, key, keys, result, iterate;
 | |
|     var sync = false;
 | |
|     var completed = 0;
 | |
| 
 | |
|     if (isArray(tasks)) {
 | |
|       size = tasks.length;
 | |
|       result = Array(size);
 | |
|       iterate = arrayIterator;
 | |
|     } else if (tasks && typeof tasks === obj) {
 | |
|       keys = nativeKeys(tasks);
 | |
|       size = keys.length;
 | |
|       result = {};
 | |
|       iterate = objectIterator;
 | |
|     } else {
 | |
|       return callback(null);
 | |
|     }
 | |
|     if (!size) {
 | |
|       return callback(null, result);
 | |
|     }
 | |
|     iterate();
 | |
| 
 | |
|     function arrayIterator() {
 | |
|       key = completed;
 | |
|       tasks[completed](done);
 | |
|     }
 | |
| 
 | |
|     function objectIterator() {
 | |
|       key = keys[completed];
 | |
|       tasks[key](done);
 | |
|     }
 | |
| 
 | |
|     function done(err, res) {
 | |
|       if (err) {
 | |
|         iterate = throwError;
 | |
|         callback = onlyOnce(callback);
 | |
|         callback(err, result);
 | |
|         return;
 | |
|       }
 | |
|       result[key] = arguments.length <= 2 ? res : slice(arguments, 1);
 | |
|       if (++completed === size) {
 | |
|         iterate = throwError;
 | |
|         callback(null, result);
 | |
|       } else if (sync) {
 | |
|         nextTick(iterate);
 | |
|       } else {
 | |
|         sync = true;
 | |
|         iterate();
 | |
|       }
 | |
|       sync = false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace parallelLimit
 | |
|    * @param {Array|Object} tasks - functions
 | |
|    * @param {number} limit - limit >= 1
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * var order = [];
 | |
|    * var tasks = [
 | |
|    *  function(done) {
 | |
|    *    setTimeout(function() {
 | |
|    *      order.push(1);
 | |
|    *      done(null, 1);
 | |
|    *    }, 10);
 | |
|    *  },
 | |
|    *  function(done) {
 | |
|    *    setTimeout(function() {
 | |
|    *      order.push(2);
 | |
|    *      done(null, 2);
 | |
|    *    }, 50);
 | |
|    *  },
 | |
|    *  function(done) {
 | |
|    *    setTimeout(function() {
 | |
|    *      order.push(3);
 | |
|    *      done(null, 3);
 | |
|    *    }, 30);
 | |
|    *  },
 | |
|    *  function(done) {
 | |
|    *    setTimeout(function() {
 | |
|    *      order.push(4);
 | |
|    *      done(null, 4);
 | |
|    *    }, 40);
 | |
|    *  }
 | |
|    * ];
 | |
|    * async.parallelLimit(tasks, 2, function(err, res) {
 | |
|    *   console.log(res); // [1, 2, 3, 4];
 | |
|    *   console.log(order); // [1, 3, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * var order = [];
 | |
|    * var tasks = {
 | |
|    *   'a': function(done) {
 | |
|    *     setTimeout(function() {
 | |
|    *       order.push(1);
 | |
|    *       done(null, 1);
 | |
|    *     }, 10);
 | |
|    *   },
 | |
|    *   'b': function(done) {
 | |
|    *     setTimeout(function() {
 | |
|    *       order.push(2);
 | |
|    *       done(null, 2);
 | |
|    *     }, 50);
 | |
|    *   },
 | |
|    *   'c': function(done) {
 | |
|    *     setTimeout(function() {
 | |
|    *       order.push(3);
 | |
|    *       done(null, 3);
 | |
|    *     }, 20);
 | |
|    *   },
 | |
|    *   'd': function(done) {
 | |
|    *     setTimeout(function() {
 | |
|    *       order.push(4);
 | |
|    *       done(null, 4);
 | |
|    *     }, 40);
 | |
|    *   }
 | |
|    * };
 | |
|    * async.parallelLimit(tasks, 2, function(err, res) {
 | |
|    *   console.log(res); // { a: 1, b: 2, c: 3, d:4 }
 | |
|    *   console.log(order); // [1, 3, 2, 4]
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function parallelLimit(tasks, limit, callback) {
 | |
|     callback = callback || noop;
 | |
|     var size, index, key, keys, result, iterate;
 | |
|     var sync = false;
 | |
|     var started = 0;
 | |
|     var completed = 0;
 | |
| 
 | |
|     if (isArray(tasks)) {
 | |
|       size = tasks.length;
 | |
|       result = Array(size);
 | |
|       iterate = arrayIterator;
 | |
|     } else if (tasks && typeof tasks === obj) {
 | |
|       keys = nativeKeys(tasks);
 | |
|       size = keys.length;
 | |
|       result = {};
 | |
|       iterate = objectIterator;
 | |
|     }
 | |
|     if (!size || isNaN(limit) || limit < 1) {
 | |
|       return callback(null, result);
 | |
|     }
 | |
|     timesSync(limit > size ? size : limit, iterate);
 | |
| 
 | |
|     function arrayIterator() {
 | |
|       index = started++;
 | |
|       if (index < size) {
 | |
|         tasks[index](createCallback(index));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function objectIterator() {
 | |
|       if (started < size) {
 | |
|         key = keys[started++];
 | |
|         tasks[key](createCallback(key));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function createCallback(key) {
 | |
|       return function(err, res) {
 | |
|         if (key === null) {
 | |
|           throwError();
 | |
|         }
 | |
|         if (err) {
 | |
|           key = null;
 | |
|           iterate = noop;
 | |
|           callback = once(callback);
 | |
|           callback(err, result);
 | |
|           return;
 | |
|         }
 | |
|         result[key] = arguments.length <= 2 ? res : slice(arguments, 1);
 | |
|         key = null;
 | |
|         if (++completed === size) {
 | |
|           callback(null, result);
 | |
|         } else if (sync) {
 | |
|           nextTick(iterate);
 | |
|         } else {
 | |
|           sync = true;
 | |
|           iterate();
 | |
|         }
 | |
|         sync = false;
 | |
|       };
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace tryEach
 | |
|    * @param {Array|Object} tasks - functions
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * var tasks = [
 | |
|    *  function(done) {
 | |
|    *    setTimeout(function() {
 | |
|    *      done(new Error('error'));
 | |
|    *    }, 10);
 | |
|    *  },
 | |
|    *  function(done) {
 | |
|    *    setTimeout(function() {
 | |
|    *      done(null, 2);
 | |
|    *    }, 10);
 | |
|    *  }
 | |
|    * ];
 | |
|    * async.tryEach(tasks, function(err, res) {
 | |
|    *   console.log(res); // 2
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * var tasks = [
 | |
|    *  function(done) {
 | |
|    *    setTimeout(function() {
 | |
|    *      done(new Error('error1'));
 | |
|    *    }, 10);
 | |
|    *  },
 | |
|    *  function(done) {
 | |
|    *    setTimeout(function() {
 | |
|    *      done(new Error('error2');
 | |
|    *    }, 10);
 | |
|    *  }
 | |
|    * ];
 | |
|    * async.tryEach(tasks, function(err, res) {
 | |
|    *   console.log(err); // error2
 | |
|    *   console.log(res); // undefined
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function tryEach(tasks, callback) {
 | |
|     callback = callback || noop;
 | |
|     var size, keys, iterate;
 | |
|     var sync = false;
 | |
|     var completed = 0;
 | |
| 
 | |
|     if (isArray(tasks)) {
 | |
|       size = tasks.length;
 | |
|       iterate = arrayIterator;
 | |
|     } else if (tasks && typeof tasks === obj) {
 | |
|       keys = nativeKeys(tasks);
 | |
|       size = keys.length;
 | |
|       iterate = objectIterator;
 | |
|     }
 | |
|     if (!size) {
 | |
|       return callback(null);
 | |
|     }
 | |
|     iterate();
 | |
| 
 | |
|     function arrayIterator() {
 | |
|       tasks[completed](done);
 | |
|     }
 | |
| 
 | |
|     function objectIterator() {
 | |
|       tasks[keys[completed]](done);
 | |
|     }
 | |
| 
 | |
|     function done(err, res) {
 | |
|       if (!err) {
 | |
|         if (arguments.length <= 2) {
 | |
|           callback(null, res);
 | |
|         } else {
 | |
|           callback(null, slice(arguments, 1));
 | |
|         }
 | |
|       } else if (++completed === size) {
 | |
|         callback(err);
 | |
|       } else {
 | |
|         sync = true;
 | |
|         iterate();
 | |
|       }
 | |
|       sync = false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * check for waterfall tasks
 | |
|    * @private
 | |
|    * @param {Array} tasks
 | |
|    * @param {Function} callback
 | |
|    * @return {boolean}
 | |
|    */
 | |
|   function checkWaterfallTasks(tasks, callback) {
 | |
|     if (!isArray(tasks)) {
 | |
|       callback(new Error('First argument to waterfall must be an array of functions'));
 | |
|       return false;
 | |
|     }
 | |
|     if (tasks.length === 0) {
 | |
|       callback(null);
 | |
|       return false;
 | |
|     }
 | |
|     return true;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * check for waterfall tasks
 | |
|    * @private
 | |
|    * @param {function} func
 | |
|    * @param {Array|Object} args - arguments
 | |
|    * @return {function} next
 | |
|    */
 | |
|   function waterfallIterator(func, args, next) {
 | |
|     switch (args.length) {
 | |
|       case 0:
 | |
|       case 1:
 | |
|         return func(next);
 | |
|       case 2:
 | |
|         return func(args[1], next);
 | |
|       case 3:
 | |
|         return func(args[1], args[2], next);
 | |
|       case 4:
 | |
|         return func(args[1], args[2], args[3], next);
 | |
|       case 5:
 | |
|         return func(args[1], args[2], args[3], args[4], next);
 | |
|       case 6:
 | |
|         return func(args[1], args[2], args[3], args[4], args[5], next);
 | |
|       default:
 | |
|         args = slice(args, 1);
 | |
|         args.push(next);
 | |
|         return func.apply(null, args);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace waterfall
 | |
|    * @param {Array} tasks - functions
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * var order = [];
 | |
|    * var tasks = [
 | |
|    *   function(next) {
 | |
|    *     setTimeout(function() {
 | |
|    *       order.push(1);
 | |
|    *       next(null, 1);
 | |
|    *     }, 10);
 | |
|    *   },
 | |
|    *   function(arg1, next) {
 | |
|    *     setTimeout(function() {
 | |
|    *       order.push(2);
 | |
|    *       next(null, 1, 2);
 | |
|    *     }, 30);
 | |
|    *   },
 | |
|    *   function(arg1, arg2, next) {
 | |
|    *     setTimeout(function() {
 | |
|    *       order.push(3);
 | |
|    *       next(null, 3);
 | |
|    *     }, 20);
 | |
|    *   },
 | |
|    *   function(arg1, next) {
 | |
|    *     setTimeout(function() {
 | |
|    *       order.push(4);
 | |
|    *       next(null, 1, 2, 3, 4);
 | |
|    *     }, 40);
 | |
|    *   }
 | |
|    * ];
 | |
|    * async.waterfall(tasks, function(err, arg1, arg2, arg3, arg4) {
 | |
|    *   console.log(arg1, arg2, arg3, arg4); // 1 2 3 4
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function waterfall(tasks, callback) {
 | |
|     callback = callback || noop;
 | |
|     if (!checkWaterfallTasks(tasks, callback)) {
 | |
|       return;
 | |
|     }
 | |
|     var func, args, done, sync;
 | |
|     var completed = 0;
 | |
|     var size = tasks.length;
 | |
|     waterfallIterator(tasks[0], [], createCallback(0));
 | |
| 
 | |
|     function iterate() {
 | |
|       waterfallIterator(func, args, createCallback(func));
 | |
|     }
 | |
| 
 | |
|     function createCallback(index) {
 | |
|       return function next(err, res) {
 | |
|         if (index === undefined) {
 | |
|           callback = noop;
 | |
|           throwError();
 | |
|         }
 | |
|         index = undefined;
 | |
|         if (err) {
 | |
|           done = callback;
 | |
|           callback = throwError;
 | |
|           done(err);
 | |
|           return;
 | |
|         }
 | |
|         if (++completed === size) {
 | |
|           done = callback;
 | |
|           callback = throwError;
 | |
|           if (arguments.length <= 2) {
 | |
|             done(err, res);
 | |
|           } else {
 | |
|             done.apply(null, createArray(arguments));
 | |
|           }
 | |
|           return;
 | |
|         }
 | |
|         if (sync) {
 | |
|           args = arguments;
 | |
|           func = tasks[completed] || throwError;
 | |
|           nextTick(iterate);
 | |
|         } else {
 | |
|           sync = true;
 | |
|           waterfallIterator(tasks[completed] || throwError, arguments, createCallback(completed));
 | |
|         }
 | |
|         sync = false;
 | |
|       };
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * `angelFall` is like `waterfall` and inject callback to last argument of next task.
 | |
|    *
 | |
|    * @memberof async
 | |
|    * @namespace angelFall
 | |
|    * @param {Array} tasks - functions
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * var order = [];
 | |
|    * var tasks = [
 | |
|    *   function(next) {
 | |
|    *     setTimeout(function() {
 | |
|    *       order.push(1);
 | |
|    *       next(null, 1);
 | |
|    *     }, 10);
 | |
|    *   },
 | |
|    *   function(arg1, empty, next) {
 | |
|    *     setTimeout(function() {
 | |
|    *       order.push(2);
 | |
|    *       next(null, 1, 2);
 | |
|    *     }, 30);
 | |
|    *   },
 | |
|    *   function(next) {
 | |
|    *     setTimeout(function() {
 | |
|    *       order.push(3);
 | |
|    *       next(null, 3);
 | |
|    *     }, 20);
 | |
|    *   },
 | |
|    *   function(arg1, empty1, empty2, empty3, next) {
 | |
|    *     setTimeout(function() {
 | |
|    *       order.push(4);
 | |
|    *       next(null, 1, 2, 3, 4);
 | |
|    *     }, 40);
 | |
|    *   }
 | |
|    * ];
 | |
|    * async.angelFall(tasks, function(err, arg1, arg2, arg3, arg4) {
 | |
|    *   console.log(arg1, arg2, arg3, arg4); // 1 2 3 4
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function angelFall(tasks, callback) {
 | |
|     callback = callback || noop;
 | |
|     if (!checkWaterfallTasks(tasks, callback)) {
 | |
|       return;
 | |
|     }
 | |
|     var completed = 0;
 | |
|     var sync = false;
 | |
|     var size = tasks.length;
 | |
|     var func = tasks[completed];
 | |
|     var args = [];
 | |
|     var iterate = function() {
 | |
|       switch (func.length) {
 | |
|         case 0:
 | |
|           try {
 | |
|             next(null, func());
 | |
|           } catch (e) {
 | |
|             next(e);
 | |
|           }
 | |
|           return;
 | |
|         case 1:
 | |
|           return func(next);
 | |
|         case 2:
 | |
|           return func(args[1], next);
 | |
|         case 3:
 | |
|           return func(args[1], args[2], next);
 | |
|         case 4:
 | |
|           return func(args[1], args[2], args[3], next);
 | |
|         case 5:
 | |
|           return func(args[1], args[2], args[3], args[4], next);
 | |
|         default:
 | |
|           args = slice(args, 1);
 | |
|           args[func.length - 1] = next;
 | |
|           return func.apply(null, args);
 | |
|       }
 | |
|     };
 | |
|     iterate();
 | |
| 
 | |
|     function next(err, res) {
 | |
|       if (err) {
 | |
|         iterate = throwError;
 | |
|         callback = onlyOnce(callback);
 | |
|         callback(err);
 | |
|         return;
 | |
|       }
 | |
|       if (++completed === size) {
 | |
|         iterate = throwError;
 | |
|         var done = callback;
 | |
|         callback = throwError;
 | |
|         if (arguments.length === 2) {
 | |
|           done(err, res);
 | |
|         } else {
 | |
|           done.apply(null, createArray(arguments));
 | |
|         }
 | |
|         return;
 | |
|       }
 | |
|       func = tasks[completed];
 | |
|       args = arguments;
 | |
|       if (sync) {
 | |
|         nextTick(iterate);
 | |
|       } else {
 | |
|         sync = true;
 | |
|         iterate();
 | |
|       }
 | |
|       sync = false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace whilst
 | |
|    * @param {Function} test
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    */
 | |
|   function whilst(test, iterator, callback) {
 | |
|     callback = callback || noop;
 | |
|     var sync = false;
 | |
|     if (test()) {
 | |
|       iterate();
 | |
|     } else {
 | |
|       callback(null);
 | |
|     }
 | |
| 
 | |
|     function iterate() {
 | |
|       if (sync) {
 | |
|         nextTick(next);
 | |
|       } else {
 | |
|         sync = true;
 | |
|         iterator(done);
 | |
|       }
 | |
|       sync = false;
 | |
|     }
 | |
| 
 | |
|     function next() {
 | |
|       iterator(done);
 | |
|     }
 | |
| 
 | |
|     function done(err, arg) {
 | |
|       if (err) {
 | |
|         return callback(err);
 | |
|       }
 | |
|       if (arguments.length <= 2) {
 | |
|         if (test(arg)) {
 | |
|           iterate();
 | |
|         } else {
 | |
|           callback(null, arg);
 | |
|         }
 | |
|         return;
 | |
|       }
 | |
|       arg = slice(arguments, 1);
 | |
|       if (test.apply(null, arg)) {
 | |
|         iterate();
 | |
|       } else {
 | |
|         callback.apply(null, [null].concat(arg));
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace doWhilst
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} test
 | |
|    * @param {Function} callback
 | |
|    */
 | |
|   function doWhilst(iterator, test, callback) {
 | |
|     callback = callback || noop;
 | |
|     var sync = false;
 | |
|     next();
 | |
| 
 | |
|     function iterate() {
 | |
|       if (sync) {
 | |
|         nextTick(next);
 | |
|       } else {
 | |
|         sync = true;
 | |
|         iterator(done);
 | |
|       }
 | |
|       sync = false;
 | |
|     }
 | |
| 
 | |
|     function next() {
 | |
|       iterator(done);
 | |
|     }
 | |
| 
 | |
|     function done(err, arg) {
 | |
|       if (err) {
 | |
|         return callback(err);
 | |
|       }
 | |
|       if (arguments.length <= 2) {
 | |
|         if (test(arg)) {
 | |
|           iterate();
 | |
|         } else {
 | |
|           callback(null, arg);
 | |
|         }
 | |
|         return;
 | |
|       }
 | |
|       arg = slice(arguments, 1);
 | |
|       if (test.apply(null, arg)) {
 | |
|         iterate();
 | |
|       } else {
 | |
|         callback.apply(null, [null].concat(arg));
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace until
 | |
|    * @param {Function} test
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    */
 | |
|   function until(test, iterator, callback) {
 | |
|     callback = callback || noop;
 | |
|     var sync = false;
 | |
|     if (!test()) {
 | |
|       iterate();
 | |
|     } else {
 | |
|       callback(null);
 | |
|     }
 | |
| 
 | |
|     function iterate() {
 | |
|       if (sync) {
 | |
|         nextTick(next);
 | |
|       } else {
 | |
|         sync = true;
 | |
|         iterator(done);
 | |
|       }
 | |
|       sync = false;
 | |
|     }
 | |
| 
 | |
|     function next() {
 | |
|       iterator(done);
 | |
|     }
 | |
| 
 | |
|     function done(err, arg) {
 | |
|       if (err) {
 | |
|         return callback(err);
 | |
|       }
 | |
|       if (arguments.length <= 2) {
 | |
|         if (!test(arg)) {
 | |
|           iterate();
 | |
|         } else {
 | |
|           callback(null, arg);
 | |
|         }
 | |
|         return;
 | |
|       }
 | |
|       arg = slice(arguments, 1);
 | |
|       if (!test.apply(null, arg)) {
 | |
|         iterate();
 | |
|       } else {
 | |
|         callback.apply(null, [null].concat(arg));
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace doUntil
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} test
 | |
|    * @param {Function} callback
 | |
|    */
 | |
|   function doUntil(iterator, test, callback) {
 | |
|     callback = callback || noop;
 | |
|     var sync = false;
 | |
|     next();
 | |
| 
 | |
|     function iterate() {
 | |
|       if (sync) {
 | |
|         nextTick(next);
 | |
|       } else {
 | |
|         sync = true;
 | |
|         iterator(done);
 | |
|       }
 | |
|       sync = false;
 | |
|     }
 | |
| 
 | |
|     function next() {
 | |
|       iterator(done);
 | |
|     }
 | |
| 
 | |
|     function done(err, arg) {
 | |
|       if (err) {
 | |
|         return callback(err);
 | |
|       }
 | |
|       if (arguments.length <= 2) {
 | |
|         if (!test(arg)) {
 | |
|           iterate();
 | |
|         } else {
 | |
|           callback(null, arg);
 | |
|         }
 | |
|         return;
 | |
|       }
 | |
|       arg = slice(arguments, 1);
 | |
|       if (!test.apply(null, arg)) {
 | |
|         iterate();
 | |
|       } else {
 | |
|         callback.apply(null, [null].concat(arg));
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace during
 | |
|    * @param {Function} test
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    */
 | |
|   function during(test, iterator, callback) {
 | |
|     callback = callback || noop;
 | |
|     _test();
 | |
| 
 | |
|     function _test() {
 | |
|       test(iterate);
 | |
|     }
 | |
| 
 | |
|     function iterate(err, truth) {
 | |
|       if (err) {
 | |
|         return callback(err);
 | |
|       }
 | |
|       if (truth) {
 | |
|         iterator(done);
 | |
|       } else {
 | |
|         callback(null);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function done(err) {
 | |
|       if (err) {
 | |
|         return callback(err);
 | |
|       }
 | |
|       _test();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace doDuring
 | |
|    * @param {Function} test
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    */
 | |
|   function doDuring(iterator, test, callback) {
 | |
|     callback = callback || noop;
 | |
|     iterate(null, true);
 | |
| 
 | |
|     function iterate(err, truth) {
 | |
|       if (err) {
 | |
|         return callback(err);
 | |
|       }
 | |
|       if (truth) {
 | |
|         iterator(done);
 | |
|       } else {
 | |
|         callback(null);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function done(err, res) {
 | |
|       if (err) {
 | |
|         return callback(err);
 | |
|       }
 | |
|       switch (arguments.length) {
 | |
|         case 0:
 | |
|         case 1:
 | |
|           test(iterate);
 | |
|           break;
 | |
|         case 2:
 | |
|           test(res, iterate);
 | |
|           break;
 | |
|         default:
 | |
|           var args = slice(arguments, 1);
 | |
|           args.push(iterate);
 | |
|           test.apply(null, args);
 | |
|           break;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace forever
 | |
|    */
 | |
|   function forever(iterator, callback) {
 | |
|     var sync = false;
 | |
|     iterate();
 | |
| 
 | |
|     function iterate() {
 | |
|       iterator(next);
 | |
|     }
 | |
| 
 | |
|     function next(err) {
 | |
|       if (err) {
 | |
|         if (callback) {
 | |
|           return callback(err);
 | |
|         }
 | |
|         throw err;
 | |
|       }
 | |
|       if (sync) {
 | |
|         nextTick(iterate);
 | |
|       } else {
 | |
|         sync = true;
 | |
|         iterate();
 | |
|       }
 | |
|       sync = false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace compose
 | |
|    */
 | |
|   function compose() {
 | |
|     return seq.apply(null, reverse(arguments));
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace seq
 | |
|    */
 | |
|   function seq(/* functions... */) {
 | |
|     var fns = createArray(arguments);
 | |
| 
 | |
|     return function() {
 | |
|       var self = this;
 | |
|       var args = createArray(arguments);
 | |
|       var callback = args[args.length - 1];
 | |
|       if (typeof callback === func) {
 | |
|         args.pop();
 | |
|       } else {
 | |
|         callback = noop;
 | |
|       }
 | |
|       reduce(fns, args, iterator, done);
 | |
| 
 | |
|       function iterator(newargs, fn, callback) {
 | |
|         var func = function(err) {
 | |
|           var nextargs = slice(arguments, 1);
 | |
|           callback(err, nextargs);
 | |
|         };
 | |
|         newargs.push(func);
 | |
|         fn.apply(self, newargs);
 | |
|       }
 | |
| 
 | |
|       function done(err, res) {
 | |
|         res = isArray(res) ? res : [res];
 | |
|         res.unshift(err);
 | |
|         callback.apply(self, res);
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   function createApplyEach(func) {
 | |
|     return function applyEach(fns /* arguments */) {
 | |
|       var go = function() {
 | |
|         var self = this;
 | |
|         var args = createArray(arguments);
 | |
|         var callback = args.pop() || noop;
 | |
|         return func(fns, iterator, callback);
 | |
| 
 | |
|         function iterator(fn, done) {
 | |
|           fn.apply(self, args.concat([done]));
 | |
|         }
 | |
|       };
 | |
|       if (arguments.length > 1) {
 | |
|         var args = slice(arguments, 1);
 | |
|         return go.apply(this, args);
 | |
|       } else {
 | |
|         return go;
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @see https://github.com/caolan/async/blob/master/lib/internal/DoublyLinkedList.js
 | |
|    */
 | |
|   function DLL() {
 | |
|     this.head = null;
 | |
|     this.tail = null;
 | |
|     this.length = 0;
 | |
|   }
 | |
| 
 | |
|   DLL.prototype._removeLink = function(node) {
 | |
|     var prev = node.prev;
 | |
|     var next = node.next;
 | |
|     if (prev) {
 | |
|       prev.next = next;
 | |
|     } else {
 | |
|       this.head = next;
 | |
|     }
 | |
|     if (next) {
 | |
|       next.prev = prev;
 | |
|     } else {
 | |
|       this.tail = prev;
 | |
|     }
 | |
|     node.prev = null;
 | |
|     node.next = null;
 | |
|     this.length--;
 | |
|     return node;
 | |
|   };
 | |
| 
 | |
|   DLL.prototype.empty = DLL;
 | |
| 
 | |
|   DLL.prototype._setInitial = function(node) {
 | |
|     this.length = 1;
 | |
|     this.head = this.tail = node;
 | |
|   };
 | |
| 
 | |
|   DLL.prototype.insertBefore = function(node, newNode) {
 | |
|     newNode.prev = node.prev;
 | |
|     newNode.next = node;
 | |
|     if (node.prev) {
 | |
|       node.prev.next = newNode;
 | |
|     } else {
 | |
|       this.head = newNode;
 | |
|     }
 | |
|     node.prev = newNode;
 | |
|     this.length++;
 | |
|   };
 | |
| 
 | |
|   DLL.prototype.unshift = function(node) {
 | |
|     if (this.head) {
 | |
|       this.insertBefore(this.head, node);
 | |
|     } else {
 | |
|       this._setInitial(node);
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   DLL.prototype.push = function(node) {
 | |
|     var tail = this.tail;
 | |
|     if (tail) {
 | |
|       node.prev = tail;
 | |
|       node.next = tail.next;
 | |
|       this.tail = node;
 | |
|       tail.next = node;
 | |
|       this.length++;
 | |
|     } else {
 | |
|       this._setInitial(node);
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   DLL.prototype.shift = function() {
 | |
|     return this.head && this._removeLink(this.head);
 | |
|   };
 | |
| 
 | |
|   DLL.prototype.splice = function(end) {
 | |
|     var task;
 | |
|     var tasks = [];
 | |
|     while (end-- && (task = this.shift())) {
 | |
|       tasks.push(task);
 | |
|     }
 | |
|     return tasks;
 | |
|   };
 | |
| 
 | |
|   DLL.prototype.remove = function(test) {
 | |
|     var node = this.head;
 | |
|     while (node) {
 | |
|       if (test(node)) {
 | |
|         this._removeLink(node);
 | |
|       }
 | |
|       node = node.next;
 | |
|     }
 | |
|     return this;
 | |
|   };
 | |
| 
 | |
|   /**
 | |
|    * @private
 | |
|    */
 | |
|   function baseQueue(isQueue, worker, concurrency, payload) {
 | |
|     if (concurrency === undefined) {
 | |
|       concurrency = 1;
 | |
|     } else if (isNaN(concurrency) || concurrency < 1) {
 | |
|       throw new Error('Concurrency must not be zero');
 | |
|     }
 | |
| 
 | |
|     var workers = 0;
 | |
|     var workersList = [];
 | |
|     var _callback, _unshift;
 | |
| 
 | |
|     var q = {
 | |
|       _tasks: new DLL(),
 | |
|       concurrency: concurrency,
 | |
|       payload: payload,
 | |
|       saturated: noop,
 | |
|       unsaturated: noop,
 | |
|       buffer: concurrency / 4,
 | |
|       empty: noop,
 | |
|       drain: noop,
 | |
|       error: noop,
 | |
|       started: false,
 | |
|       paused: false,
 | |
|       push: push,
 | |
|       kill: kill,
 | |
|       unshift: unshift,
 | |
|       remove: remove,
 | |
|       process: isQueue ? runQueue : runCargo,
 | |
|       length: getLength,
 | |
|       running: running,
 | |
|       workersList: getWorkersList,
 | |
|       idle: idle,
 | |
|       pause: pause,
 | |
|       resume: resume,
 | |
|       _worker: worker
 | |
|     };
 | |
|     return q;
 | |
| 
 | |
|     function push(tasks, callback) {
 | |
|       _insert(tasks, callback);
 | |
|     }
 | |
| 
 | |
|     function unshift(tasks, callback) {
 | |
|       _insert(tasks, callback, true);
 | |
|     }
 | |
| 
 | |
|     function _exec(task) {
 | |
|       var item = {
 | |
|         data: task,
 | |
|         callback: _callback
 | |
|       };
 | |
|       if (_unshift) {
 | |
|         q._tasks.unshift(item);
 | |
|       } else {
 | |
|         q._tasks.push(item);
 | |
|       }
 | |
|       nextTick(q.process);
 | |
|     }
 | |
| 
 | |
|     function _insert(tasks, callback, unshift) {
 | |
|       if (callback == null) {
 | |
|         callback = noop;
 | |
|       } else if (typeof callback !== 'function') {
 | |
|         throw new Error('task callback must be a function');
 | |
|       }
 | |
|       q.started = true;
 | |
|       var _tasks = isArray(tasks) ? tasks : [tasks];
 | |
| 
 | |
|       if (tasks === undefined || !_tasks.length) {
 | |
|         if (q.idle()) {
 | |
|           nextTick(q.drain);
 | |
|         }
 | |
|         return;
 | |
|       }
 | |
| 
 | |
|       _unshift = unshift;
 | |
|       _callback = callback;
 | |
|       arrayEachSync(_tasks, _exec);
 | |
|       // Avoid leaking the callback
 | |
|       _callback = undefined;
 | |
|     }
 | |
| 
 | |
|     function kill() {
 | |
|       q.drain = noop;
 | |
|       q._tasks.empty();
 | |
|     }
 | |
| 
 | |
|     function _next(q, tasks) {
 | |
|       var called = false;
 | |
|       return function done(err, res) {
 | |
|         if (called) {
 | |
|           throwError();
 | |
|         }
 | |
|         called = true;
 | |
| 
 | |
|         workers--;
 | |
|         var task;
 | |
|         var index = -1;
 | |
|         var size = workersList.length;
 | |
|         var taskIndex = -1;
 | |
|         var taskSize = tasks.length;
 | |
|         var useApply = arguments.length > 2;
 | |
|         var args = useApply && createArray(arguments);
 | |
|         while (++taskIndex < taskSize) {
 | |
|           task = tasks[taskIndex];
 | |
|           while (++index < size) {
 | |
|             if (workersList[index] === task) {
 | |
|               if (index === 0) {
 | |
|                 workersList.shift();
 | |
|               } else {
 | |
|                 workersList.splice(index, 1);
 | |
|               }
 | |
|               index = size;
 | |
|               size--;
 | |
|             }
 | |
|           }
 | |
|           index = -1;
 | |
|           if (useApply) {
 | |
|             task.callback.apply(task, args);
 | |
|           } else {
 | |
|             task.callback(err, res);
 | |
|           }
 | |
|           if (err) {
 | |
|             q.error(err, task.data);
 | |
|           }
 | |
|         }
 | |
| 
 | |
|         if (workers <= q.concurrency - q.buffer) {
 | |
|           q.unsaturated();
 | |
|         }
 | |
| 
 | |
|         if (q._tasks.length + workers === 0) {
 | |
|           q.drain();
 | |
|         }
 | |
|         q.process();
 | |
|       };
 | |
|     }
 | |
| 
 | |
|     function runQueue() {
 | |
|       while (!q.paused && workers < q.concurrency && q._tasks.length) {
 | |
|         var task = q._tasks.shift();
 | |
|         workers++;
 | |
|         workersList.push(task);
 | |
|         if (q._tasks.length === 0) {
 | |
|           q.empty();
 | |
|         }
 | |
|         if (workers === q.concurrency) {
 | |
|           q.saturated();
 | |
|         }
 | |
|         var done = _next(q, [task]);
 | |
|         worker(task.data, done);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function runCargo() {
 | |
|       while (!q.paused && workers < q.concurrency && q._tasks.length) {
 | |
|         var tasks = q._tasks.splice(q.payload || q._tasks.length);
 | |
|         var index = -1;
 | |
|         var size = tasks.length;
 | |
|         var data = Array(size);
 | |
|         while (++index < size) {
 | |
|           data[index] = tasks[index].data;
 | |
|         }
 | |
|         workers++;
 | |
|         nativePush.apply(workersList, tasks);
 | |
|         if (q._tasks.length === 0) {
 | |
|           q.empty();
 | |
|         }
 | |
|         if (workers === q.concurrency) {
 | |
|           q.saturated();
 | |
|         }
 | |
|         var done = _next(q, tasks);
 | |
|         worker(data, done);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function getLength() {
 | |
|       return q._tasks.length;
 | |
|     }
 | |
| 
 | |
|     function running() {
 | |
|       return workers;
 | |
|     }
 | |
| 
 | |
|     function getWorkersList() {
 | |
|       return workersList;
 | |
|     }
 | |
| 
 | |
|     function idle() {
 | |
|       return q.length() + workers === 0;
 | |
|     }
 | |
| 
 | |
|     function pause() {
 | |
|       q.paused = true;
 | |
|     }
 | |
| 
 | |
|     function _resume() {
 | |
|       nextTick(q.process);
 | |
|     }
 | |
| 
 | |
|     function resume() {
 | |
|       if (q.paused === false) {
 | |
|         return;
 | |
|       }
 | |
|       q.paused = false;
 | |
|       var count = q.concurrency < q._tasks.length ? q.concurrency : q._tasks.length;
 | |
|       timesSync(count, _resume);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param {Function} test
 | |
|      */
 | |
|     function remove(test) {
 | |
|       q._tasks.remove(test);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace queue
 | |
|    */
 | |
|   function queue(worker, concurrency) {
 | |
|     return baseQueue(true, worker, concurrency);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace priorityQueue
 | |
|    */
 | |
|   function priorityQueue(worker, concurrency) {
 | |
|     var q = baseQueue(true, worker, concurrency);
 | |
|     q.push = push;
 | |
|     delete q.unshift;
 | |
|     return q;
 | |
| 
 | |
|     function push(tasks, priority, callback) {
 | |
|       q.started = true;
 | |
|       priority = priority || 0;
 | |
|       var _tasks = isArray(tasks) ? tasks : [tasks];
 | |
|       var taskSize = _tasks.length;
 | |
| 
 | |
|       if (tasks === undefined || taskSize === 0) {
 | |
|         if (q.idle()) {
 | |
|           nextTick(q.drain);
 | |
|         }
 | |
|         return;
 | |
|       }
 | |
| 
 | |
|       callback = typeof callback === func ? callback : noop;
 | |
|       var nextNode = q._tasks.head;
 | |
|       while (nextNode && priority >= nextNode.priority) {
 | |
|         nextNode = nextNode.next;
 | |
|       }
 | |
|       while (taskSize--) {
 | |
|         var item = {
 | |
|           data: _tasks[taskSize],
 | |
|           priority: priority,
 | |
|           callback: callback
 | |
|         };
 | |
|         if (nextNode) {
 | |
|           q._tasks.insertBefore(nextNode, item);
 | |
|         } else {
 | |
|           q._tasks.push(item);
 | |
|         }
 | |
|         nextTick(q.process);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace cargo
 | |
|    */
 | |
|   function cargo(worker, payload) {
 | |
|     return baseQueue(false, worker, 1, payload);
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace auto
 | |
|    * @param {Object} tasks
 | |
|    * @param {number} [concurrency]
 | |
|    * @param {Function} [callback]
 | |
|    */
 | |
|   function auto(tasks, concurrency, callback) {
 | |
|     if (typeof concurrency === func) {
 | |
|       callback = concurrency;
 | |
|       concurrency = null;
 | |
|     }
 | |
|     var keys = nativeKeys(tasks);
 | |
|     var rest = keys.length;
 | |
|     var results = {};
 | |
|     if (rest === 0) {
 | |
|       return callback(null, results);
 | |
|     }
 | |
|     var runningTasks = 0;
 | |
|     var readyTasks = new DLL();
 | |
|     var listeners = Object.create(null);
 | |
|     callback = onlyOnce(callback || noop);
 | |
|     concurrency = concurrency || rest;
 | |
| 
 | |
|     baseEachSync(tasks, iterator, keys);
 | |
|     proceedQueue();
 | |
| 
 | |
|     function iterator(task, key) {
 | |
|       // no dependencies
 | |
|       var _task, _taskSize;
 | |
|       if (!isArray(task)) {
 | |
|         _task = task;
 | |
|         _taskSize = 0;
 | |
|         readyTasks.push([_task, _taskSize, done]);
 | |
|         return;
 | |
|       }
 | |
|       var dependencySize = task.length - 1;
 | |
|       _task = task[dependencySize];
 | |
|       _taskSize = dependencySize;
 | |
|       if (dependencySize === 0) {
 | |
|         readyTasks.push([_task, _taskSize, done]);
 | |
|         return;
 | |
|       }
 | |
|       // dependencies
 | |
|       var index = -1;
 | |
|       while (++index < dependencySize) {
 | |
|         var dependencyName = task[index];
 | |
|         if (notInclude(keys, dependencyName)) {
 | |
|           var msg =
 | |
|             'async.auto task `' +
 | |
|             key +
 | |
|             '` has non-existent dependency `' +
 | |
|             dependencyName +
 | |
|             '` in ' +
 | |
|             task.join(', ');
 | |
|           throw new Error(msg);
 | |
|         }
 | |
|         var taskListeners = listeners[dependencyName];
 | |
|         if (!taskListeners) {
 | |
|           taskListeners = listeners[dependencyName] = [];
 | |
|         }
 | |
|         taskListeners.push(taskListener);
 | |
|       }
 | |
| 
 | |
|       function done(err, arg) {
 | |
|         if (key === null) {
 | |
|           throwError();
 | |
|         }
 | |
|         arg = arguments.length <= 2 ? arg : slice(arguments, 1);
 | |
|         if (err) {
 | |
|           rest = 0;
 | |
|           runningTasks = 0;
 | |
|           readyTasks.length = 0;
 | |
|           var safeResults = objectClone(results);
 | |
|           safeResults[key] = arg;
 | |
|           key = null;
 | |
|           var _callback = callback;
 | |
|           callback = noop;
 | |
|           _callback(err, safeResults);
 | |
|           return;
 | |
|         }
 | |
|         runningTasks--;
 | |
|         rest--;
 | |
|         results[key] = arg;
 | |
|         taskComplete(key);
 | |
|         key = null;
 | |
|       }
 | |
| 
 | |
|       function taskListener() {
 | |
|         if (--dependencySize === 0) {
 | |
|           readyTasks.push([_task, _taskSize, done]);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function proceedQueue() {
 | |
|       if (readyTasks.length === 0 && runningTasks === 0) {
 | |
|         if (rest !== 0) {
 | |
|           throw new Error('async.auto task has cyclic dependencies');
 | |
|         }
 | |
|         return callback(null, results);
 | |
|       }
 | |
|       while (readyTasks.length && runningTasks < concurrency && callback !== noop) {
 | |
|         runningTasks++;
 | |
|         var array = readyTasks.shift();
 | |
|         if (array[1] === 0) {
 | |
|           array[0](array[2]);
 | |
|         } else {
 | |
|           array[0](results, array[2]);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function taskComplete(key) {
 | |
|       var taskListeners = listeners[key] || [];
 | |
|       arrayEachSync(taskListeners, function(task) {
 | |
|         task();
 | |
|       });
 | |
|       proceedQueue();
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   var FN_ARGS = /^(function)?\s*[^\(]*\(\s*([^\)]*)\)/m;
 | |
|   var FN_ARG_SPLIT = /,/;
 | |
|   var FN_ARG = /(=.+)?(\s*)$/;
 | |
|   var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;
 | |
| 
 | |
|   /**
 | |
|    * parse function arguments for `autoInject`
 | |
|    *
 | |
|    * @private
 | |
|    */
 | |
|   function parseParams(func) {
 | |
|     func = func.toString().replace(STRIP_COMMENTS, '');
 | |
|     func = func.match(FN_ARGS)[2].replace(' ', '');
 | |
|     func = func ? func.split(FN_ARG_SPLIT) : [];
 | |
|     func = func.map(function(arg) {
 | |
|       return arg.replace(FN_ARG, '').trim();
 | |
|     });
 | |
|     return func;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace autoInject
 | |
|    * @param {Object} tasks
 | |
|    * @param {number} [concurrency]
 | |
|    * @param {Function} [callback]
 | |
|    */
 | |
|   function autoInject(tasks, concurrency, callback) {
 | |
|     var newTasks = {};
 | |
|     baseEachSync(tasks, iterator, nativeKeys(tasks));
 | |
|     auto(newTasks, concurrency, callback);
 | |
| 
 | |
|     function iterator(task, key) {
 | |
|       var params;
 | |
|       var taskLength = task.length;
 | |
| 
 | |
|       if (isArray(task)) {
 | |
|         if (taskLength === 0) {
 | |
|           throw new Error('autoInject task functions require explicit parameters.');
 | |
|         }
 | |
|         params = createArray(task);
 | |
|         taskLength = params.length - 1;
 | |
|         task = params[taskLength];
 | |
|         if (taskLength === 0) {
 | |
|           newTasks[key] = task;
 | |
|           return;
 | |
|         }
 | |
|       } else if (taskLength === 1) {
 | |
|         newTasks[key] = task;
 | |
|         return;
 | |
|       } else {
 | |
|         params = parseParams(task);
 | |
|         if (taskLength === 0 && params.length === 0) {
 | |
|           throw new Error('autoInject task functions require explicit parameters.');
 | |
|         }
 | |
|         taskLength = params.length - 1;
 | |
|       }
 | |
|       params[taskLength] = newTask;
 | |
|       newTasks[key] = params;
 | |
| 
 | |
|       function newTask(results, done) {
 | |
|         switch (taskLength) {
 | |
|           case 1:
 | |
|             task(results[params[0]], done);
 | |
|             break;
 | |
|           case 2:
 | |
|             task(results[params[0]], results[params[1]], done);
 | |
|             break;
 | |
|           case 3:
 | |
|             task(results[params[0]], results[params[1]], results[params[2]], done);
 | |
|             break;
 | |
|           default:
 | |
|             var i = -1;
 | |
|             while (++i < taskLength) {
 | |
|               params[i] = results[params[i]];
 | |
|             }
 | |
|             params[i] = done;
 | |
|             task.apply(null, params);
 | |
|             break;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace retry
 | |
|    * @param {integer|Object|Function} opts
 | |
|    * @param {Function} [task]
 | |
|    * @param {Function} [callback]
 | |
|    */
 | |
|   function retry(opts, task, callback) {
 | |
|     var times, intervalFunc, errorFilter;
 | |
|     var count = 0;
 | |
|     if (arguments.length < 3 && typeof opts === func) {
 | |
|       callback = task || noop;
 | |
|       task = opts;
 | |
|       opts = null;
 | |
|       times = DEFAULT_TIMES;
 | |
|     } else {
 | |
|       callback = callback || noop;
 | |
|       switch (typeof opts) {
 | |
|         case 'object':
 | |
|           if (typeof opts.errorFilter === func) {
 | |
|             errorFilter = opts.errorFilter;
 | |
|           }
 | |
|           var interval = opts.interval;
 | |
|           switch (typeof interval) {
 | |
|             case func:
 | |
|               intervalFunc = interval;
 | |
|               break;
 | |
|             case 'string':
 | |
|             case 'number':
 | |
|               interval = +interval;
 | |
|               intervalFunc = interval
 | |
|                 ? function() {
 | |
|                     return interval;
 | |
|                   }
 | |
|                 : function() {
 | |
|                     return DEFAULT_INTERVAL;
 | |
|                   };
 | |
|               break;
 | |
|           }
 | |
|           times = +opts.times || DEFAULT_TIMES;
 | |
|           break;
 | |
|         case 'number':
 | |
|           times = opts || DEFAULT_TIMES;
 | |
|           break;
 | |
|         case 'string':
 | |
|           times = +opts || DEFAULT_TIMES;
 | |
|           break;
 | |
|         default:
 | |
|           throw new Error('Invalid arguments for async.retry');
 | |
|       }
 | |
|     }
 | |
|     if (typeof task !== 'function') {
 | |
|       throw new Error('Invalid arguments for async.retry');
 | |
|     }
 | |
| 
 | |
|     if (intervalFunc) {
 | |
|       task(intervalCallback);
 | |
|     } else {
 | |
|       task(simpleCallback);
 | |
|     }
 | |
| 
 | |
|     function simpleIterator() {
 | |
|       task(simpleCallback);
 | |
|     }
 | |
| 
 | |
|     function simpleCallback(err, res) {
 | |
|       if (++count === times || !err || (errorFilter && !errorFilter(err))) {
 | |
|         if (arguments.length <= 2) {
 | |
|           return callback(err, res);
 | |
|         }
 | |
|         var args = createArray(arguments);
 | |
|         return callback.apply(null, args);
 | |
|       }
 | |
|       simpleIterator();
 | |
|     }
 | |
| 
 | |
|     function intervalIterator() {
 | |
|       task(intervalCallback);
 | |
|     }
 | |
| 
 | |
|     function intervalCallback(err, res) {
 | |
|       if (++count === times || !err || (errorFilter && !errorFilter(err))) {
 | |
|         if (arguments.length <= 2) {
 | |
|           return callback(err, res);
 | |
|         }
 | |
|         var args = createArray(arguments);
 | |
|         return callback.apply(null, args);
 | |
|       }
 | |
|       setTimeout(intervalIterator, intervalFunc(count));
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   function retryable(opts, task) {
 | |
|     if (!task) {
 | |
|       task = opts;
 | |
|       opts = null;
 | |
|     }
 | |
|     return done;
 | |
| 
 | |
|     function done() {
 | |
|       var taskFn;
 | |
|       var args = createArray(arguments);
 | |
|       var lastIndex = args.length - 1;
 | |
|       var callback = args[lastIndex];
 | |
|       switch (task.length) {
 | |
|         case 1:
 | |
|           taskFn = task1;
 | |
|           break;
 | |
|         case 2:
 | |
|           taskFn = task2;
 | |
|           break;
 | |
|         case 3:
 | |
|           taskFn = task3;
 | |
|           break;
 | |
|         default:
 | |
|           taskFn = task4;
 | |
|       }
 | |
|       if (opts) {
 | |
|         retry(opts, taskFn, callback);
 | |
|       } else {
 | |
|         retry(taskFn, callback);
 | |
|       }
 | |
| 
 | |
|       function task1(done) {
 | |
|         task(done);
 | |
|       }
 | |
| 
 | |
|       function task2(done) {
 | |
|         task(args[0], done);
 | |
|       }
 | |
| 
 | |
|       function task3(done) {
 | |
|         task(args[0], args[1], done);
 | |
|       }
 | |
| 
 | |
|       function task4(callback) {
 | |
|         args[lastIndex] = callback;
 | |
|         task.apply(null, args);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace iterator
 | |
|    */
 | |
|   function iterator(tasks) {
 | |
|     var size = 0;
 | |
|     var keys = [];
 | |
|     if (isArray(tasks)) {
 | |
|       size = tasks.length;
 | |
|     } else {
 | |
|       keys = nativeKeys(tasks);
 | |
|       size = keys.length;
 | |
|     }
 | |
|     return makeCallback(0);
 | |
| 
 | |
|     function makeCallback(index) {
 | |
|       var fn = function() {
 | |
|         if (size) {
 | |
|           var key = keys[index] || index;
 | |
|           tasks[key].apply(null, createArray(arguments));
 | |
|         }
 | |
|         return fn.next();
 | |
|       };
 | |
|       fn.next = function() {
 | |
|         return index < size - 1 ? makeCallback(index + 1) : null;
 | |
|       };
 | |
|       return fn;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace apply
 | |
|    */
 | |
|   function apply(func) {
 | |
|     switch (arguments.length) {
 | |
|       case 0:
 | |
|       case 1:
 | |
|         return func;
 | |
|       case 2:
 | |
|         return func.bind(null, arguments[1]);
 | |
|       case 3:
 | |
|         return func.bind(null, arguments[1], arguments[2]);
 | |
|       case 4:
 | |
|         return func.bind(null, arguments[1], arguments[2], arguments[3]);
 | |
|       case 5:
 | |
|         return func.bind(null, arguments[1], arguments[2], arguments[3], arguments[4]);
 | |
|       default:
 | |
|         var size = arguments.length;
 | |
|         var index = 0;
 | |
|         var args = Array(size);
 | |
|         args[index] = null;
 | |
|         while (++index < size) {
 | |
|           args[index] = arguments[index];
 | |
|         }
 | |
|         return func.bind.apply(func, args);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace timeout
 | |
|    * @param {Function} func
 | |
|    * @param {number} millisec
 | |
|    * @param {*} info
 | |
|    */
 | |
|   function timeout(func, millisec, info) {
 | |
|     var callback, timer;
 | |
|     return wrappedFunc;
 | |
| 
 | |
|     function wrappedFunc() {
 | |
|       timer = setTimeout(timeoutCallback, millisec);
 | |
|       var args = createArray(arguments);
 | |
|       var lastIndex = args.length - 1;
 | |
|       callback = args[lastIndex];
 | |
|       args[lastIndex] = injectedCallback;
 | |
|       simpleApply(func, args);
 | |
|     }
 | |
| 
 | |
|     function timeoutCallback() {
 | |
|       var name = func.name || 'anonymous';
 | |
|       var err = new Error('Callback function "' + name + '" timed out.');
 | |
|       err.code = 'ETIMEDOUT';
 | |
|       if (info) {
 | |
|         err.info = info;
 | |
|       }
 | |
|       timer = null;
 | |
|       callback(err);
 | |
|     }
 | |
| 
 | |
|     function injectedCallback() {
 | |
|       if (timer !== null) {
 | |
|         simpleApply(callback, createArray(arguments));
 | |
|         clearTimeout(timer);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function simpleApply(func, args) {
 | |
|       switch (args.length) {
 | |
|         case 0:
 | |
|           func();
 | |
|           break;
 | |
|         case 1:
 | |
|           func(args[0]);
 | |
|           break;
 | |
|         case 2:
 | |
|           func(args[0], args[1]);
 | |
|           break;
 | |
|         default:
 | |
|           func.apply(null, args);
 | |
|           break;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace times
 | |
|    * @param {number} n - n >= 1
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * var iterator = function(n, done) {
 | |
|    *   done(null, n);
 | |
|    * };
 | |
|    * async.times(4, iterator, function(err, res) {
 | |
|    *   console.log(res); // [0, 1, 2, 3];
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function times(n, iterator, callback) {
 | |
|     callback = callback || noop;
 | |
|     n = +n;
 | |
|     if (isNaN(n) || n < 1) {
 | |
|       return callback(null, []);
 | |
|     }
 | |
|     var result = Array(n);
 | |
|     timesSync(n, iterate);
 | |
| 
 | |
|     function iterate(num) {
 | |
|       iterator(num, createCallback(num));
 | |
|     }
 | |
| 
 | |
|     function createCallback(index) {
 | |
|       return function(err, res) {
 | |
|         if (index === null) {
 | |
|           throwError();
 | |
|         }
 | |
|         result[index] = res;
 | |
|         index = null;
 | |
|         if (err) {
 | |
|           callback(err);
 | |
|           callback = noop;
 | |
|         } else if (--n === 0) {
 | |
|           callback(null, result);
 | |
|         }
 | |
|       };
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace timesSeries
 | |
|    * @param {number} n - n >= 1
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * var iterator = function(n, done) {
 | |
|    *   done(null, n);
 | |
|    * };
 | |
|    * async.timesSeries(4, iterator, function(err, res) {
 | |
|    *   console.log(res); // [0, 1, 2, 3];
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function timesSeries(n, iterator, callback) {
 | |
|     callback = callback || noop;
 | |
|     n = +n;
 | |
|     if (isNaN(n) || n < 1) {
 | |
|       return callback(null, []);
 | |
|     }
 | |
|     var result = Array(n);
 | |
|     var sync = false;
 | |
|     var completed = 0;
 | |
|     iterate();
 | |
| 
 | |
|     function iterate() {
 | |
|       iterator(completed, done);
 | |
|     }
 | |
| 
 | |
|     function done(err, res) {
 | |
|       result[completed] = res;
 | |
|       if (err) {
 | |
|         callback(err);
 | |
|         callback = throwError;
 | |
|       } else if (++completed >= n) {
 | |
|         callback(null, result);
 | |
|         callback = throwError;
 | |
|       } else if (sync) {
 | |
|         nextTick(iterate);
 | |
|       } else {
 | |
|         sync = true;
 | |
|         iterate();
 | |
|       }
 | |
|       sync = false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace timesLimit
 | |
|    * @param {number} n - n >= 1
 | |
|    * @param {number} limit - n >= 1
 | |
|    * @param {Function} iterator
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * var iterator = function(n, done) {
 | |
|    *   done(null, n);
 | |
|    * };
 | |
|    * async.timesLimit(4, 2, iterator, function(err, res) {
 | |
|    *   console.log(res); // [0, 1, 2, 3];
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function timesLimit(n, limit, iterator, callback) {
 | |
|     callback = callback || noop;
 | |
|     n = +n;
 | |
|     if (isNaN(n) || n < 1 || isNaN(limit) || limit < 1) {
 | |
|       return callback(null, []);
 | |
|     }
 | |
|     var result = Array(n);
 | |
|     var sync = false;
 | |
|     var started = 0;
 | |
|     var completed = 0;
 | |
|     timesSync(limit > n ? n : limit, iterate);
 | |
| 
 | |
|     function iterate() {
 | |
|       var index = started++;
 | |
|       if (index < n) {
 | |
|         iterator(index, createCallback(index));
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function createCallback(index) {
 | |
|       return function(err, res) {
 | |
|         if (index === null) {
 | |
|           throwError();
 | |
|         }
 | |
|         result[index] = res;
 | |
|         index = null;
 | |
|         if (err) {
 | |
|           callback(err);
 | |
|           callback = noop;
 | |
|         } else if (++completed >= n) {
 | |
|           callback(null, result);
 | |
|           callback = throwError;
 | |
|         } else if (sync) {
 | |
|           nextTick(iterate);
 | |
|         } else {
 | |
|           sync = true;
 | |
|           iterate();
 | |
|         }
 | |
|         sync = false;
 | |
|       };
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace race
 | |
|    * @param {Array|Object} tasks - functions
 | |
|    * @param {Function} callback
 | |
|    * @example
 | |
|    *
 | |
|    * // array
 | |
|    * var called = 0;
 | |
|    * var tasks = [
 | |
|    *   function(done) {
 | |
|    *     setTimeout(function() {
 | |
|    *       called++;
 | |
|    *       done(null, '1');
 | |
|    *     }, 30);
 | |
|    *   },
 | |
|    *   function(done) {
 | |
|    *     setTimeout(function() {
 | |
|    *       called++;
 | |
|    *       done(null, '2');
 | |
|    *     }, 20);
 | |
|    *   },
 | |
|    *   function(done) {
 | |
|    *     setTimeout(function() {
 | |
|    *       called++;
 | |
|    *       done(null, '3');
 | |
|    *     }, 10);
 | |
|    *   }
 | |
|    * ];
 | |
|    * async.race(tasks, function(err, res) {
 | |
|    *   console.log(res); // '3'
 | |
|    *   console.log(called); // 1
 | |
|    *   setTimeout(function() {
 | |
|    *     console.log(called); // 3
 | |
|    *   }, 50);
 | |
|    * });
 | |
|    *
 | |
|    * @example
 | |
|    *
 | |
|    * // object
 | |
|    * var called = 0;
 | |
|    * var tasks = {
 | |
|    *   'test1': function(done) {
 | |
|    *     setTimeout(function() {
 | |
|    *       called++;
 | |
|    *       done(null, '1');
 | |
|    *     }, 30);
 | |
|    *   },
 | |
|    *   'test2': function(done) {
 | |
|    *     setTimeout(function() {
 | |
|    *       called++;
 | |
|    *       done(null, '2');
 | |
|    *     }, 20);
 | |
|    *   },
 | |
|    *   'test3': function(done) {
 | |
|    *     setTimeout(function() {
 | |
|    *       called++;
 | |
|    *       done(null, '3');
 | |
|    *     }, 10);
 | |
|    *   }
 | |
|    * };
 | |
|    * async.race(tasks, function(err, res) {
 | |
|    *   console.log(res); // '3'
 | |
|    *   console.log(called); // 1
 | |
|    *   setTimeout(function() {
 | |
|    *     console.log(called); // 3
 | |
|    *     done();
 | |
|    *   }, 50);
 | |
|    * });
 | |
|    *
 | |
|    */
 | |
|   function race(tasks, callback) {
 | |
|     callback = once(callback || noop);
 | |
|     var size, keys;
 | |
|     var index = -1;
 | |
|     if (isArray(tasks)) {
 | |
|       size = tasks.length;
 | |
|       while (++index < size) {
 | |
|         tasks[index](callback);
 | |
|       }
 | |
|     } else if (tasks && typeof tasks === obj) {
 | |
|       keys = nativeKeys(tasks);
 | |
|       size = keys.length;
 | |
|       while (++index < size) {
 | |
|         tasks[keys[index]](callback);
 | |
|       }
 | |
|     } else {
 | |
|       return callback(new TypeError('First argument to race must be a collection of functions'));
 | |
|     }
 | |
|     if (!size) {
 | |
|       callback(null);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace memoize
 | |
|    */
 | |
|   function memoize(fn, hasher) {
 | |
|     hasher =
 | |
|       hasher ||
 | |
|       function(hash) {
 | |
|         return hash;
 | |
|       };
 | |
| 
 | |
|     var memo = {};
 | |
|     var queues = {};
 | |
|     var memoized = function() {
 | |
|       var args = createArray(arguments);
 | |
|       var callback = args.pop();
 | |
|       var key = hasher.apply(null, args);
 | |
|       if (has(memo, key)) {
 | |
|         nextTick(function() {
 | |
|           callback.apply(null, memo[key]);
 | |
|         });
 | |
|         return;
 | |
|       }
 | |
|       if (has(queues, key)) {
 | |
|         return queues[key].push(callback);
 | |
|       }
 | |
| 
 | |
|       queues[key] = [callback];
 | |
|       args.push(done);
 | |
|       fn.apply(null, args);
 | |
| 
 | |
|       function done(err) {
 | |
|         var args = createArray(arguments);
 | |
|         if (!err) {
 | |
|           memo[key] = args;
 | |
|         }
 | |
|         var q = queues[key];
 | |
|         delete queues[key];
 | |
| 
 | |
|         var i = -1;
 | |
|         var size = q.length;
 | |
|         while (++i < size) {
 | |
|           q[i].apply(null, args);
 | |
|         }
 | |
|       }
 | |
|     };
 | |
|     memoized.memo = memo;
 | |
|     memoized.unmemoized = fn;
 | |
|     return memoized;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace unmemoize
 | |
|    */
 | |
|   function unmemoize(fn) {
 | |
|     return function() {
 | |
|       return (fn.unmemoized || fn).apply(null, arguments);
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace ensureAsync
 | |
|    */
 | |
|   function ensureAsync(fn) {
 | |
|     return function(/* ...args, callback */) {
 | |
|       var args = createArray(arguments);
 | |
|       var lastIndex = args.length - 1;
 | |
|       var callback = args[lastIndex];
 | |
|       var sync = true;
 | |
|       args[lastIndex] = done;
 | |
|       fn.apply(this, args);
 | |
|       sync = false;
 | |
| 
 | |
|       function done() {
 | |
|         var innerArgs = createArray(arguments);
 | |
|         if (sync) {
 | |
|           nextTick(function() {
 | |
|             callback.apply(null, innerArgs);
 | |
|           });
 | |
|         } else {
 | |
|           callback.apply(null, innerArgs);
 | |
|         }
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace constant
 | |
|    */
 | |
|   function constant(/* values... */) {
 | |
|     var args = [null].concat(createArray(arguments));
 | |
|     return function(callback) {
 | |
|       callback = arguments[arguments.length - 1];
 | |
|       callback.apply(this, args);
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   function asyncify(fn) {
 | |
|     return function(/* args..., callback */) {
 | |
|       var args = createArray(arguments);
 | |
|       var callback = args.pop();
 | |
|       var result;
 | |
|       try {
 | |
|         result = fn.apply(this, args);
 | |
|       } catch (e) {
 | |
|         return callback(e);
 | |
|       }
 | |
|       if (result && typeof result.then === func) {
 | |
|         result.then(
 | |
|           function(value) {
 | |
|             invokeCallback(callback, null, value);
 | |
|           },
 | |
|           function(err) {
 | |
|             invokeCallback(callback, err && err.message ? err : new Error(err));
 | |
|           }
 | |
|         );
 | |
|       } else {
 | |
|         callback(null, result);
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   function invokeCallback(callback, err, value) {
 | |
|     try {
 | |
|       callback(err, value);
 | |
|     } catch (e) {
 | |
|       nextTick(rethrow, e);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   function rethrow(error) {
 | |
|     throw error;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace reflect
 | |
|    * @param {Function} func
 | |
|    * @return {Function}
 | |
|    */
 | |
|   function reflect(func) {
 | |
|     return function(/* args..., callback */) {
 | |
|       var callback;
 | |
|       switch (arguments.length) {
 | |
|         case 1:
 | |
|           callback = arguments[0];
 | |
|           return func(done);
 | |
|         case 2:
 | |
|           callback = arguments[1];
 | |
|           return func(arguments[0], done);
 | |
|         default:
 | |
|           var args = createArray(arguments);
 | |
|           var lastIndex = args.length - 1;
 | |
|           callback = args[lastIndex];
 | |
|           args[lastIndex] = done;
 | |
|           func.apply(this, args);
 | |
|       }
 | |
| 
 | |
|       function done(err, res) {
 | |
|         if (err) {
 | |
|           return callback(null, {
 | |
|             error: err
 | |
|           });
 | |
|         }
 | |
|         if (arguments.length > 2) {
 | |
|           res = slice(arguments, 1);
 | |
|         }
 | |
|         callback(null, {
 | |
|           value: res
 | |
|         });
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace reflectAll
 | |
|    * @param {Array[]|Object} tasks
 | |
|    * @return {Function}
 | |
|    */
 | |
|   function reflectAll(tasks) {
 | |
|     var newTasks, keys;
 | |
|     if (isArray(tasks)) {
 | |
|       newTasks = Array(tasks.length);
 | |
|       arrayEachSync(tasks, iterate);
 | |
|     } else if (tasks && typeof tasks === obj) {
 | |
|       keys = nativeKeys(tasks);
 | |
|       newTasks = {};
 | |
|       baseEachSync(tasks, iterate, keys);
 | |
|     }
 | |
|     return newTasks;
 | |
| 
 | |
|     function iterate(func, key) {
 | |
|       newTasks[key] = reflect(func);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace createLogger
 | |
|    */
 | |
|   function createLogger(name) {
 | |
|     return function(fn) {
 | |
|       var args = slice(arguments, 1);
 | |
|       args.push(done);
 | |
|       fn.apply(null, args);
 | |
|     };
 | |
| 
 | |
|     function done(err) {
 | |
|       if (typeof console === obj) {
 | |
|         if (err) {
 | |
|           if (console.error) {
 | |
|             console.error(err);
 | |
|           }
 | |
|           return;
 | |
|         }
 | |
|         if (console[name]) {
 | |
|           var args = slice(arguments, 1);
 | |
|           arrayEachSync(args, function(arg) {
 | |
|             console[name](arg);
 | |
|           });
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace safe
 | |
|    */
 | |
|   function safe() {
 | |
|     createImmediate();
 | |
|     return exports;
 | |
|   }
 | |
| 
 | |
|   /**
 | |
|    * @memberof async
 | |
|    * @namespace fast
 | |
|    */
 | |
|   function fast() {
 | |
|     createImmediate(false);
 | |
|     return exports;
 | |
|   }
 | |
| });
 |