srecord noeq SimpleMovingAverage(int length) { selfType length(int length) { this.length = length; this; } simplyCached SimpleCircularBuffer values() { ret new SimpleCircularBuffer(length); } new Average avg; double get() { ret avg!; } double add(double x) { while (values().size() > max(length-1, 0)) avg.remove(values().remove()); values().add(x); avg.add(x); ret get(); } void reset { resetFields(this, "avg"); } bool complete() { ret avg.n() >= length; } }