var _curry2 = require('./internal/_curry2');
var _map = require('./internal/_map');
var curryN = require('./curryN');
var max = require('./max');
var pluck = require('./pluck');
var reduce = require('./reduce');


/**
 * 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.
 *
 * @func
 * @memberOf R
 * @since v0.4.2
 * @category Function
 * @sig (x1 -> x2 -> ... -> z) -> [(a -> b -> ... -> x1), (a -> b -> ... -> x2), ...] -> (a -> b -> ... -> z)
 * @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.
 * @example
 *
 *      var add = (a, b) => a + b;
 *      var multiply = (a, b) => a * b;
 *      var subtract = (a, b) => a - b;
 *
 *      //≅ multiply( add(1, 2), subtract(1, 2) );
 *      R.converge(multiply, [add, subtract])(1, 2); //=> -3
 *
 *      var add3 = (a, b, c) => a + b + c;
 *      R.converge(add3, [multiply, add, subtract])(1, 2); //=> 4
 * @symb R.converge(f, [g, h])(a, b) = f(g(a, b), h(a, b))
 */
module.exports = _curry2(function converge(after, fns) {
  return curryN(reduce(max, 0, pluck('length', fns)), function() {
    var args = arguments;
    var context = this;
    return after.apply(context, _map(function(fn) {
      return fn.apply(context, args);
    }, fns));
  });
});

@@ -987,329 +987,95 @@
 ar a
-dd = (a, b) =%3E a + b;%0A *      var multiply = (a, b) =%3E a * b;%0A *      var subtract = (a, b) =%3E a - b;%0A *%0A *      //%E2%89%85 multiply( add(1, 2), subtract(1, 2) );%0A *      R.converge(multiply, %5Badd, subtract%5D)(1, 2); //=%3E -3%0A *%0A *      var add3 = (a, b, c) =%3E a + b + c;%0A *      R.converge(add3, %5Bmultiply, add, subtract%5D)(1, 2);
+verage = R.converge(R.divide, %5BR.sum, R.length%5D)%0A *      average(%5B1, 2, 3, 4, 5, 6, 7%5D)
  //=

Fix duplicate declaration errors in converge example in REPL (#1878)