sliding method
/// returns a list of pairs of values slided by n. example
[0,1,2,3,4,5,...].sliding(3) // => [[0,1,2],[1,2,3],[2,3,4],...]
Implementation
Iterable<Iterable<T>> sliding(int n) =>
fold<$<Iterable<Iterable<T>>, Iterable<Iterable<T>>>>(
$(Iterable<Iterable<T>>.empty(), []), (acc, element) {
if (acc.$1.isEmpty) {
return $(acc.$0, [
[element]
]);
} else if (acc.$1.first.length == n - 1) {
final nxt = acc.$1.skip(1).map((l) => [...l, element]);
return $([
...acc.$0,
[...acc.$1.first, element]
], [
...nxt,
[element]
]);
} else {
final nxt = acc.$1.map((l) => [...l, element]);
return $(acc.$0, [
...nxt,
[element]
]);
}
}).$0;