srecord noeq SmoothedMovingAverage(double period) { selfType period(double period) { this.period = period; this; } gettable double value = Double.NaN; gettable long steps; double get() { ret value; } double add(double x) { ++steps; if (isNaN(value)) value = x; else value = blend(value, x, alpha()); ret value; } double alpha() { ret reciprocal(period); } void reset { resetFields(this, "steps value"); } bool complete() { ret steps >= period; } }