12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- 'use strict';
- const toArray = require('./array').toArray;
- const argsToArray = fn => {
- // must not be a fat arrow since it breaks the arguments
- return function () {
- return fn(toArray(arguments));
- };
- };
- const curry = fn => {
- return function curried () {
- const that = this,
- args = Array.prototype.slice.call(arguments);
- if (args.length < fn.length) {
- return curried.bind.apply(curried, [that].concat(args));
- } else {
- return fn.apply(that, args);
- }
- };
- };
- const combine = argsToArray(fns => fns.reverse().reduce((fnc, fn) => val => fnc(fn(val))));
- // cannot use fat arrow function since we don't get the arguments, then
- const promisify = (fn, context = null) => function () {
- // copy passed arguments to a new array
- const args = toArray(arguments);
- return new Promise((resolve, reject) => {
- // add a callback to the arguments, which resolves the promise with the result
- args.push((err, data) => {
- if (err) {
- reject(err);
- } else {
- resolve(data);
- }
- });
- // call the original function with our callback flavoured arguments
- fn.apply(context, args);
- });
- };
- /**
- returns a function which executes promises one after another
- @param promiseGenerators an array of functions which return a promise
- @return function which executes the promises
- */
- const enqueue = (promiseGenerators) => {
- return promiseGenerators.reduce((f, promiseGenerator) => {
- return () => {
- return f().then(promiseGenerator);
- };
- });
- };
- /**
- Returns a function which executes promises one after another. The resulting function
- returns a promise, which gets filled with an array of the results of the single promises.
- @param promiseGenerators an array of functions which return a promise
- @return function which executes the promises
- */
- const enqueueWithResults = (function () {
- const fnQueue = (results, promiseGenerators) => promiseGenerators.reduce((f, promiseGenerator) => {
- return () => {
- return f().then(result => {
- results.push(result);
- return promiseGenerator();
- });
- };
- });
- return function (promiseGenerators) {
- return () => {
- const results = [];
- return fnQueue(results, promiseGenerators)().then(result => {
- results.push(result);
- return results;
- });
- };
- };
- }());
- module.exports = {
- argsToArray,
- combine,
- curry,
- promisify,
- enqueue,
- enqueueWithResults
- };
|