slidingWindow function
Returns a list where each element is the agg of values over a window of length size.
If size > length, returns empty list.
Implementation
List<double> slidingWindow(List<num> values, int size, WindowAggregate agg) {
if (size < 1 || values.length < size) return <double>[];
final List<double> out = <double>[];
// Last valid start is values.length - size; the inclusive `<=` produces exactly
// (length - size + 1) windows. A non-inclusive bound would drop the final window.
for (int i = 0; i <= values.length - size; i++) {
final List<num> window = values.sublist(i, i + size);
switch (agg) {
case WindowAggregate.min:
out.add(
window.fold<double>(double.infinity, (double a, num b) => a < b ? a : b.toDouble()),
);
break;
case WindowAggregate.max:
out.add(
window.fold<double>(
double.negativeInfinity,
(double a, num b) => a > b ? a : b.toDouble(),
),
);
break;
case WindowAggregate.sum:
out.add(window.fold<double>(0, (double s, num v) => s + v.toDouble()));
break;
case WindowAggregate.avg:
final double sum = window.fold<double>(0, (double s, num v) => s + v.toDouble());
out.add(sum / window.length);
break;
}
}
return out;
}