2 var $ = require('../internals/export');
3 var call = require('../internals/function-call');
4 var uncurryThis = require('../internals/function-uncurry-this');
5 var aCallable = require('../internals/a-callable');
6 var getIterator = require('../internals/get-iterator');
7 var iterate = require('../internals/iterate');
9 var push = uncurryThis([].push);
11 // `Map.groupBy` method
12 // https://github.com/tc39/proposal-collection-methods
13 $({ target: 'Map', stat: true }, {
14 groupBy: function groupBy(iterable, keyDerivative) {
15 aCallable(keyDerivative);
16 var iterator = getIterator(iterable);
17 var newMap = new this();
18 var has = aCallable(newMap.has);
19 var get = aCallable(newMap.get);
20 var set = aCallable(newMap.set);
21 iterate(iterator, function (element) {
22 var derivedKey = keyDerivative(element);
23 if (!call(has, newMap, derivedKey)) call(set, newMap, derivedKey, [element]);
24 else push(call(get, newMap, derivedKey), element);
25 }, { IS_ITERATOR: true });