///|
/// The inverse of a forward jump: its destination must hold the only peg of the triple.
fn reverse_enabled(bits : UInt64, j : Jump) -> Bool {
(bits & bit(j.from)) == 0UL &&
(bits & bit(j.over)) == 0UL &&
(bits & bit(j.to)) != 0UL
}
///|
pub fn Board::unplay(
self : Board,
pos : Position,
move_id : Int,
) -> Position raise PegError {
self.validate(pos)
if move_id < 0 || move_id >= self.jumps.length() {
raise InvalidMove(move_id)
}
let j = self.jumps[move_id]
if !reverse_enabled(pos.bits, j) {
raise InvalidMove(move_id)
}
{ bits: transition(pos.bits, j) }
}
///|
pub fn Board::reverse_moves(
self : Board,
pos : Position,
) -> Array[Int] raise PegError {
self.validate(pos)
let ids = []
for i = 0; i < self.jumps.length(); i = i + 1 {
if reverse_enabled(pos.bits, self.jumps[i]) {
ids.push(i)
}
}
ids
}