in_threefold_repetition property

bool get in_threefold_repetition

Implementation

bool get in_threefold_repetition {
  /* 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.
   */
  final positions = {};
  var moves = [];
  var repetition = false;

  while (true) {
    var move = undo_move();
    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 = generate_fen().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.isEmpty) {
      break;
    }
    make_move(moves.removeLast());
  }

  return repetition;
}