UNPKG

rubico

Version:

[a]synchronous functional programming

36 lines (33 loc) 1.06 kB
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