rubico
Version:
[a]synchronous functional programming
66 lines (62 loc) • 1.78 kB
JavaScript
const funcConcat = require('./funcConcat')
const isPromise = require('./isPromise')
const __ = require('./placeholder')
const curry3 = require('./curry3')
const curry5 = require('./curry5')
const objectSet = require('./objectSet')
/**
* @name asyncFunctionObjectAllSeries
*
* @synopsis
* ```coffeescript [specscript]
* asyncFunctionObjectAllSeries(
* funcs Array<function>,
* args Array,
* result Array,
* keys Array<string>,
* keysIndex number
* ) -> Promise|Array
* ```
*
* @TODO benchmark vs regular promise handling
*/
const asyncFunctionObjectAllSeries = async function (funcs, args, result, keys, keysIndex) {
const keysLength = keys.length
while (++keysIndex < keysLength) {
const key = keys[keysIndex]
const f = funcs[key]
let resultElement = typeof f == 'function' ? f(...args) : f
if (isPromise(resultElement)) {
resultElement = await resultElement
}
result[key] = resultElement
}
return result
}
/**
* @name functionObjectAllSeries
*
* @synopsis
* ```coffeescript [specscript]
* functionObjectAllSeries(funcs Object<function|any>, args Array) -> Promise|Array
* ```
*/
const functionObjectAllSeries = function (funcs, args) {
const result = {}
const keys = Object.keys(funcs)
const keysLength = keys.length
let keysIndex = -1
while (++keysIndex < keysLength) {
const key = keys[keysIndex]
const f = funcs[key]
const resultElement = typeof f == 'function' ? f(...args) : f
if (isPromise(resultElement)) {
return resultElement.then(funcConcat(
curry3(objectSet, result, key, __),
curry5(asyncFunctionObjectAllSeries, funcs, args, __, keys, keysIndex)))
}
result[key] = resultElement
}
return result
}
module.exports = functionObjectAllSeries