module MoveGen.PieceCaptures (allCaptures, staticExchangeCaptures, knightCaptures, bishopCaptures, rookCaptures, queenCaptures) where

import           AppPrelude

import           Models.Move
import           Models.Piece
import           Models.Position
import           MoveGen.PieceAttacks
import           Utils.Board


-- Captures legal move generator:
-- - Piece captures
-- - En passant captures
-- - Pawn promotions

allCaptures :: Position -> [Move]
allCaptures :: Position -> [Move]
allCaptures pos :: Position
pos@Position {Phase
[ZKey]
Ply
Board
Color
previousPositions :: [ZKey]
halfMoveClock :: Ply
phase :: Phase
color :: Color
player :: Board
enemy :: Board
pawns :: Board
knights :: Board
bishops :: Board
rooks :: Board
queens :: Board
kings :: Board
enPassant :: Board
castling :: Board
attacked :: Board
leapingCheckers :: Board
sliderCheckers :: Board
pinnedPieces :: Board
$sel:previousPositions:Position :: Position -> [ZKey]
$sel:halfMoveClock:Position :: Position -> Ply
$sel:phase:Position :: Position -> Phase
$sel:color:Position :: Position -> Color
$sel:player:Position :: Position -> Board
$sel:enemy:Position :: Position -> Board
$sel:pawns:Position :: Position -> Board
$sel:knights:Position :: Position -> Board
$sel:bishops:Position :: Position -> Board
$sel:rooks:Position :: Position -> Board
$sel:queens:Position :: Position -> Board
$sel:kings:Position :: Position -> Board
$sel:enPassant:Position :: Position -> Board
$sel:castling:Position :: Position -> Board
$sel:attacked:Position :: Position -> Board
$sel:leapingCheckers:Position :: Position -> Board
$sel:sliderCheckers:Position :: Position -> Board
$sel:pinnedPieces:Position :: Position -> Board
..}

  | Board
allCheckers          Board -> Board -> Bool
forall a. Eq a => a -> a -> Bool
== Board
0 = (Board -> Board) -> (Board -> Board) -> [Move]
genCaptures Board -> Board
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id Board -> Board
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
  | Board -> Int
popCount Board
allCheckers Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
1 = [Move]
allKingCaptures
  | Board
sliderCheckers Board -> Board -> Bool
forall a. Eq a => a -> a -> Bool
/= Board
0       = (Board -> Board) -> (Board -> Board) -> [Move]
genCaptures Board -> Board
captureChecker Board -> Board
pawnCaptureChecker
  | Bool
otherwise                = (Board -> Board) -> (Board -> Board) -> [Move]
genCaptures Board -> Board
captureChecker Board -> Board
pawnCaptureChecker

  where
    genCaptures :: (Board -> Board) -> (Board -> Board) -> [Move]
genCaptures =
      Board
-> Board
-> [Move]
-> Position
-> (Board -> Board)
-> (Board -> Board)
-> [Move]
allCapturesHelper Board
allPieces Board
king [Move]
allKingCaptures Position
pos
    pawnCaptureChecker :: Board -> Board
pawnCaptureChecker Board
board =
      Board
board Board -> Board -> Board
& (Board
allCheckers Board -> Board -> Board
.| Board
enPassantChecker)
    captureChecker :: Board -> Board
captureChecker Board
board = Board
board Board -> Board -> Board
& Board
allCheckers
    allKingCaptures :: [Move]
allKingCaptures =
      Piece -> (Int -> Board) -> [Move] -> Int -> [Move]
foldBoardSquares Piece
King (Board -> Board -> Int -> Board
kingCaptures Board
enemy Board
attacked) [] Int
kingSquare
    allCheckers :: Board
allCheckers = Board
leapingCheckers Board -> Board -> Board
.| Board
sliderCheckers
    enPassantChecker :: Board
enPassantChecker =
      let checker :: Board
checker = Board
allCheckers Board -> Board -> Board
& Board
pawns
      in Board
enPassant Board -> Board -> Board
& (Board
checker Board -> Int -> Board
forall a. Bits a => a -> Int -> a
<< Int
8 Board -> Board -> Board
.| Board
checker Board -> Int -> Board
forall a. Bits a => a -> Int -> a
>> Int
8)
    allPieces :: Board
allPieces  = Board
player Board -> Board -> Board
.| Board
enemy
    kingSquare :: Int
kingSquare = Board -> Int
lsb Board
king
    king :: Board
king       = Board
playerBoard -> Board -> Board
&Board
kings


allCapturesHelper :: Board -> Board -> [Move] -> Position -> (Board -> Board) -> (Board -> Board) -> [Move]
allCapturesHelper :: Board
-> Board
-> [Move]
-> Position
-> (Board -> Board)
-> (Board -> Board)
-> [Move]
allCapturesHelper Board
allPieces Board
king [Move]
allKingCaptures Position {Phase
[ZKey]
Ply
Board
Color
$sel:previousPositions:Position :: Position -> [ZKey]
$sel:halfMoveClock:Position :: Position -> Ply
$sel:phase:Position :: Position -> Phase
$sel:color:Position :: Position -> Color
$sel:player:Position :: Position -> Board
$sel:enemy:Position :: Position -> Board
$sel:pawns:Position :: Position -> Board
$sel:knights:Position :: Position -> Board
$sel:bishops:Position :: Position -> Board
$sel:rooks:Position :: Position -> Board
$sel:queens:Position :: Position -> Board
$sel:kings:Position :: Position -> Board
$sel:enPassant:Position :: Position -> Board
$sel:castling:Position :: Position -> Board
$sel:attacked:Position :: Position -> Board
$sel:leapingCheckers:Position :: Position -> Board
$sel:sliderCheckers:Position :: Position -> Board
$sel:pinnedPieces:Position :: Position -> Board
previousPositions :: [ZKey]
halfMoveClock :: Ply
phase :: Phase
color :: Color
player :: Board
enemy :: Board
pawns :: Board
knights :: Board
bishops :: Board
rooks :: Board
queens :: Board
kings :: Board
enPassant :: Board
castling :: Board
attacked :: Board
leapingCheckers :: Board
sliderCheckers :: Board
pinnedPieces :: Board
..} !Board -> Board
f !Board -> Board
g =

    Piece -> (Int -> Board) -> Board -> [Move] -> [Move]
foldBoardMoves     Piece
Pawn   (Board -> Board
g (Board -> Board) -> (Int -> Board) -> Int -> Board
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Board -> Board -> Board -> Color -> Int -> Board
pawnCapturesAndPromotions
                                     Board
enemy Board
noPieces Board
enPassant Color
color)
                              (Board
unpinnedBoard -> Board -> Board
&Board
pawns)

    ([Move] -> [Move]) -> [Move] -> [Move]
forall a b. (a -> b) -> a -> b
$ Piece -> (Int -> Board) -> Board -> [Move] -> [Move]
foldBoardMoves   Piece
Pawn   (Board -> Board
g (Board -> Board) -> (Int -> Board) -> Int -> Board
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Board -> Color -> Board -> Board
pawnPromotions Board
noPieces Color
color
                                 (Board -> Board) -> (Int -> Board) -> Int -> Board
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Int -> Board
toBoard)
                              Board
filePinnedPawns

    ([Move] -> [Move]) -> [Move] -> [Move]
forall a b. (a -> b) -> a -> b
$ Piece -> (Int -> Board) -> Board -> [Move] -> [Move]
foldBoardMoves   Piece
Pawn   (Board -> Board
g (Board -> Board) -> (Int -> Board) -> Int -> Board
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Board -> Color -> Int -> Board
diagPawnCaptures Board
enemy Color
color)
                              Board
diagPinnedPawns

    ([Move] -> [Move]) -> [Move] -> [Move]
forall a b. (a -> b) -> a -> b
$ Piece -> (Int -> Board) -> Board -> [Move] -> [Move]
foldBoardMoves   Piece
Pawn   (Board -> Board
g (Board -> Board) -> (Int -> Board) -> Int -> Board
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Board -> Color -> Int -> Board
antiDiagPawnCaptures Board
enemy Color
color)
                              Board
antiDiagPinnedPawns

    ([Move] -> [Move]) -> [Move] -> [Move]
forall a b. (a -> b) -> a -> b
$ Piece -> (Int -> Board) -> Board -> [Move] -> [Move]
foldBoardMoves   Piece
Knight (Board -> Board
f (Board -> Board) -> (Int -> Board) -> Int -> Board
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Board -> Int -> Board
knightCaptures Board
enemy)
                              (Board
unpinnedBoard -> Board -> Board
&Board
knights)

    ([Move] -> [Move]) -> [Move] -> [Move]
forall a b. (a -> b) -> a -> b
$ Piece -> (Int -> Board) -> Board -> [Move] -> [Move]
foldBoardMoves   Piece
Bishop (Board -> Board
f (Board -> Board) -> (Int -> Board) -> Int -> Board
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Board -> Board -> Board -> Board -> Int -> Board
bishopCaptures
                                     Board
enemy Board
allPieces Board
pinnedPieces Board
king)
                              (Board
playerBoard -> Board -> Board
&Board
bishops)

    ([Move] -> [Move]) -> [Move] -> [Move]
forall a b. (a -> b) -> a -> b
$ Piece -> (Int -> Board) -> Board -> [Move] -> [Move]
foldBoardMoves   Piece
Rook   (Board -> Board
f (Board -> Board) -> (Int -> Board) -> Int -> Board
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Board -> Board -> Board -> Board -> Int -> Board
rookCaptures
                                     Board
enemy Board
allPieces Board
pinnedPieces Board
king)
                              (Board
playerBoard -> Board -> Board
&Board
rooks)

    ([Move] -> [Move]) -> [Move] -> [Move]
forall a b. (a -> b) -> a -> b
$ Piece -> (Int -> Board) -> Board -> [Move] -> [Move]
foldBoardMoves   Piece
Queen  (Board -> Board
f (Board -> Board) -> (Int -> Board) -> Int -> Board
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Board -> Board -> Board -> Board -> Int -> Board
queenCaptures
                                     Board
enemy Board
allPieces Board
pinnedPieces Board
king)
                              (Board
playerBoard -> Board -> Board
&Board
queens)
    [Move]
allKingCaptures

    where
    unpinned :: Board
unpinned            = Board
player Board -> Board -> Board
.\ Board
pinnedPieces
    pinnedPawns :: Board
pinnedPawns         = Board
pinnedPieces Board -> Board -> Board
& Board
pawns
    filePinnedPawns :: Board
filePinnedPawns     = Board
pinnedPawns Board -> Board -> Board
& Board
kingFile
    diagPinnedPawns :: Board
diagPinnedPawns     = Board
pinnedPawns Board -> Board -> Board
& Board
kingDiag
    antiDiagPinnedPawns :: Board
antiDiagPinnedPawns = Board
pinnedPawns Board -> Board -> Board
& Board
kingAntiDiag
    kingFile :: Board
kingFile            = Vector Board
rankMovesVec Vector Board -> Int -> Board
forall a. Storable a => Vector a -> Int -> a
!! Int
kingSquare
    kingDiag :: Board
kingDiag            = Vector Board
antiDiagMovesVec Vector Board -> Int -> Board
forall a. Storable a => Vector a -> Int -> a
!! Int
kingSquare
    kingAntiDiag :: Board
kingAntiDiag        = Vector Board
diagMovesVec Vector Board -> Int -> Board
forall a. Storable a => Vector a -> Int -> a
!! Int
kingSquare
    kingSquare :: Int
kingSquare          = Board -> Int
lsb Board
king
    noPieces :: Board
noPieces            = Board -> Board
(~) Board
allPieces


staticExchangeCaptures :: Square -> Position -> [Move]
staticExchangeCaptures :: Int -> Position -> [Move]
staticExchangeCaptures Int
target pos :: Position
pos@Position {Phase
[ZKey]
Ply
Board
Color
$sel:previousPositions:Position :: Position -> [ZKey]
$sel:halfMoveClock:Position :: Position -> Ply
$sel:phase:Position :: Position -> Phase
$sel:color:Position :: Position -> Color
$sel:player:Position :: Position -> Board
$sel:enemy:Position :: Position -> Board
$sel:pawns:Position :: Position -> Board
$sel:knights:Position :: Position -> Board
$sel:bishops:Position :: Position -> Board
$sel:rooks:Position :: Position -> Board
$sel:queens:Position :: Position -> Board
$sel:kings:Position :: Position -> Board
$sel:enPassant:Position :: Position -> Board
$sel:castling:Position :: Position -> Board
$sel:attacked:Position :: Position -> Board
$sel:leapingCheckers:Position :: Position -> Board
$sel:sliderCheckers:Position :: Position -> Board
$sel:pinnedPieces:Position :: Position -> Board
previousPositions :: [ZKey]
halfMoveClock :: Ply
phase :: Phase
color :: Color
player :: Board
enemy :: Board
pawns :: Board
knights :: Board
bishops :: Board
rooks :: Board
queens :: Board
kings :: Board
enPassant :: Board
castling :: Board
attacked :: Board
leapingCheckers :: Board
sliderCheckers :: Board
pinnedPieces :: Board
..}
  | Board
allCheckers Board -> Board -> Bool
forall a. Eq a => a -> a -> Bool
== Board
0               = [Move]
genCaptures
  | Board -> Int
popCount Board
allCheckers Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
1      = [Move]
allKingCaptures
  | Board -> Int -> Bool
testSquare Board
allCheckers Int
target = [Move]
genCaptures
  | Bool
otherwise                     = []

  where
    genCaptures :: [Move]
genCaptures =
      Int -> Int -> Board -> [Move] -> Position -> [Move]
staticExchangeCapturesHelper Int
target Int
kingSquare Board
allPieces
                                   [Move]
allKingCaptures Position
pos
    allKingCaptures :: [Move]
allKingCaptures =
      Piece -> (Int -> Board) -> [Move] -> Int -> [Move]
foldBoardSquares Piece
King (Board -> Board -> Int -> Board
kingCaptures (Int -> Board
toBoard Int
target) Board
attacked)
      [] Int
kingSquare
    allCheckers :: Board
allCheckers     = Board
leapingCheckers Board -> Board -> Board
.| Board
sliderCheckers
    allPieces :: Board
allPieces       = Board
player Board -> Board -> Board
.| Board
enemy
    kingSquare :: Int
kingSquare      = Board -> Int
lsb Board
king
    king :: Board
king            = Board
playerBoard -> Board -> Board
&Board
kings


staticExchangeCapturesHelper
  :: Square -> Square -> Board -> [Move] -> Position -> [Move]
staticExchangeCapturesHelper :: Int -> Int -> Board -> [Move] -> Position -> [Move]
staticExchangeCapturesHelper
  Int
target Int
king Board
allPieces [Move]
allKingCaptures Position {Phase
[ZKey]
Ply
Board
Color
$sel:previousPositions:Position :: Position -> [ZKey]
$sel:halfMoveClock:Position :: Position -> Ply
$sel:phase:Position :: Position -> Phase
$sel:color:Position :: Position -> Color
$sel:player:Position :: Position -> Board
$sel:enemy:Position :: Position -> Board
$sel:pawns:Position :: Position -> Board
$sel:knights:Position :: Position -> Board
$sel:bishops:Position :: Position -> Board
$sel:rooks:Position :: Position -> Board
$sel:queens:Position :: Position -> Board
$sel:kings:Position :: Position -> Board
$sel:enPassant:Position :: Position -> Board
$sel:castling:Position :: Position -> Board
$sel:attacked:Position :: Position -> Board
$sel:leapingCheckers:Position :: Position -> Board
$sel:sliderCheckers:Position :: Position -> Board
$sel:pinnedPieces:Position :: Position -> Board
previousPositions :: [ZKey]
halfMoveClock :: Ply
phase :: Phase
color :: Color
player :: Board
enemy :: Board
pawns :: Board
knights :: Board
bishops :: Board
rooks :: Board
queens :: Board
kings :: Board
enPassant :: Board
castling :: Board
attacked :: Board
leapingCheckers :: Board
sliderCheckers :: Board
pinnedPieces :: Board
..} =
      Int -> Board -> [Move] -> [Move]
foldBoardPawnMovesConst    Int
target (Board
validSlidersBoard -> Board -> Board
&Board
pawnAttackers)
    ([Move] -> [Move]) -> [Move] -> [Move]
forall a b. (a -> b) -> a -> b
$ Piece -> Int -> Board -> [Move] -> [Move]
foldBoardMovesConst Piece
Knight Int
target (Board
unpinnedBoard -> Board -> Board
&Board
knightAttackers)
    ([Move] -> [Move]) -> [Move] -> [Move]
forall a b. (a -> b) -> a -> b
$ Piece -> Int -> Board -> [Move] -> [Move]
foldBoardMovesConst Piece
Bishop Int
target (Board
validSlidersBoard -> Board -> Board
&Board
bishopAttackers)
    ([Move] -> [Move]) -> [Move] -> [Move]
forall a b. (a -> b) -> a -> b
$ Piece -> Int -> Board -> [Move] -> [Move]
foldBoardMovesConst Piece
Rook   Int
target (Board
validSlidersBoard -> Board -> Board
&Board
rookAttackers)
    ([Move] -> [Move]) -> [Move] -> [Move]
forall a b. (a -> b) -> a -> b
$ Piece -> Int -> Board -> [Move] -> [Move]
foldBoardMovesConst Piece
Queen  Int
target (Board
validSlidersBoard -> Board -> Board
&Board
queenAttackers)
      [Move]
allKingCaptures

    where
    pawnAttackers :: Board
pawnAttackers   = Board
pawns Board -> Board -> Board
& Color -> Board -> Board
pawnAttacks (Color -> Color
reverseColor Color
color) Board
targetBoard
    knightAttackers :: Board
knightAttackers = Board
knights Board -> Board -> Board
& Int -> Board
knightAttacks Int
target
    bishopAttackers :: Board
bishopAttackers = Board
bishops Board -> Board -> Board
& Board
bishopRays
    rookAttackers :: Board
rookAttackers   = Board
rooks Board -> Board -> Board
& Board
rookRays
    queenAttackers :: Board
queenAttackers  = Board
queens Board -> Board -> Board
& (Board
bishopRays Board -> Board -> Board
.| Board
rookRays)
    bishopRays :: Board
bishopRays      = Board -> Int -> Board
bishopAttacks Board
allPieces Int
target
    rookRays :: Board
rookRays        = Board -> Int -> Board
rookAttacks Board
allPieces Int
target
    targetBoard :: Board
targetBoard     = Int -> Board
toBoard Int
target
    unpinned :: Board
unpinned        = Board
player Board -> Board -> Board
.\ Board
pinnedPieces

    validSliders :: Board
validSliders
      | Board
pinnedPieces Board -> Board -> Board
.\ Board
knights Board -> Board -> Bool
forall a. Eq a => a -> a -> Bool
== Board
0 = Board
player
      | Bool
otherwise = Board
unpinned Board -> Board -> Board
.| Board
pinnedPieces Board -> Board -> Board
& Int -> Int -> Board
getPinningRay Int
target Int
king


getPinningRay :: Square -> Square -> Board
getPinningRay :: Int -> Int -> Board
getPinningRay !Int
target !Int
king
    | Board -> Int -> Bool
testSquare Board
kingDiag Int
target     = Board
kingDiag
    | Board -> Int -> Bool
testSquare Board
kingAntiDiag Int
target = Board
kingAntiDiag
    | Board -> Int -> Bool
testSquare Board
kingFile Int
target     = Board
kingFile
    | Board -> Int -> Bool
testSquare Board
kingRank Int
target     = Board
kingRank
    | Bool
otherwise                      = Board
0
  where
  kingDiag :: Board
kingDiag        = Vector Board
antiDiagMovesVec Vector Board -> Int -> Board
forall a. Storable a => Vector a -> Int -> a
!! Int
king
  kingAntiDiag :: Board
kingAntiDiag    = Vector Board
diagMovesVec     Vector Board -> Int -> Board
forall a. Storable a => Vector a -> Int -> a
!! Int
king
  kingFile :: Board
kingFile        = Vector Board
rankMovesVec     Vector Board -> Int -> Board
forall a. Storable a => Vector a -> Int -> a
!! Int
king
  kingRank :: Board
kingRank        = Vector Board
fileMovesVec     Vector Board -> Int -> Board
forall a. Storable a => Vector a -> Int -> a
!! Int
king


pawnCapturesAndPromotions :: Board -> Board -> Board -> Color -> Square -> Board
pawnCapturesAndPromotions :: Board -> Board -> Board -> Color -> Int -> Board
pawnCapturesAndPromotions Board
enemy Board
noPieces Board
enPassant Color
color Int
n =
  Board -> Color -> Board -> Board
pawnPromotions Board
noPieces Color
color Board
board
  Board -> Board -> Board
.| Board -> Board -> Color -> Board -> Board
pawnCaptures Board
enemy Board
enPassant Color
color Board
board
  where
    board :: Board
board = Int -> Board
toBoard Int
n


pawnPromotions :: Board -> Color -> Board -> Board
pawnPromotions :: Board -> Color -> Board -> Board
pawnPromotions Board
noPieces Color
color Board
board =
  Board
promotions Board -> Board -> Board
& Board
noPieces
  where
    promotions :: Board
promotions = case Color
color of
      Color
White -> (Board
board Board -> Board -> Board
& Board
rank_7) Board -> Int -> Board
forall a. Bits a => a -> Int -> a
<< Int
8
      Color
Black -> (Board
board Board -> Board -> Board
& Board
rank_2) Board -> Int -> Board
forall a. Bits a => a -> Int -> a
>> Int
8


pawnCaptures :: Board -> Board -> Color -> Board -> Board
pawnCaptures :: Board -> Board -> Color -> Board -> Board
pawnCaptures Board
enemy Board
enPassant Color
color Board
board =
  Color -> Board -> Board
pawnAttacks Color
color Board
board Board -> Board -> Board
& (Board
enemy Board -> Board -> Board
.| Board
enPassant)


diagPawnCaptures :: Board -> Color -> Square -> Board
diagPawnCaptures :: Board -> Color -> Int -> Board
diagPawnCaptures Board
enemy Color
color Int
n =
  Color -> Board -> Board
pawnDiagAttacks Color
color Board
board Board -> Board -> Board
& Board
enemy
  where
    board :: Board
board = Int -> Board
toBoard Int
n


antiDiagPawnCaptures :: Board -> Color -> Square -> Board
antiDiagPawnCaptures :: Board -> Color -> Int -> Board
antiDiagPawnCaptures Board
enemy Color
color Int
n =
  Color -> Board -> Board
pawnAntiDiagAttacks Color
color Board
board Board -> Board -> Board
& Board
enemy
  where
    board :: Board
board = Int -> Board
toBoard Int
n


knightCaptures :: Board -> Square -> Board
knightCaptures :: Board -> Int -> Board
knightCaptures Board
enemy Int
n =
  Int -> Board
knightAttacks Int
n Board -> Board -> Board
& Board
enemy


kingCaptures :: Board -> Board -> Square -> Board
kingCaptures :: Board -> Board -> Int -> Board
kingCaptures Board
enemy Board
attacked Int
n =
  (Int -> Board
kingAttacks Int
n Board -> Board -> Board
& Board
enemy) Board -> Board -> Board
.\ Board
attacked


bishopCaptures :: Board -> Board -> Board -> Board -> Square -> Board
bishopCaptures :: Board -> Board -> Board -> Board -> Int -> Board
bishopCaptures Board
enemy Board
allPieces Board
pinnedPieces Board
king Int
n =
  Board -> Board -> Board -> Int -> Board
bishopMoves Board
allPieces Board
pinnedPieces Board
king Int
n Board -> Board -> Board
& Board
enemy


rookCaptures :: Board -> Board -> Board -> Board -> Square -> Board
rookCaptures :: Board -> Board -> Board -> Board -> Int -> Board
rookCaptures Board
enemy Board
allPieces Board
pinnedPieces Board
king Int
n =
  Board -> Board -> Board -> Int -> Board
rookMoves Board
allPieces Board
pinnedPieces Board
king Int
n Board -> Board -> Board
& Board
enemy


queenCaptures :: Board -> Board -> Board -> Board -> Square -> Board
queenCaptures :: Board -> Board -> Board -> Board -> Int -> Board
queenCaptures Board
enemy Board
allPieces Board
pinnedPieces Board
king Int
n =
  Board -> Board -> Board -> Int -> Board
queenMoves Board
allPieces Board
pinnedPieces Board
king Int
n Board -> Board -> Board
& Board
enemy