const units = require('./units');
const TICK_INTERVAL = 5 * units.SECONDS;
/**
* ExponentiallyMovingWeightedAverage
*/
class ExponentiallyMovingWeightedAverage {
constructor(timePeriod, tickInterval) {
this._timePeriod = timePeriod || units.MINUTE;
this._tickInterval = tickInterval || TICK_INTERVAL;
this._alpha = 1 - Math.exp(-this._tickInterval / this._timePeriod);
this._count = 0;
this._rate = 0;
}
update(n) {
this._count += n;
}
tick() {
const instantRate = this._count / this._tickInterval;
this._count = 0;
this._rate += this._alpha * (instantRate - this._rate);
}
rate(timeUnit) {
return (this._rate || 0) * timeUnit;
}
}
module.exports = ExponentiallyMovingWeightedAverage;