summaryrefslogtreecommitdiff
path: root/lib/waterfall.js
blob: e25f629696df3f7b15ac06d556c941a7343558e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
'use strict';

import isArray from 'lodash/isArray';
import noop from 'lodash/noop';
import once from 'lodash/once';
import rest from 'lodash/rest';

import onlyOnce from './internal/onlyOnce';

export default  function(tasks, cb) {
    cb = once(cb || noop);
    if (!isArray(tasks)) return cb(new Error('First argument to waterfall must be an array of functions'));
    if (!tasks.length) return cb();
    var taskIndex = 0;

    function nextTask(args) {
        if (taskIndex === tasks.length) {
            return cb.apply(null, [null].concat(args));
        }
        var task = tasks[taskIndex];
        taskIndex++;

        var taskCallback = onlyOnce(rest(function(err, args) {
            if (err) {
                return cb.apply(null, [err].concat(args));
            }
            nextTask(args);
        }));

        args.push(taskCallback);

        task.apply(null, args);
    }

    nextTask([]);
}