summaryrefslogtreecommitdiff
path: root/backend/reduce.js
blob: 87a6e40230452039c79b0b66d1823f4f2f2f4422 (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
55
56
57
58
59
60
61
#!/usr/bin/node

const R = require('ramda'),
  utils = require('./utils');

function cleanPayloads(config) {
  return R.map(R.pipe(
    // some Talents are 'null', some are 'NoTalent'
    R.over(R.lensProp('Talent'), R.defaultTo('NoTalent')),
  ));
}

function aggregatePayloads(config) {
  // Ramda group() only groups neighbors, so sort beforehand
  const sorter  = R.props(config.group);
  const grouper = utils.eqPropses(config.group);

  const aggregator = R.pipe(
    // calculate inferred attributes
    R.map(R.apply(R.pipe, config.derived)),
    // sum & count
    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.compose(R.defaultTo(0), R.prop('Winner'));

  // 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(transformer, R.sortBy(sorter));
}

module.exports = {
  cleanPayloads,
  aggregatePayloads,
  deriveStatistics,
};