Skip to content

Commit

Permalink
Merge pull request #438 from lenguyenthanh/which-pieceMap-is-better
Browse files Browse the repository at this point in the history
Implement faster pieceMap
  • Loading branch information
lenguyenthanh authored Jul 6, 2023
2 parents 459d33b + b3ba98c commit 4b4c392
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 2 deletions.
4 changes: 4 additions & 0 deletions src/main/scala/ByColor.scala
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ case class ByColor[A](white: A, black: A):
f(white)
f(black)

def foreach[U](f: (Color, A) => U): Unit =
f(White, white)
f(Black, black)

def forall(pred: A => Boolean) = pred(white) && pred(black)

def exists(pred: A => Boolean) = pred(white) || pred(black)
Expand Down
16 changes: 16 additions & 0 deletions src/main/scala/Role.scala
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,22 @@ case class ByRole[A](pawn: A, knight: A, bishop: A, rook: A, queen: A, king: A):
def fold[B](z: B)(f: (B, Role, A) => B): B =
f(f(f(f(f(f(z, Pawn, pawn), Knight, knight), Bishop, bishop), Rook, rook), Queen, queen), King, king)

def foreach[U](f: A => U): Unit =
f(pawn)
f(knight)
f(bishop)
f(rook)
f(queen)
f(king)

def foreach[U](f: (Role, A) => U): Unit =
f(Pawn, pawn)
f(Knight, knight)
f(Bishop, bishop)
f(Rook, rook)
f(Queen, queen)
f(King, king)

def findRole(f: A => Boolean): Option[Role] =
if f(pawn) then Some(Pawn)
else if f(knight) then Some(Knight)
Expand Down
10 changes: 8 additions & 2 deletions src/main/scala/bitboard/Board.scala
Original file line number Diff line number Diff line change
Expand Up @@ -145,9 +145,15 @@ case class Board(
inline def isOccupied(inline p: Piece) =
piece(p).nonEmpty

// TODO remove unsafe get
// benchmarked: https://github.com/lichess-org/scalachess/pull/438
lazy val pieceMap: Map[Square, Piece] =
occupied.squares.view.map(s => (s, pieceAt(s).get)).toMap
val m = Map.newBuilder[Square, Piece]
byColor.foreach: (color, c) =>
byRole.foreach: (role, r) =>
val piece = color - role
(c & r).foreach: s =>
m += s -> piece
m.result

def piecesOf(c: Color): Map[Square, Piece] =
pieceMap.filter((_, p) => p.color == c)
Expand Down

0 comments on commit 4b4c392

Please sign in to comment.