neo-async
Version:
Neo-Async is a drop-in replacement for Async, it almost fully covers its functionality and runs faster
1,893 lines (1,862 loc) • 235 kB
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);