spiral property

Iterable<T> spiral

Returns an iterable that walks clockwise over the Matrix starting in the upper left corner.

Implementation

Iterable<T> get spiral sync* {
  var k = 0, l = 0;
  var m = rowCount, n = colCount;
  while (k < m && l < n) {
    // First row from the remaining rows:
    for (var i = l; i < n; i++) {
      yield getUnchecked(k, i);
    }
    k++;
    // Last column from the remaining columns:
    for (var i = k; i < m; i++) {
      yield getUnchecked(i, n - 1);
    }
    n--;
    // Last row from the remaining rows:
    if (k < m) {
      for (var i = n - 1; i >= l; i--) {
        yield getUnchecked(m - 1, i);
      }
      m--;
    }
    // First column from the remaining columns:
    if (l < n) {
      for (var i = m - 1; i >= k; i--) {
        yield getUnchecked(i, l);
      }
      l++;
    }
  }
}