From c8dc06971c6dab447250bb81cca20836ed5b2772 Mon Sep 17 00:00:00 2001 From: schneefux Date: Sat, 28 Apr 2018 17:37:39 +0200 Subject: first working version --- reduce.js | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 reduce.js (limited to 'reduce.js') 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, +}; -- cgit v1.3.1