summaryrefslogtreecommitdiff
path: root/lib/auto.js
diff options
context:
space:
mode:
authorGraeme Yeates <yeatesgraeme@gmail.com>2015-12-23 18:29:52 -0500
committerGraeme Yeates <yeatesgraeme@gmail.com>2015-12-29 16:48:48 -0500
commit1448f24a5e7d5c4b9ff56ef573d35291511c2a71 (patch)
tree3efbaea4ef8ac80ef7c37bf1bcbdeeee5dd7dd81 /lib/auto.js
parent18e61d4f07f48604601f2effdbe2a7e188d14d4a (diff)
downloadasync-1448f24a5e7d5c4b9ff56ef573d35291511c2a71.tar.gz
Fix implementations (test green lights)
Diffstat (limited to 'lib/auto.js')
-rw-r--r--lib/auto.js45
1 files changed, 21 insertions, 24 deletions
diff --git a/lib/auto.js b/lib/auto.js
index e48735c..82ad468 100644
--- a/lib/auto.js
+++ b/lib/auto.js
@@ -1,28 +1,28 @@
'use strict';
import arrayEach from 'lodash/internal/arrayEach';
+import arrayEvery from 'lodash/internal/arrayEvery';
import forOwn from 'lodash/object/forOwn';
import indexOf from 'lodash/array/indexOf';
import isArray from 'lodash/lang/isArray';
-import keys from 'lodash/object/keys';
+import okeys from 'lodash/object/keys';
import noop from 'lodash/utility/noop';
import once from 'lodash/function/once';
import restParam from 'lodash/function/restParam';
-import reduce from './reduce';
import setImmediate from './internal/setImmediate';
-export default function auto(tasks, concurrency, cb) {
+export default function (tasks, concurrency, callback) {
if (typeof arguments[1] === 'function') {
// concurrency is optional, shift the args.
- cb = concurrency;
+ callback = concurrency;
concurrency = null;
}
- cb = once(cb || noop);
- var okeys = keys(tasks);
- var remainingTasks = okeys.length;
+ callback = once(callback || noop);
+ var keys = okeys(tasks);
+ var remainingTasks = keys.length;
if (!remainingTasks) {
- return cb(null);
+ return callback(null);
}
if (!concurrency) {
concurrency = remainingTasks;
@@ -32,31 +32,28 @@ export default function auto(tasks, concurrency, cb) {
var runningTasks = 0;
var listeners = [];
-
function addListener(fn) {
listeners.unshift(fn);
}
-
function removeListener(fn) {
var idx = indexOf(listeners, fn);
if (idx >= 0) listeners.splice(idx, 1);
}
-
function taskComplete() {
remainingTasks--;
- arrayEach(listeners, function(fn) {
+ arrayEach(listeners.slice(), function (fn) {
fn();
});
}
- addListener(function() {
+ addListener(function () {
if (!remainingTasks) {
- cb(null, results);
+ callback(null, results);
}
});
- arrayEach(okeys, function(k) {
- var task = isArray(tasks[k]) ? tasks[k] : [tasks[k]];
+ arrayEach(keys, function (k) {
+ var task = isArray(tasks[k]) ? tasks[k]: [tasks[k]];
var taskCallback = restParam(function(err, args) {
runningTasks--;
if (args.length <= 1) {
@@ -68,8 +65,9 @@ export default function auto(tasks, concurrency, cb) {
safeResults[rkey] = val;
});
safeResults[k] = args;
- cb(err, safeResults);
- } else {
+ callback(err, safeResults);
+ }
+ else {
results[k] = args;
setImmediate(taskComplete);
}
@@ -86,19 +84,18 @@ export default function auto(tasks, concurrency, cb) {
throw new Error('Has cyclic dependencies');
}
}
-
function ready() {
- return runningTasks < concurrency && reduce(requires, function(a, x) {
- return (a && results.hasOwnProperty(x));
- }, true) && !results.hasOwnProperty(k);
+ return runningTasks < concurrency && arrayEvery(requires, function (x) {
+ return results.hasOwnProperty(x);
+ }) && !results.hasOwnProperty(k);
}
if (ready()) {
runningTasks++;
task[task.length - 1](taskCallback, results);
- } else {
+ }
+ else {
addListener(listener);
}
-
function listener() {
if (ready()) {
runningTasks++;