30 lines
1.0 KiB
JavaScript
30 lines
1.0 KiB
JavaScript
'use strict';
|
|
|
|
var a = require('./a');
|
|
var once = require('./once');
|
|
var concurrent = require('./concurrent');
|
|
var CONCURRENTLY = require('./CONCURRENTLY');
|
|
var SERIAL = require('./SERIAL');
|
|
|
|
module.exports = function _map (cap, then, attached) {
|
|
function api (collection, concurrency, iterator, done) {
|
|
var args = arguments;
|
|
if (args.length === 2) { iterator = concurrency; concurrency = CONCURRENTLY; }
|
|
if (args.length === 3 && typeof concurrency !== 'number') { done = iterator; iterator = concurrency; concurrency = CONCURRENTLY; }
|
|
var keys = Object.keys(collection);
|
|
var tasks = a(collection) ? [] : {};
|
|
keys.forEach(function insert (key) {
|
|
tasks[key] = function iterate (cb) {
|
|
if (iterator.length === 3) {
|
|
iterator(collection[key], key, cb);
|
|
} else {
|
|
iterator(collection[key], cb);
|
|
}
|
|
};
|
|
});
|
|
concurrent(tasks, cap || concurrency, then ? then(collection, once(done)) : done);
|
|
}
|
|
if (!attached) { api.series = _map(SERIAL, then, true); }
|
|
return api;
|
|
};
|