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