How to implement Iterable<E>

By using IterableMixin you only need to implement the iterator-function.

class ChessSquares with IterableMixin<ChessSquare> {
    @override
    Iterator<ChessSquare> get iterator => new ChessSquaresIterator(bits);
    ...
}

Visit http://blog.sethladd.com/2013/03/first-look-at-dart-mixins.html for a short introduction on mixins.

The Iterator-interface is straight forward. You only have to implement the function moveNext and the getter current.


Soo I tried this which is kind of not what I want since I do not want to extend a base class.

/**
 * Chess squares represented as a bitmap.
 */
class ChessSquares extends IterableBase<ChessSquare> {

  Iterator<ChessSquare> get iterator {
    return new ChessSquaresIterator(this);
  }

  ...

}

class ChessSquaresIterator extends Iterator<ChessSquare> {
  int _nextBit;
  int64 _bits;
  ChessSquare _current;

  ChessSquaresIterator(ChessSquares squares) {
    _bits = new int64.fromInt(squares._bits); 
  }

  bool moveNext() {
    _nextBit = _bits.numberOfTrailingZeros();
    if (_nextBit < 64) {
      _current = ChessSquare.values()[_nextBit];
      _bits = _bits & ~_current.bit();
    } else {
      _current = null;
    }
    return _nextBit < 64;
  }

  E get current => _current;
}  

Tags:

Dart