diff options
| author | schneefux <schneefux+commit@schneefux.xyz> | 2018-04-28 17:37:39 +0200 |
|---|---|---|
| committer | schneefux <schneefux+commit@schneefux.xyz> | 2018-05-05 12:11:38 +0200 |
| commit | c8dc06971c6dab447250bb81cca20836ed5b2772 (patch) | |
| tree | 0a1fc039c29fd4052afd7ff828d9ae3e76fd7bbc /reduce.js | |
| download | brokentalents-c8dc06971c6dab447250bb81cca20836ed5b2772.tar.gz brokentalents-c8dc06971c6dab447250bb81cca20836ed5b2772.zip | |
first working version
Diffstat (limited to 'reduce.js')
| -rw-r--r-- | reduce.js | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/reduce.js b/reduce.js new file mode 100644 index 0000000..8c29055 --- /dev/null +++ b/reduce.js @@ -0,0 +1,58 @@ +#!/usr/bin/node + +const R = require('ramda'), + utils = require('./utils'); + +function aggregatePayloads(config) { + // Ramda group() only groups neighbors, so sort beforehand + const sorter = R.props(config.group); + const grouper = utils.eqPropses(config.group); + + // sum & count + const aggregator = R.pipe( + R.sortBy(sorter), + R.groupWith(grouper), + R.map( + R.converge(utils.mergeAllArgs, [ + R.pipe( + R.project(config.group), + R.prop(0), + ), + R.pipe( + R.project(config.sum), + utils.mergeAllWith(R.add), + utils.unlist, + ), + R.pipe( + R.length, + R.objOf('Count'), + ), + ]), + ), + ); + + return aggregator; +} + +function deriveStatistics(config) { + const sorter = R.converge(R.multiply, [ + R.prop('Winner'), + R.prop('Count'), + ]); + + // divide sums by counts = averages + const transformer = R.map( + R.converge(utils.mergeAllArgs, [ + utils.projectProps(config.group), + utils.divPropsByProp('Count', config.sum), + utils.projectProps(['Count']), + ]) + ); + + return R.compose(R.sortBy(sorter), transformer); +} + +module.exports = { + aggregatePayloads, + deriveStatistics, +}; |
