sliding method

Iterable<Iterable<T>> sliding(
  1. int n
)

/// 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;