rubico
Version:
[a]synchronous functional programming
36 lines (33 loc) • 1.06 kB
JavaScript
const isPromise = require('./isPromise')
const promiseAll = require('./promiseAll')
const always = require('./always')
/**
* @name generatorFunctionForEach
*
* @synopsis
* ```coffeescript [specscript]
* var T any,
* generatorFunction ...args=>Generator<T>,
* callback T=>()
*
* generatorFunctionForEach(generatorFunction, callback) -> ...args=>Promise|Generator<>
* ```
*
* @description
* Create a generator executor that executes a callback for each item of a generator generated by a generator function. The executor may return a promise if any execution is asynchronous.
*/
const generatorFunctionForEach = (
generatorFunction, callback,
) => function* executingCallbackForEach(...args) {
const promises = [],
generator = generatorFunction(...args)
for (const item of generator) {
const operation = callback(item)
if (isPromise(operation)) {
promises.push(operation)
}
}
return promises.length == 0 ? generator
: promiseAll(promises).then(always(generator))
}
module.exports = generatorFunctionForEach