UNPKG

foop

Version:

interfaces that describe their intentions.

61 lines (56 loc) 6.02 kB
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=