rubico
Version:
[a]synchronous functional programming
56 lines (52 loc) • 1.53 kB
JavaScript
const funcConcat = require('./funcConcat')
const isPromise = require('./isPromise')
const __ = require('./placeholder')
const curry3 = require('./curry3')
const curry4 = require('./curry4')
const objectSet = require('./objectSet')
/**
* @name asyncFunctionArrayAllSeries
*
* @synopsis
* ```coffeescript [specscript]
* asyncFunctionArrayAllSeries(
* funcs Array<function>,
* args Array,
* result Array,
* funcsIndex number
* ) -> Promise|Array
* ```
*
* @TODO benchmark vs regular promise handling
*/
const asyncFunctionArrayAllSeries = async function (funcs, args, result, funcsIndex) {
const funcsLength = funcs.length
while (++funcsIndex < funcsLength) {
const resultItem = funcs[funcsIndex](...args)
result[funcsIndex] = isPromise(resultItem) ? await resultItem : resultItem
}
return result
}
/**
* @name functionArrayAllSeries
*
* @synopsis
* ```coffeescript [specscript]
* functionArrayAllSeries(funcs Array<function>, args Array) -> Promise|Array
* ```
*/
const functionArrayAllSeries = function (funcs, args) {
const funcsLength = funcs.length, result = []
let funcsIndex = -1
while (++funcsIndex < funcsLength) {
const resultItem = funcs[funcsIndex](...args)
if (isPromise(resultItem)) {
return resultItem.then(funcConcat(
curry3(objectSet, result, funcsIndex, __),
curry4(asyncFunctionArrayAllSeries, funcs, args, __, funcsIndex)))
}
result[funcsIndex] = resultItem
}
return result
}
module.exports = functionArrayAllSeries