srecord noeq SimpleMovingAverage(int length) { selfType length(int length) { this.length = length; this; } simplyCached CircularFifoBuffer values() { ret new CircularFifoBuffer(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(); } }