summaryrefslogtreecommitdiff
path: root/reduce.js
blob: b17a246afa2d2fb29512999a64a9ebc179abc351 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/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(R.concat(config.sum, R.of('Count'))),
          utils.mergeAllWith(R.add),
          utils.unlist,
        ),
      ]),
    ),
  );

  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,
};