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
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