/** @license MIT License (c) copyright 2011-2013 original author or authors */ /** * pipeline.js * * Run a set of task functions in sequence, passing the result * of the previous as an argument to the next. Like a shell * pipeline, e.g. `cat file.txt | grep 'foo' | sed -e 's/foo/bar/g' * * @author Brian Cavalier * @author John Hann */ (function(define) { define(function(require) { var when = require('./when'); var all = when.Promise.all; var slice = Array.prototype.slice; /** * Run array of tasks in a pipeline where the next * tasks receives the result of the previous. The first task * will receive the initialArgs as its argument list. * @param tasks {Array|Promise} array or promise for array of task functions * @param [initialArgs...] {*} arguments to be passed to the first task * @return {Promise} promise for return value of the final task */ return function pipeline(tasks /* initialArgs... */) { // Self-optimizing function to run first task with multiple // args using apply, but subsequence tasks via direct invocation var runTask = function(args, task) { runTask = function(arg, task) { return task(arg); }; return task.apply(null, args); }; return all(slice.call(arguments, 1)).then(function(args) { return when.reduce(tasks, function(arg, task) { return runTask(arg, task); }, args); }); }; }); })(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); });