krl-stdlib
Version:
Standard library for KRL
64 lines • 2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.aggregateEvent = void 0;
const _ = require("lodash");
const krl = require("./krl");
function toFloat(v) {
return krl.toNumberOrNull(v) || 0;
}
const aggregators = {
max(values) {
return _.max(_.map(values, toFloat));
},
min(values) {
return _.min(_.map(values, toFloat));
},
sum(values) {
return _.reduce(_.map(values, toFloat), function (sum, n) {
return sum + n;
}, 0);
},
avg(values) {
var sum = _.reduce(_.map(values, toFloat), function (sum, n) {
return sum + n;
}, 0);
return sum / _.size(values);
},
push(values) {
return values;
},
};
function aggregateEvent(state, op, pairs) {
state = state || {};
const stateStates = Array.isArray(state.states) ? state.states : [];
const isStart = stateStates.indexOf("start") >= 0;
const isEnd = stateStates.indexOf("end") >= 0;
let newAggregates = {};
let newSetting = {};
for (const [name, value] of pairs) {
let vals = state.aggregates && Array.isArray(state.aggregates[name])
? state.aggregates[name]
: [];
if (isStart) {
// reset the aggregated values every time the state machine resets
vals = [value];
}
else if (isEnd) {
// keep a sliding window every time the state machine hits end again i.e. select when repeat ..
vals = _.tail(vals.concat([value]));
}
else {
vals = vals.concat([value]);
}
newAggregates[name] = vals;
if (aggregators[op]) {
newSetting[name] = aggregators[op](vals);
}
}
return Object.assign({}, state, {
aggregates: newAggregates,
setting: Object.assign({}, state.setting, newSetting),
});
}
exports.aggregateEvent = aggregateEvent;
//# sourceMappingURL=aggregateEvent.js.map