| /*! 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 | |
| }
 |