Iterators

Iterators offer a concise and expressive way to traverse a quadrille, especially when combined with filters. Both for…of and visit rely on the lazy cells() generator to yield filtered cells, enabling functional-style iteration without the verbosity and pitfalls of manual indexing.

Manual Iteration Using Nested Loops

The classic approach to traversing a grid—often seen with 2D arrays or matrices—involves nested for loops:

function callback(row, col) {
  /* callback body */
}

for (let row = 0; row < quadrille.height; row++) {
  for (let col = 0; col < quadrille.width; col++) {
    callback(row, col);
  }
}

While straightforward and likely familiar, this pattern is prone to off-by-one and indexing errors, and doesn’t support filtering without additional logic. It’s a good fallback—but modern alternatives are often cleaner and safer.

⚠️
For quick prototypes or direct indexing, manual loops are still fine. But for filtering, clarity, and maintainability, use the iterator methods introduce here.

Method Overview