--- /dev/null
+module.exports = function parallel(fns, context, callback) {
+ if (!callback) {
+ if (typeof context === 'function') {
+ callback = context
+ context = null
+ } else {
+ callback = noop
+ }
+ }
+
+ var pending = fns && fns.length
+ if (!pending) return callback(null, []);
+
+ var finished = false
+ var results = new Array(pending)
+
+ fns.forEach(context ? function (fn, i) {
+ fn.call(context, maybeDone(i))
+ } : function (fn, i) {
+ fn(maybeDone(i))
+ })
+
+ function maybeDone(i) {
+ return function (err, result) {
+ if (finished) return;
+
+ if (err) {
+ callback(err, results)
+ finished = true
+ return
+ }
+
+ results[i] = result
+
+ if (!--pending) callback(null, results);
+ }
+ }
+}
+
+function noop() {}