foop
Version:
interfaces that describe their intentions.
61 lines (56 loc) • 6.02 kB
JavaScript
var ENV_DEBUG = require('../../env/debug')
var argumentor = require('../../cast/argumentor')
var curry = require('../../fp/curry')
var max = require('../../math/max')
var reduce = require('./_reduce')
var pluck = require('./pluck')
var map = require('./_map')
/**
* Accepts a converging function and a list of branching functions and returns
* a new function. When invoked, this new function is applied to some
* arguments, each branching function is applied to those same arguments. The
* results of each branching function are passed as arguments to the converging
* function to produce the return value.
* @since 5.0.0-beta.6
* @memberOf fp
*
* @param {Function} after A function. `after` will be invoked with the return values of
* `fn1` and `fn2` as its arguments.
* @param {Array} functions A list of functions.
* @return {Function} A new function.
*
* @NOTE important to use 2+ functions in functions param
*
* @func
* @fork v0.4.2
* @category Function
* @sig ((x1, x2, ...) -> z) -> [((a, b, ...) -> x1), ((a, b, ...) -> x2), ...] -> (a -> b -> ... -> z)
* @symb converge(f, [g, h])(a, b) = f(g(a, b), h(a, b))
*
* @see useWith
*
* @example
*
* var average = converge(divide, [sum, length])
* average([1, 2, 3, 4, 5, 6, 7]) //=> 4
*
* var strangeConcat = converge(concat, [toUpper, toLower])
* strangeConcat("Yodel") //=> "YODELyodel"
*
*/
function _converge(after, fns) {
var num = reduce(max, 0, pluck('length', fns))
return curry(num, function() {
var args = argumentor.apply(null, arguments)
var self = this
var index = 0
return after.apply(self, map(function(fn) {
fn = fn || fns[index++]
// console.log({fn, args, fns, after, index, i: fns[index++]})
return fn.apply(self, args)
}, fns))
})
}
var converge = curry(2, _converge)
module.exports = converge
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVyZ2UuanMiLCJzb3VyY2VzIjpbImNvbnZlcmdlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IEVOVl9ERUJVRyA9IHJlcXVpcmUoJy4uLy4uL2Vudi9kZWJ1ZycpXG5jb25zdCBhcmd1bWVudG9yID0gcmVxdWlyZSgnLi4vLi4vY2FzdC9hcmd1bWVudG9yJylcbmNvbnN0IGN1cnJ5ID0gcmVxdWlyZSgnLi4vLi4vZnAvY3VycnknKVxuY29uc3QgbWF4ID0gcmVxdWlyZSgnLi4vLi4vbWF0aC9tYXgnKVxuY29uc3QgcmVkdWNlID0gcmVxdWlyZSgnLi9fcmVkdWNlJylcbmNvbnN0IHBsdWNrID0gcmVxdWlyZSgnLi9wbHVjaycpXG5jb25zdCBtYXAgPSByZXF1aXJlKCcuL19tYXAnKVxuXG4vKipcbiAqIEFjY2VwdHMgYSBjb252ZXJnaW5nIGZ1bmN0aW9uIGFuZCBhIGxpc3Qgb2YgYnJhbmNoaW5nIGZ1bmN0aW9ucyBhbmQgcmV0dXJuc1xuICogYSBuZXcgZnVuY3Rpb24uIFdoZW4gaW52b2tlZCwgdGhpcyBuZXcgZnVuY3Rpb24gaXMgYXBwbGllZCB0byBzb21lXG4gKiBhcmd1bWVudHMsIGVhY2ggYnJhbmNoaW5nIGZ1bmN0aW9uIGlzIGFwcGxpZWQgdG8gdGhvc2Ugc2FtZSBhcmd1bWVudHMuIFRoZVxuICogcmVzdWx0cyBvZiBlYWNoIGJyYW5jaGluZyBmdW5jdGlvbiBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byB0aGUgY29udmVyZ2luZ1xuICogZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgcmV0dXJuIHZhbHVlLlxuICogQHNpbmNlIDUuMC4wLWJldGEuNlxuICogQG1lbWJlck9mIGZwXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gYWZ0ZXIgQSBmdW5jdGlvbi4gYGFmdGVyYCB3aWxsIGJlIGludm9rZWQgd2l0aCB0aGUgcmV0dXJuIHZhbHVlcyBvZlxuICogICAgICAgIGBmbjFgIGFuZCBgZm4yYCBhcyBpdHMgYXJndW1lbnRzLlxuICogQHBhcmFtIHtBcnJheX0gZnVuY3Rpb25zIEEgbGlzdCBvZiBmdW5jdGlvbnMuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBuZXcgZnVuY3Rpb24uXG4gKlxuICogQE5PVEUgaW1wb3J0YW50IHRvIHVzZSAyKyBmdW5jdGlvbnMgaW4gZnVuY3Rpb25zIHBhcmFtXG4gKlxuICogQGZ1bmNcbiAqIEBmb3JrIHYwLjQuMlxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAc2lnICgoeDEsIHgyLCAuLi4pIC0+IHopIC0+IFsoKGEsIGIsIC4uLikgLT4geDEpLCAoKGEsIGIsIC4uLikgLT4geDIpLCAuLi5dIC0+IChhIC0+IGIgLT4gLi4uIC0+IHopXG4gKiBAc3ltYiBjb252ZXJnZShmLCBbZywgaF0pKGEsIGIpID0gZihnKGEsIGIpLCBoKGEsIGIpKVxuICpcbiAqIEBzZWUgdXNlV2l0aFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgICB2YXIgYXZlcmFnZSA9IGNvbnZlcmdlKGRpdmlkZSwgW3N1bSwgbGVuZ3RoXSlcbiAqICAgICAgYXZlcmFnZShbMSwgMiwgMywgNCwgNSwgNiwgN10pIC8vPT4gNFxuICpcbiAqICAgICAgdmFyIHN0cmFuZ2VDb25jYXQgPSBjb252ZXJnZShjb25jYXQsIFt0b1VwcGVyLCB0b0xvd2VyXSlcbiAqICAgICAgc3RyYW5nZUNvbmNhdChcIllvZGVsXCIpIC8vPT4gXCJZT0RFTHlvZGVsXCJcbiAqXG4gKi9cbmZ1bmN0aW9uIF9jb252ZXJnZShhZnRlciwgZm5zKSB7XG4gIGNvbnN0IG51bSA9IHJlZHVjZShtYXgsIDAsIHBsdWNrKCdsZW5ndGgnLCBmbnMpKVxuICByZXR1cm4gY3VycnkobnVtLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBhcmdzID0gYXJndW1lbnRvci5hcHBseShudWxsLCBhcmd1bWVudHMpXG4gICAgY29uc3Qgc2VsZiA9IHRoaXNcbiAgICBsZXQgaW5kZXggPSAwXG5cbiAgICByZXR1cm4gYWZ0ZXIuYXBwbHkoc2VsZiwgbWFwKGZ1bmN0aW9uKGZuKSB7XG4gICAgICBmbiA9IGZuIHx8IGZuc1tpbmRleCsrXVxuICAgICAgXG4gICAgICAvLyBjb25zb2xlLmxvZyh7Zm4sIGFyZ3MsIGZucywgYWZ0ZXIsIGluZGV4LCBpOiBmbnNbaW5kZXgrK119KVxuICAgICAgcmV0dXJuIGZuLmFwcGx5KHNlbGYsIGFyZ3MpXG4gICAgfSwgZm5zKSlcbiAgfSlcbn1cblxuY29uc3QgY29udmVyZ2UgPSBjdXJyeSgyLCBfY29udmVyZ2UpXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcmdlXG4iXSwibmFtZXMiOlsiY29uc3QiLCJsZXQiXSwibWFwcGluZ3MiOiJBQUFBQSxHQUFLLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztBQUM1Q0EsR0FBSyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsdUJBQXVCLENBQUM7QUFDbkRBLEdBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDO0FBQ3ZDQSxHQUFLLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztBQUNyQ0EsR0FBSyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDO0FBQ25DQSxHQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7QUFDaENBLEdBQUssQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQzdCLFNBQVMsU0FBUyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUU7RUFDN0JBLEdBQUssQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNoRCxPQUFPLEtBQUssQ0FBQyxHQUFHLEVBQUUsV0FBVztJQUMzQkEsR0FBSyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUM7SUFDOUNBLEdBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSTtJQUNqQkMsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDOztJQUViLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLFNBQVMsRUFBRSxFQUFFO01BQ3hDLEVBQUUsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDOzs7TUFHdkIsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7S0FDNUIsRUFBRSxHQUFHLENBQUMsQ0FBQztHQUNULENBQUM7Q0FDSDs7QUFFREQsR0FBSyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztBQUNwQyxNQUFNLENBQUMsT0FBTyxHQUFHLFFBQVE7In0=