// var _curryN = require('./internal/_curryN')
// var _dispatchable = require('./internal/_dispatchable')
// var _has = require('./internal/_has')
// var _reduce = require('./internal/_reduce')
// var _xreduceBy = require('./internal/_xreduceBy')
//
//
// /**
// * Groups the elements of the list according to the result of calling
// * the String-returning function `keyFn` on each element and reduces the elements
// * of each group to a single value via the reducer function `valueFn`.
// *
// * This function is basically a more general [`groupBy`](#groupBy) function.
// *
// * Acts as a transducer if a transformer is given in list position.
// *
// * @func
// * @memberOf R
// * @since v0.20.0
// * @category List
// * @sig ((a, b) -> a) -> a -> (b -> String) -> [b] -> {String: a}
// * @param {Function} valueFn The function that reduces the elements of each group to a single
// * value. Receives two values, accumulator for a particular group and the current element.
// * @param {*} acc The (initial) accumulator value for each group.
// * @param {Function} keyFn The function that maps the list's element into a key.
// * @param {Array} list The array to group.
// * @return {Object} An object with the output of `keyFn` for keys, mapped to the output of
// * `valueFn` for elements which produced that key when passed to `keyFn`.
// * @see R.groupBy, R.reduce
// * @example
// *
// * var reduceToNamesBy = R.reduceBy((acc, student) => acc.concat(student.name), []);
// * var namesByGrade = reduceToNamesBy(function(student) {
// * var score = student.score;
// * return score < 65 ? 'F' :
// * score < 70 ? 'D' :
// * score < 80 ? 'C' :
// * score < 90 ? 'B' : 'A';
// * });
// * var students = [{name: 'Lucy', score: 92},
// * {name: 'Drew', score: 85},
// * // ...
// * {name: 'Bart', score: 62}];
// * namesByGrade(students);
// * // {
// * // 'A': ['Lucy'],
// * // 'B': ['Drew']
// * // // ...,
// * // 'F': ['Bart']
// * // }
// */
// module.exports = _curryN(4, [], _dispatchable([], _xreduceBy,
// function reduceBy(valueFn, valueAcc, keyFn, list) {
// return _reduce(function(acc, elt) {
// var key = keyFn(elt)
// acc[key] = valueFn(_has(key, acc) ? acc[key] : valueAcc, elt)
// return acc
// }, {}, list)
// }))