module MoveGen.PieceAttacks (getLeapingCheckers, getSliderCheckers, getEnemyKingSliderRays, getBishopCheckerRays, getRookCheckerRays, getKingBishopRay, getPinnedPieces, getEnPassantPinnedPawns, getKingQueenRay, getKingRookRay, allAttacks, knightAttacks, bishopAttacks, rookAttacks, queenAttacks, kingAttacks, pawnAttacks, pawnDiagAttacks, pawnAntiDiagAttacks, bishopMoves, rookMoves, queenMoves) where

import           AppPrelude

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


getLeapingCheckers :: Position -> Board
getLeapingCheckers :: Position -> Board
getLeapingCheckers 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
player Board -> Board -> Board
& Board
checkers
  where
    checkers :: Board
checkers = Board
pawns   Board -> Board -> Board
& Color -> Board -> Board
pawnAttacks   (Color -> Color
reverseColor Color
color) (Board
enemyBoard -> Board -> Board
&Board
kings)
            Board -> Board -> Board
.| Board
knights Board -> Board -> Board
& Square -> Board
knightAttacks (Board -> Square
lsb (Board
enemyBoard -> Board -> Board
&Board
kings))


getSliderCheckers :: Board -> Board -> Position -> Board
getSliderCheckers :: Board -> Board -> Position -> Board
getSliderCheckers Board
bishopCheckerRays Board
rookCheckerRays 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
player Board -> Board -> Board
& Board
checkers
  where
    checkers :: Board
checkers = Board
bishopCheckerRays Board -> Board -> Board
& Board
bishops
            Board -> Board -> Board
.| Board
rookCheckerRays   Board -> Board -> Board
& Board
rooks
            Board -> Board -> Board
.| (Board
bishopCheckerRays Board -> Board -> Board
.| Board
rookCheckerRays) Board -> Board -> Board
& Board
queens


getEnemyKingSliderRays :: Position -> Board
getEnemyKingSliderRays :: Position -> Board
getEnemyKingSliderRays 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 -> Square -> Board
queenAttacks Board
player (Board -> Square
lsb (Board
enemyBoard -> Board -> Board
&Board
kings))


getBishopCheckerRays :: Position -> Board
getBishopCheckerRays :: Position -> Board
getBishopCheckerRays 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 -> Square -> Board
bishopAttacks (Board
enemy Board -> Board -> Board
.| Board
player) (Board -> Square
lsb (Board
enemyBoard -> Board -> Board
&Board
kings))


getRookCheckerRays :: Position -> Board
getRookCheckerRays :: Position -> Board
getRookCheckerRays 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 -> Square -> Board
rookAttacks (Board
enemy Board -> Board -> Board
.| Board
player) (Board -> Square
lsb (Board
enemyBoard -> Board -> Board
&Board
kings))


getPinnedPieces :: Board -> Board -> Board -> Position -> Board
getPinnedPieces :: Board -> Board -> Board -> Position -> Board
getPinnedPieces !Board
bishopCheckerRays !Board
rookCheckerRays !Board
sliderRays 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
enemy Board -> Board -> Board
&
  ((Square -> Board) -> Board -> Board
foldBoardAttacks Square -> Board
bishopPins (Board
attackers Board -> Board -> Board
& Board
bishops)
  Board -> Board -> Board
.| (Square -> Board) -> Board -> Board
foldBoardAttacks Square -> Board
rookPins (Board
attackers Board -> Board -> Board
& Board
rooks)
  Board -> Board -> Board
.| (Square -> Board) -> Board -> Board
foldBoardAttacks Square -> Board
queenPins (Board
attackers Board -> Board -> Board
& Board
queens))
  where
    bishopPins :: Square -> Board
bishopPins Square
n = Board -> Square -> Board
getKingBishopRay Board
king Square
n
      Board -> Board -> Board
& Board
bishopCheckerRays
      Board -> Board -> Board
& Board -> Square -> Board
bishopAttacks Board
allPieces Square
n
    rookPins :: Square -> Board
rookPins Square
n = Board -> Square -> Board
getKingRookRay Board
king Square
n
      Board -> Board -> Board
& Board
rookCheckerRays
      Board -> Board -> Board
& Board -> Square -> Board
rookAttacks Board
allPieces Square
n
    queenPins :: Square -> Board
queenPins Square
n = Board -> Square -> Board
getKingQueenRay Board
king Square
n
      Board -> Board -> Board
& (Board
bishopCheckerRays Board -> Board -> Board
.| Board
rookCheckerRays)
      Board -> Board -> Board
& Board -> Square -> Board
queenAttacks Board
allPieces Square
n
    attackers :: Board
attackers = Board
sliderRays Board -> Board -> Board
& Board
player
    !king :: Board
king     = Board
enemy Board -> Board -> Board
& Board
kings
    allPieces :: Board
allPieces = Board
player Board -> Board -> Board
.| Board
enemy


getEnPassantPinnedPawns :: Position -> Board
getEnPassantPinnedPawns :: Position -> Board
getEnPassantPinnedPawns 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
enPassant Board -> Board -> Bool
forall a. Eq a => a -> a -> Bool
== Board
0 Bool -> Bool -> Bool
|| Board
enPassantRank Board -> Board -> Board
& Board
kingRank Board -> Board -> Bool
forall a. Eq a => a -> a -> Bool
== Board
0 = Board
0
  | Bool
otherwise =
    Board
enemy Board -> Board -> Board
& Board
pawns Board -> Board -> Board
& Board -> Board -> Board -> Position -> Board
getPinnedPieces Board
0 Board
rookCheckerRays Board
sliderRays Position
pos'
    where
      rookCheckerRays :: Board
rookCheckerRays = Position -> Board
getRookCheckerRays Position
pos' Board -> Board -> Board
& Board
kingRank
      sliderRays :: Board
sliderRays      = Position -> Board
getEnemyKingSliderRays Position
pos' Board -> Board -> Board
& Board
enPassantRank
      pos' :: Position
pos' = Position
pos {
        pawns  = pawns  ^ enPassantPawn,
        player = player ^ enPassantPawn
      }
      enPassantPawn :: Board
enPassantPawn   = case Color
color of
        Color
White -> Board
enPassant Board -> Square -> Board
forall a. Bits a => a -> Square -> a
<< Square
8
        Color
Black -> Board
enPassant Board -> Square -> Board
forall a. Bits a => a -> Square -> a
>> Square
8
      enPassantSquare :: Square
enPassantSquare = Board -> Square
lsb Board
enPassantPawn
      kingRank :: Board
kingRank        = Vector Board
fileMovesVec Vector Board -> Square -> Board
forall a. Storable a => Vector a -> Square -> a
!! Board -> Square
lsb (Board
kings Board -> Board -> Board
& Board
enemy)
      enPassantRank :: Board
enPassantRank   = Vector Board
fileMovesVec Vector Board -> Square -> Board
forall a. Storable a => Vector a -> Square -> a
!! Square
enPassantSquare


getKingQueenRay :: Board -> Square -> Board
getKingQueenRay :: Board -> Square -> Board
getKingQueenRay !Board
king !Square
n
  | Board
file Board -> Board -> Board
& Board
king Board -> Board -> Bool
forall a. Eq a => a -> a -> Bool
/= Board
0     = Board
file
  | Board
rank Board -> Board -> Board
& Board
king Board -> Board -> Bool
forall a. Eq a => a -> a -> Bool
/= Board
0     = Board
rank
  | Board
diag Board -> Board -> Board
& Board
king Board -> Board -> Bool
forall a. Eq a => a -> a -> Bool
/= Board
0     = Board
diag
  | Board
antiDiag Board -> Board -> Board
& Board
king Board -> Board -> Bool
forall a. Eq a => a -> a -> Bool
/= Board
0 = Board
antiDiag
  | Bool
otherwise           = Board
0
  where
    file :: Board
file     = Vector Board
rankMovesVec     Vector Board -> Square -> Board
forall a. Storable a => Vector a -> Square -> a
!! Square
n
    rank :: Board
rank     = Vector Board
fileMovesVec     Vector Board -> Square -> Board
forall a. Storable a => Vector a -> Square -> a
!! Square
n
    diag :: Board
diag     = Vector Board
antiDiagMovesVec Vector Board -> Square -> Board
forall a. Storable a => Vector a -> Square -> a
!! Square
n
    antiDiag :: Board
antiDiag = Vector Board
diagMovesVec     Vector Board -> Square -> Board
forall a. Storable a => Vector a -> Square -> a
!! Square
n


getKingBishopRay :: Board -> Square -> Board
getKingBishopRay :: Board -> Square -> Board
getKingBishopRay !Board
king !Square
n
  | Board
diag Board -> Board -> Board
& Board
king Board -> Board -> Bool
forall a. Eq a => a -> a -> Bool
/= Board
0     = Board
diag
  | Board
antiDiag Board -> Board -> Board
& Board
king Board -> Board -> Bool
forall a. Eq a => a -> a -> Bool
/= Board
0 = Board
antiDiag
  | Bool
otherwise           = Board
0
  where
    diag :: Board
diag     = Vector Board
antiDiagMovesVec Vector Board -> Square -> Board
forall a. Storable a => Vector a -> Square -> a
!! Square
n
    antiDiag :: Board
antiDiag = Vector Board
diagMovesVec     Vector Board -> Square -> Board
forall a. Storable a => Vector a -> Square -> a
!! Square
n


getKingRookRay :: Board -> Square -> Board
getKingRookRay :: Board -> Square -> Board
getKingRookRay !Board
king !Square
n
  | Board
file Board -> Board -> Board
& Board
king Board -> Board -> Bool
forall a. Eq a => a -> a -> Bool
/= Board
0 = Board
file
  | Board
rank Board -> Board -> Board
& Board
king Board -> Board -> Bool
forall a. Eq a => a -> a -> Bool
/= Board
0 = Board
rank
  | Bool
otherwise       = Board
0
  where
    file :: Board
file = Vector Board
rankMovesVec Vector Board -> Square -> Board
forall a. Storable a => Vector a -> Square -> a
!! Square
n
    rank :: Board
rank = Vector Board
fileMovesVec Vector Board -> Square -> Board
forall a. Storable a => Vector a -> Square -> a
!! Square
n


allAttacks :: Position -> Board
allAttacks :: Position -> Board
allAttacks 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
..} =
     Color -> Board -> Board
pawnAttacks  Color
color                         (Board
playerBoard -> Board -> Board
&Board
pawns)
  Board -> Board -> Board
.| (Square -> Board) -> Board -> Board
foldBoardAttacks Square -> Board
knightAttacks             (Board
playerBoard -> Board -> Board
&Board
knights)
  Board -> Board -> Board
.| (Square -> Board) -> Board -> Board
foldBoardAttacks (Board -> Square -> Board
bishopAttacks Board
allPieces) (Board
playerBoard -> Board -> Board
&Board
bishops)
  Board -> Board -> Board
.| (Square -> Board) -> Board -> Board
foldBoardAttacks (Board -> Square -> Board
rookAttacks Board
allPieces)   (Board
playerBoard -> Board -> Board
&Board
rooks)
  Board -> Board -> Board
.| (Square -> Board) -> Board -> Board
foldBoardAttacks (Board -> Square -> Board
queenAttacks Board
allPieces)  (Board
playerBoard -> Board -> Board
&Board
queens)
  Board -> Board -> Board
.| Square -> Board
kingAttacks                           (Board -> Square
lsb (Board
playerBoard -> Board -> Board
&Board
kings))
  where
    !allPieces :: Board
allPieces = Board
player Board -> Board -> Board
.| (Board
enemy Board -> Board -> Board
.\ Board
kings)


pawnAttacks :: Color -> Board -> Board
pawnAttacks :: Color -> Board -> Board
pawnAttacks Color
color Board
board = case Color
color of
  Color
White -> (Board
board Board -> Board -> Board
.\ Board
file_A) Board -> Square -> Board
forall a. Bits a => a -> Square -> a
<< Square
7 Board -> Board -> Board
.| (Board
board Board -> Board -> Board
.\ Board
file_H) Board -> Square -> Board
forall a. Bits a => a -> Square -> a
<< Square
9
  Color
Black -> (Board
board Board -> Board -> Board
.\ Board
file_A) Board -> Square -> Board
forall a. Bits a => a -> Square -> a
>> Square
9 Board -> Board -> Board
.| (Board
board Board -> Board -> Board
.\ Board
file_H) Board -> Square -> Board
forall a. Bits a => a -> Square -> a
>> Square
7


pawnDiagAttacks :: Color -> Board -> Board
pawnDiagAttacks :: Color -> Board -> Board
pawnDiagAttacks Color
color Board
board = case Color
color of
  Color
White -> (Board
board Board -> Board -> Board
.\ Board
file_H) Board -> Square -> Board
forall a. Bits a => a -> Square -> a
<< Square
9
  Color
Black -> (Board
board Board -> Board -> Board
.\ Board
file_A) Board -> Square -> Board
forall a. Bits a => a -> Square -> a
>> Square
9


pawnAntiDiagAttacks :: Color -> Board -> Board
pawnAntiDiagAttacks :: Color -> Board -> Board
pawnAntiDiagAttacks Color
color Board
board = case Color
color of
  Color
White -> (Board
board Board -> Board -> Board
.\ Board
file_A) Board -> Square -> Board
forall a. Bits a => a -> Square -> a
<< Square
7
  Color
Black -> (Board
board Board -> Board -> Board
.\ Board
file_H) Board -> Square -> Board
forall a. Bits a => a -> Square -> a
>> Square
7


knightAttacks :: Square -> Board
knightAttacks :: Square -> Board
knightAttacks !Square
n = Vector Board
knightMovesVec Vector Board -> Square -> Board
forall a. Storable a => Vector a -> Square -> a
!! Square
n


kingAttacks :: Square -> Board
kingAttacks :: Square -> Board
kingAttacks !Square
n = Vector Board
kingMovesVec Vector Board -> Square -> Board
forall a. Storable a => Vector a -> Square -> a
!! Square
n


bishopMoves :: Board -> Board -> Board -> Square -> Board
bishopMoves :: Board -> Board -> Board -> Square -> Board
bishopMoves Board
allPieces Board
pinnedPieces Board
king Square
n
  | Board -> Square -> Bool
testSquare Board
pinnedPieces Square
n = Board
attacks Board -> Board -> Board
& Board -> Square -> Board
getKingBishopRay Board
king Square
n
  | Bool
otherwise                 = Board
attacks
  where
    !attacks :: Board
attacks = Board -> Square -> Board
bishopAttacks Board
allPieces Square
n

rookMoves :: Board -> Board -> Board -> Square -> Board
rookMoves :: Board -> Board -> Board -> Square -> Board
rookMoves Board
allPieces Board
pinnedPieces Board
king Square
n
  | Board -> Square -> Bool
testSquare Board
pinnedPieces Square
n = Board
attacks Board -> Board -> Board
& Board -> Square -> Board
getKingRookRay Board
king Square
n
  | Bool
otherwise                 = Board
attacks
  where
    !attacks :: Board
attacks = Board -> Square -> Board
rookAttacks Board
allPieces Square
n

queenMoves :: Board -> Board -> Board -> Square -> Board
queenMoves :: Board -> Board -> Board -> Square -> Board
queenMoves Board
allPieces Board
pinnedPieces Board
king Square
n
  | Board -> Square -> Bool
testSquare Board
pinnedPieces Square
n = Board
attacks Board -> Board -> Board
& Board -> Square -> Board
getKingQueenRay Board
king Square
n
  | Bool
otherwise                 = Board
attacks
  where
    !attacks :: Board
attacks = Board -> Square -> Board
queenAttacks Board
allPieces Square
n

bishopAttacks :: Board -> Square -> Board
bishopAttacks :: Board -> Square -> Board
bishopAttacks !Board
allPieces !Square
n =
     (Board -> Square) -> Vector Board -> Board -> Square -> Board
sliding Board -> Square
lsb Vector Board
northEastMovesVec Board
allPieces Square
n
  Board -> Board -> Board
.| (Board -> Square) -> Vector Board -> Board -> Square -> Board
sliding Board -> Square
lsb Vector Board
northWestMovesVec Board
allPieces Square
n
  Board -> Board -> Board
.| (Board -> Square) -> Vector Board -> Board -> Square -> Board
sliding Board -> Square
msb Vector Board
southWestMovesVec Board
allPieces Square
n
  Board -> Board -> Board
.| (Board -> Square) -> Vector Board -> Board -> Square -> Board
sliding Board -> Square
msb Vector Board
southEastMovesVec Board
allPieces Square
n


rookAttacks :: Board -> Square -> Board
rookAttacks :: Board -> Square -> Board
rookAttacks !Board
allPieces !Square
n =
     (Board -> Square) -> Vector Board -> Board -> Square -> Board
sliding Board -> Square
lsb Vector Board
northMovesVec Board
allPieces Square
n
  Board -> Board -> Board
.| (Board -> Square) -> Vector Board -> Board -> Square -> Board
sliding Board -> Square
lsb Vector Board
eastMovesVec Board
allPieces Square
n
  Board -> Board -> Board
.| (Board -> Square) -> Vector Board -> Board -> Square -> Board
sliding Board -> Square
msb Vector Board
westMovesVec Board
allPieces Square
n
  Board -> Board -> Board
.| (Board -> Square) -> Vector Board -> Board -> Square -> Board
sliding Board -> Square
msb Vector Board
southMovesVec Board
allPieces Square
n


queenAttacks :: Board -> Square -> Board
queenAttacks :: Board -> Square -> Board
queenAttacks !Board
allPieces !Square
n =
     Board -> Square -> Board
rookAttacks Board
allPieces Square
n
  Board -> Board -> Board
.| Board -> Square -> Board
bishopAttacks Board
allPieces Square
n


sliding :: (Board -> Square) -> Vector Board -> Board -> Square -> Board
sliding :: (Board -> Square) -> Vector Board -> Board -> Square -> Board
sliding !Board -> Square
findBlocker !Vector Board
mask !Board
allPieces !Square
n =
   Board
ray Board -> Board -> Board
^ Board
blockerRay
  where
    !firstBlocker :: Square
firstBlocker = Board -> Square
findBlocker Board
blockers
    !blockers :: Board
blockers     = Board
ray Board -> Board -> Board
& Board
allPieces
    !blockerRay :: Board
blockerRay   = Vector Board
mask Vector Board -> Square -> Board
forall a. Storable a => Vector a -> Square -> a
!! Square
firstBlocker
    !ray :: Board
ray          = Vector Board
mask Vector Board -> Square -> Board
forall a. Storable a => Vector a -> Square -> a
!! Square
n