| /*! run-parallel. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */ |
| module.exports = runParallel |
| |
| const queueMicrotask = require('queue-microtask') |
| |
| function runParallel (tasks, cb) { |
| let results, pending, keys |
| let isSync = true |
| |
| if (Array.isArray(tasks)) { |
| results = [] |
| pending = tasks.length |
| } else { |
| keys = Object.keys(tasks) |
| results = {} |
| pending = keys.length |
| } |
| |
| function done (err) { |
| function end () { |
| if (cb) cb(err, results) |
| cb = null |
| } |
| if (isSync) queueMicrotask(end) |
| else end() |
| } |
| |
| function each (i, err, result) { |
| results[i] = result |
| if (--pending === 0 || err) { |
| done(err) |
| } |
| } |
| |
| if (!pending) { |
| // empty |
| done(null) |
| } else if (keys) { |
| // object |
| keys.forEach(function (key) { |
| tasks[key](function (err, result) { each(key, err, result) }) |
| }) |
| } else { |
| // array |
| tasks.forEach(function (task, i) { |
| task(function (err, result) { each(i, err, result) }) |
| }) |
| } |
| |
| isSync = false |
| } |