summaryrefslogtreecommitdiff
path: root/reduce.js
diff options
context:
space:
mode:
authorschneefux <schneefux+commit@schneefux.xyz>2018-04-28 17:37:39 +0200
committerschneefux <schneefux+commit@schneefux.xyz>2018-05-05 12:11:38 +0200
commitc8dc06971c6dab447250bb81cca20836ed5b2772 (patch)
tree0a1fc039c29fd4052afd7ff828d9ae3e76fd7bbc /reduce.js
downloadbrokentalents-c8dc06971c6dab447250bb81cca20836ed5b2772.tar.gz
brokentalents-c8dc06971c6dab447250bb81cca20836ed5b2772.zip
first working version
Diffstat (limited to 'reduce.js')
-rw-r--r--reduce.js58
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,
+};