| 46 | } |
| 47 | |
| 48 | function nest(values, map, reduce, keys) { |
| 49 | return (function regroup(values, i) { |
| 50 | if (i >= keys.length) return reduce(values); |
| 51 | const groups = new InternMap(); |
| 52 | const keyof = keys[i++]; |
| 53 | let index = -1; |
| 54 | for (const value of values) { |
| 55 | const key = keyof(value, ++index, values); |
| 56 | const group = groups.get(key); |
| 57 | if (group) group.push(value); |
| 58 | else groups.set(key, [value]); |
| 59 | } |
| 60 | for (const [key, values] of groups) { |
| 61 | groups.set(key, regroup(values, i)); |
| 62 | } |
| 63 | return map(groups); |
| 64 | })(values, 0); |
| 65 | } |