zigZag property

Iterable<T> zigZag

Returns an iterable that walks zig-sag over the Matrix starting in the upper left corner.

Implementation

Iterable<T> get zigZag sync* {
  for (var i = 0; i < colCount + rowCount - 1; i++) {
    if (i.isOdd) {
      // Walk down and left.
      for (var r = i < colCount ? 0 : i - colCount + 1,
              c = i < colCount ? i : colCount - 1;
          r < rowCount && c >= 0;
          r++, c--) {
        yield getUnchecked(r, c);
      }
    } else {
      // Walk up and right.
      for (var r = i < rowCount ? i : rowCount - 1,
              c = i < rowCount ? 0 : i - rowCount + 1;
          r >= 0 && c < colCount;
          r--, c++) {
        yield getUnchecked(r, c);
      }
    }
  }
}