_map.js 1.0 KB

1234567891011121314151617181920212223242526272829
  1. 'use strict';
  2. var a = require('./a');
  3. var once = require('./once');
  4. var concurrent = require('./concurrent');
  5. var CONCURRENTLY = require('./CONCURRENTLY');
  6. var SERIAL = require('./SERIAL');
  7. module.exports = function _map (cap, then, attached) {
  8. function api (collection, concurrency, iterator, done) {
  9. var args = arguments;
  10. if (args.length === 2) { iterator = concurrency; concurrency = CONCURRENTLY; }
  11. if (args.length === 3 && typeof concurrency !== 'number') { done = iterator; iterator = concurrency; concurrency = CONCURRENTLY; }
  12. var keys = Object.keys(collection);
  13. var tasks = a(collection) ? [] : {};
  14. keys.forEach(function insert (key) {
  15. tasks[key] = function iterate (cb) {
  16. if (iterator.length === 3) {
  17. iterator(collection[key], key, cb);
  18. } else {
  19. iterator(collection[key], cb);
  20. }
  21. };
  22. });
  23. concurrent(tasks, cap || concurrency, then ? then(collection, once(done)) : done);
  24. }
  25. if (!attached) { api.series = _map(SERIAL, then, true); }
  26. return api;
  27. };