inThreefoldRepetition property Null safety

bool inThreefoldRepetition

Implementation

bool get inThreefoldRepetition {
  /* TODO: while this function is fine for casual use, a better
   * implementation would use a Zobrist key (instead of FEN). the
   * Zobrist key would be maintained in the make_move/undo_move functions,
   * avoiding the costly that we do below.
   */
  List moves = [];
  Map positions = {};
  bool repetition = false;

  while (true) {
    var move = undoMove();
    if (move == null) {
      break;
    }
    moves.add(move);
  }

  while (true) {
    /* remove the last two fields in the FEN string, they're not needed
     * when checking for draw by rep */
    var fen = generateFen().split(' ').sublist(0, 4).join(' ');

    /* has the position occurred three or move times */
    positions[fen] = (positions.containsKey(fen)) ? positions[fen] + 1 : 1;
    if (positions[fen] >= 3) {
      repetition = true;
    }

    if (moves.length == 0) {
      break;
    }
    makeMove(moves.removeLast());
  }

  return repetition;
}