diff --git a/ghost/promise/lib/pipeline.js b/ghost/promise/lib/pipeline.js new file mode 100644 index 00000000000..18d99b5dc30 --- /dev/null +++ b/ghost/promise/lib/pipeline.js @@ -0,0 +1,31 @@ +/** + * # Pipeline Utility + * + * Based on pipeline.js from when.js: + * https://github.com/cujojs/when/blob/3.7.4/pipeline.js + */ +var Promise = require('bluebird'); + +function pipeline(tasks /* initial arguments */) { + var args = Array.prototype.slice.call(arguments, 1), + + runTask = function (task, args) { + // Self-optimizing function to run first task with multiple + // args using apply, but subsequent tasks via direct invocation + runTask = function (task, arg) { + return task(arg); + }; + + return task.apply(null, args); + }; + + // Resolve any promises for the arguments passed in first + return Promise.all(args).then(function (args) { + // Iterate through the tasks passing args from one into the next + return Promise.reduce(tasks, function (arg, task) { + return runTask(task, arg); + }, args); + }); +} + +module.exports = pipeline; diff --git a/ghost/promise/lib/sequence.js b/ghost/promise/lib/sequence.js new file mode 100644 index 00000000000..34d6d424566 --- /dev/null +++ b/ghost/promise/lib/sequence.js @@ -0,0 +1,17 @@ +var Promise = require('bluebird'); + +/** + * expects an array of functions returning a promise + */ +function sequence(tasks /* Any Arguments */) { + var args = Array.prototype.slice.call(arguments, 1); + + return Promise.reduce(tasks, function (results, task) { + return task.apply(this, args).then(function (result) { + results.push(result); + return results; + }); + }, []); +} + +module.exports = sequence;