module Utils.Board (Board, Square, (>>), (<<), (&), (.\), (.|), (^), (~), popCount, popCountToBoard, lsb, msb, toBoard, toCondition, getSquareDistance, toReverseCondition, testSquare, toFile, toRank, knightMovesVec, kingMovesVec, fileMovesVec, rankMovesVec, diagMovesVec, antiDiagMovesVec, northEastMovesVec, northWestMovesVec, southEastMovesVec, southWestMovesVec, northMovesVec, westMovesVec, southMovesVec, eastMovesVec, shortCastleSlidingFiles, longCastleSlidingFiles, shortCastleFiles, longCastleFiles, whiteKnightOutpostRanks, blackKnightOutpostRanks, knightOupostFiles, castlingRngVec, enPassantRngVec, sideToMoveRng, pieceRngVec, whiteKnightOutpostAttackersVec, blackKnightOutpostAttackersVec, whitePassedPawnBlockersVec, blackPassedPawnBlockersVec, squares, rank_1, rank_2, rank_3, rank_4, rank_5, rank_6, rank_7, rank_8, file_A, file_B, file_C, file_D, file_E, file_F, file_G, file_H) where
import AppPrelude hiding (foldl', map)
import qualified Data.Bits as Bits
import Data.Vector.Storable (foldl', foldl1, foldl1', map, slice)
import System.IO.Unsafe (unsafePerformIO)
import System.Random
type Board = Word64
type Square = Int
type SideSquare = Int
type Diagonal = Int
type Rank = Int
type File = Int
type Diag = Int
{-# SPECIALIZE (<<) :: Board -> Square -> Board #-}
infixl 9 <<
(<<) :: Bits.Bits a => a -> Square -> a
<< :: forall a. Bits a => a -> Diagonal -> a
(<<) !a
x !Diagonal
y = a -> Diagonal -> a
forall a. Bits a => a -> Diagonal -> a
Bits.unsafeShiftL a
x Diagonal
y
{-# SPECIALIZE (>>) :: Board -> Square -> Board #-}
infixl 9 >>
(>>) :: Bits.Bits a => a -> Square -> a
>> :: forall a. Bits a => a -> Diagonal -> a
(>>) !a
x !Diagonal
y = a -> Diagonal -> a
forall a. Bits a => a -> Diagonal -> a
Bits.unsafeShiftR a
x Diagonal
y
infixl 8 &
(&) :: Board -> Board -> Board
& :: Board -> Board -> Board
(&) !Board
x !Board
y = Board -> Board -> Board
forall a. Bits a => a -> a -> a
(Bits..&.) Board
x Board
y
infixl 7 .\
(.\) :: Board -> Board -> Board
.\ :: Board -> Board -> Board
(.\) !Board
x !Board
y = Board
x Board -> Board -> Board
& Board -> Board
(~) Board
y
infixl 7 .|
(.|) :: Board -> Board -> Board
.| :: Board -> Board -> Board
(.|) !Board
x !Board
y = Board -> Board -> Board
forall a. Bits a => a -> a -> a
(Bits..|.) Board
x Board
y
infixl 7 ^
(^) :: Board -> Board -> Board
^ :: Board -> Board -> Board
(^) !Board
x !Board
y = Board -> Board -> Board
forall a. Bits a => a -> a -> a
Bits.xor Board
x Board
y
infixl 9 ~
(~) :: Board -> Board
~ :: Board -> Board
(~) !Board
x = Board -> Board
forall a. Bits a => a -> a
Bits.complement Board
x
popCount :: Board -> Int
popCount :: Board -> Diagonal
popCount !Board
x = Board -> Diagonal
forall a. Bits a => a -> Diagonal
Bits.popCount Board
x
popCountToBoard :: Board -> Board
popCountToBoard :: Board -> Board
popCountToBoard !Board
x = Diagonal -> Board
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Diagonal -> Board) -> Diagonal -> Board
forall a b. (a -> b) -> a -> b
$! Board -> Diagonal
popCount Board
x
lsb :: Board -> Square
lsb :: Board -> Diagonal
lsb !Board
x = Board -> Diagonal
forall b. FiniteBits b => b -> Diagonal
Bits.countTrailingZeros Board
x
msb :: Board -> Square
msb :: Board -> Diagonal
msb !Board
x = Diagonal
65 Diagonal -> Diagonal -> Diagonal
forall a. Num a => a -> a -> a
* (Diagonal
zeros Diagonal -> Diagonal -> Diagonal
forall a. Integral a => a -> a -> a
/ Diagonal
64) Diagonal -> Diagonal -> Diagonal
forall a. Num a => a -> a -> a
+ Diagonal
63 Diagonal -> Diagonal -> Diagonal
forall a. Num a => a -> a -> a
- Diagonal
zeros
where
!zeros :: Diagonal
zeros = Board -> Diagonal
forall b. FiniteBits b => b -> Diagonal
Bits.countLeadingZeros Board
x
{-# SPECIALIZE toReverseCondition :: Board -> Board #-}
{-# SPECIALIZE toReverseCondition :: Square -> Square #-}
toReverseCondition :: (Num a, Ord a) => a -> a
toReverseCondition :: forall a. (Num a, Ord a) => a -> a
toReverseCondition !a
x = a
1 a -> a -> a
forall a. Num a => a -> a -> a
- a -> a
forall a. (Ord a, Num a) => a -> a
toCondition a
x
{-# SPECIALIZE toCondition :: Board -> Board #-}
{-# SPECIALIZE toCondition :: Square -> Square #-}
toCondition :: (Ord a, Num a) => a -> a
toCondition :: forall a. (Ord a, Num a) => a -> a
toCondition !a
x = a -> a -> a
forall a. Ord a => a -> a -> a
min a
1 a
x
toBoard :: Square -> Board
toBoard :: Diagonal -> Board
toBoard !Diagonal
n = Diagonal -> Board
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Diagonal
1 Diagonal -> Diagonal -> Diagonal
forall a. Num a => a -> a -> a
- Diagonal
n Diagonal -> Diagonal -> Diagonal
forall a. Integral a => a -> a -> a
/ Diagonal
64) Board -> Board -> Board
forall a. Num a => a -> a -> a
* (Board
1 Board -> Diagonal -> Board
forall a. Bits a => a -> Diagonal -> a
<< Diagonal
n)
testSquare :: Board -> Square -> Bool
testSquare :: Board -> Diagonal -> Bool
testSquare !Board
x !Diagonal
n = Board
x Board -> Board -> Board
& Diagonal -> Board
toBoard Diagonal
n Board -> Board -> Bool
forall a. Eq a => a -> a -> Bool
/= Board
0
toFile :: Square -> File
toFile :: Diagonal -> Diagonal
toFile !Diagonal
n = Diagonal
n Diagonal -> Diagonal -> Diagonal
forall a. Integral a => a -> a -> a
% Diagonal
8
toRank :: Square -> Rank
toRank :: Diagonal -> Diagonal
toRank !Diagonal
n = Diagonal
n Diagonal -> Diagonal -> Diagonal
forall a. Integral a => a -> a -> a
/ Diagonal
8
knightMove :: Square -> Board
knightMove :: Diagonal -> Board
knightMove Diagonal
n =
Board
move1 Board -> Board -> Board
.| Board
move2 Board -> Board -> Board
.| Board
move3 Board -> Board -> Board
.| Board
move4 Board -> Board -> Board
.| Board
move5
Board -> Board -> Board
.| Board
move6 Board -> Board -> Board
.| Board
move7 Board -> Board -> Board
.| Board
move8
where
move1 :: Board
move1 = (Board
board Board -> Board -> Board
.\ (Board
file_H Board -> Board -> Board
.| Board
file_G Board -> Board -> Board
.| Board
rank_8)) Board -> Diagonal -> Board
forall a. Bits a => a -> Diagonal -> a
<< Diagonal
10
move3 :: Board
move3 = (Board
board Board -> Board -> Board
.\ (Board
file_H Board -> Board -> Board
.| Board
rank_7 Board -> Board -> Board
.| Board
rank_8)) Board -> Diagonal -> Board
forall a. Bits a => a -> Diagonal -> a
<< Diagonal
17
move4 :: Board
move4 = (Board
board Board -> Board -> Board
.\ (Board
file_A Board -> Board -> Board
.| Board
rank_7 Board -> Board -> Board
.| Board
rank_8)) Board -> Diagonal -> Board
forall a. Bits a => a -> Diagonal -> a
<< Diagonal
15
move5 :: Board
move5 = (Board
board Board -> Board -> Board
.\ (Board
file_A Board -> Board -> Board
.| Board
file_B Board -> Board -> Board
.| Board
rank_8)) Board -> Diagonal -> Board
forall a. Bits a => a -> Diagonal -> a
<< Diagonal
6
move6 :: Board
move6 = (Board
board Board -> Board -> Board
.\ (Board
file_A Board -> Board -> Board
.| Board
file_B Board -> Board -> Board
.| Board
rank_1)) Board -> Diagonal -> Board
forall a. Bits a => a -> Diagonal -> a
>> Diagonal
10
move7 :: Board
move7 = (Board
board Board -> Board -> Board
.\ (Board
file_A Board -> Board -> Board
.| Board
rank_2 Board -> Board -> Board
.| Board
rank_1)) Board -> Diagonal -> Board
forall a. Bits a => a -> Diagonal -> a
>> Diagonal
17
move8 :: Board
move8 = (Board
board Board -> Board -> Board
.\ (Board
file_H Board -> Board -> Board
.| Board
rank_2 Board -> Board -> Board
.| Board
rank_1)) Board -> Diagonal -> Board
forall a. Bits a => a -> Diagonal -> a
>> Diagonal
15
move2 :: Board
move2 = (Board
board Board -> Board -> Board
.\ (Board
file_H Board -> Board -> Board
.| Board
file_G Board -> Board -> Board
.| Board
rank_1)) Board -> Diagonal -> Board
forall a. Bits a => a -> Diagonal -> a
>> Diagonal
6
board :: Board
board = Diagonal -> Board
toBoard Diagonal
n
kingMove :: Square -> Board
kingMove :: Diagonal -> Board
kingMove Diagonal
n =
Board
move1 Board -> Board -> Board
.| Board
move2 Board -> Board -> Board
.| Board
move3 Board -> Board -> Board
.| Board
move4 Board -> Board -> Board
.| Board
move5
Board -> Board -> Board
.| Board
move6 Board -> Board -> Board
.| Board
move7 Board -> Board -> Board
.| Board
move8
where
move1 :: Board
move1 = (Board
board Board -> Board -> Board
.\ Board
file_H) Board -> Diagonal -> Board
forall a. Bits a => a -> Diagonal -> a
<< Diagonal
1
move2 :: Board
move2 = (Board
board Board -> Board -> Board
.\ (Board
file_H Board -> Board -> Board
.| Board
rank_8)) Board -> Diagonal -> Board
forall a. Bits a => a -> Diagonal -> a
<< Diagonal
9
move3 :: Board
move3 = (Board
board Board -> Board -> Board
.\ Board
file_A) Board -> Diagonal -> Board
forall a. Bits a => a -> Diagonal -> a
>> Diagonal
1
move4 :: Board
move4 = (Board
board Board -> Board -> Board
.\ (Board
file_A Board -> Board -> Board
.| Board
rank_1)) Board -> Diagonal -> Board
forall a. Bits a => a -> Diagonal -> a
>> Diagonal
9
move5 :: Board
move5 = (Board
board Board -> Board -> Board
.\ Board
rank_8) Board -> Diagonal -> Board
forall a. Bits a => a -> Diagonal -> a
<< Diagonal
8
move6 :: Board
move6 = (Board
board Board -> Board -> Board
.\ (Board
file_A Board -> Board -> Board
.| Board
rank_8)) Board -> Diagonal -> Board
forall a. Bits a => a -> Diagonal -> a
<< Diagonal
7
move7 :: Board
move7 = (Board
board Board -> Board -> Board
.\ Board
rank_1) Board -> Diagonal -> Board
forall a. Bits a => a -> Diagonal -> a
>> Diagonal
8
move8 :: Board
move8 = (Board
board Board -> Board -> Board
.\ (Board
file_H Board -> Board -> Board
.| Board
rank_1)) Board -> Diagonal -> Board
forall a. Bits a => a -> Diagonal -> a
>> Diagonal
7
board :: Board
board = Diagonal -> Board
toBoard Diagonal
n
knightOutpostAttackers :: Bool -> Int -> Board
knightOutpostAttackers :: Bool -> Diagonal -> Board
knightOutpostAttackers Bool
above Diagonal
n = Board
filesBoard Board -> Board -> Board
& Board
ranksBoard
where
filesBoard :: Board
filesBoard = Diagonal -> Board
getPreviousFile Diagonal
file Board -> Board -> Board
.| Diagonal -> Board
getNextFile Diagonal
file
ranksBoard :: Board
ranksBoard = (Board -> Board -> Board) -> Board -> Vector Board -> Board
forall b a. Storable b => (a -> b -> a) -> a -> Vector b -> a
foldl' Board -> Board -> Board
(.|) Board
0
(Vector Board -> Board) -> Vector Board -> Board
forall a b. (a -> b) -> a -> b
$ (Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map Diagonal -> Board
getRank
(Vector Diagonal -> Vector Board)
-> Vector Diagonal -> Vector Board
forall a b. (a -> b) -> a -> b
$ (Element (Vector Diagonal) -> Bool)
-> Vector Diagonal -> Vector Diagonal
forall seq. IsSequence seq => (Element seq -> Bool) -> seq -> seq
filter (Diagonal -> Diagonal -> Bool
compareFn Diagonal
rank) Vector Diagonal
sideSquares
rank :: Diagonal
rank = Diagonal -> Diagonal
toRank Diagonal
n
file :: Diagonal
file = Diagonal -> Diagonal
toFile Diagonal
n
compareFn :: Diagonal -> Diagonal -> Bool
compareFn | Bool
above = Diagonal -> Diagonal -> Bool
forall a. Ord a => a -> a -> Bool
(<)
| Bool
otherwise = Diagonal -> Diagonal -> Bool
forall a. Ord a => a -> a -> Bool
(>)
passedPawnBlockers :: Bool -> Int -> Board
passedPawnBlockers :: Bool -> Diagonal -> Board
passedPawnBlockers Bool
above Diagonal
n = Board
filesBoard Board -> Board -> Board
& Board
ranksBoard
where
filesBoard :: Board
filesBoard = Diagonal -> Board
getPreviousFile Diagonal
file Board -> Board -> Board
.| Diagonal -> Board
getFile Diagonal
file Board -> Board -> Board
.| Diagonal -> Board
getNextFile Diagonal
file
ranksBoard :: Board
ranksBoard = (Board -> Board -> Board) -> Board -> Vector Board -> Board
forall b a. Storable b => (a -> b -> a) -> a -> Vector b -> a
foldl' Board -> Board -> Board
(.|) Board
0
(Vector Board -> Board) -> Vector Board -> Board
forall a b. (a -> b) -> a -> b
$ (Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map Diagonal -> Board
getRank
(Vector Diagonal -> Vector Board)
-> Vector Diagonal -> Vector Board
forall a b. (a -> b) -> a -> b
$ (Element (Vector Diagonal) -> Bool)
-> Vector Diagonal -> Vector Diagonal
forall seq. IsSequence seq => (Element seq -> Bool) -> seq -> seq
filter (Diagonal -> Diagonal -> Bool
compareFn Diagonal
rank) Vector Diagonal
sideSquares
rank :: Diagonal
rank = Diagonal -> Diagonal
toRank Diagonal
n
file :: Diagonal
file = Diagonal -> Diagonal
toFile Diagonal
n
compareFn :: Diagonal -> Diagonal -> Bool
compareFn | Bool
above = Diagonal -> Diagonal -> Bool
forall a. Ord a => a -> a -> Bool
(<)
| Bool
otherwise = Diagonal -> Diagonal -> Bool
forall a. Ord a => a -> a -> Bool
(>)
squareDistance :: Square -> Square -> Int
squareDistance :: Diagonal -> Diagonal -> Diagonal
squareDistance Diagonal
n1 Diagonal
n2 = Diagonal -> Diagonal -> Diagonal
forall a. Ord a => a -> a -> a
max Diagonal
fileDistance Diagonal
rankDistance
where
fileDistance :: Diagonal
fileDistance = Diagonal -> Diagonal
forall a. Num a => a -> a
abs (Diagonal
file1 Diagonal -> Diagonal -> Diagonal
forall a. Num a => a -> a -> a
- Diagonal
file2)
rankDistance :: Diagonal
rankDistance = Diagonal -> Diagonal
forall a. Num a => a -> a
abs (Diagonal
rank1 Diagonal -> Diagonal -> Diagonal
forall a. Num a => a -> a -> a
- Diagonal
rank2)
file1 :: Diagonal
file1 = Diagonal -> Diagonal
toFile Diagonal
n1
file2 :: Diagonal
file2 = Diagonal -> Diagonal
toFile Diagonal
n2
rank1 :: Diagonal
rank1 = Diagonal -> Diagonal
toRank Diagonal
n1
rank2 :: Diagonal
rank2 = Diagonal -> Diagonal
toRank Diagonal
n2
fileMove :: Square -> Board
fileMove :: Diagonal -> Board
fileMove Diagonal
n = Vector Board
ranks Vector Board -> Diagonal -> Board
forall a. Storable a => Vector a -> Diagonal -> a
!! Diagonal -> Diagonal
toRank Diagonal
n
rankMove :: Square -> Board
rankMove :: Diagonal -> Board
rankMove Diagonal
n = Vector Board
files Vector Board -> Diagonal -> Board
forall a. Storable a => Vector a -> Diagonal -> a
!! Diagonal -> Diagonal
toFile Diagonal
n
diagMove :: Square -> Board
diagMove :: Diagonal -> Board
diagMove Diagonal
n = Vector Board
antiDiags Vector Board -> Diagonal -> Board
forall a. Storable a => Vector a -> Diagonal -> a
!! (Diagonal -> Diagonal
toFile Diagonal
n Diagonal -> Diagonal -> Diagonal
forall a. Num a => a -> a -> a
+ Diagonal -> Diagonal
toRank Diagonal
n)
antiDiagMove :: Square -> Board
antiDiagMove :: Diagonal -> Board
antiDiagMove Diagonal
n = Vector Board
diags Vector Board -> Diagonal -> Board
forall a. Storable a => Vector a -> Diagonal -> a
!! (Diagonal
7 Diagonal -> Diagonal -> Diagonal
forall a. Num a => a -> a -> a
- Diagonal -> Diagonal
toFile Diagonal
n Diagonal -> Diagonal -> Diagonal
forall a. Num a => a -> a -> a
+ Diagonal -> Diagonal
toRank Diagonal
n)
getRank :: Rank -> Board
getRank :: Diagonal -> Board
getRank Diagonal
n = (Board -> Board -> Board) -> Vector Board -> Board
forall a. Storable a => (a -> a -> a) -> Vector a -> a
foldl1' Board -> Board -> Board
(.|) ((Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map Diagonal -> Board
f Vector Diagonal
sideSquares)
where
f :: Diagonal -> Board
f = (Board
1 Board -> Diagonal -> Board
forall a. Bits a => a -> Diagonal -> a
<< (Diagonal
8 Diagonal -> Diagonal -> Diagonal
forall a. Num a => a -> a -> a
* Diagonal
n) <<)
getFile :: File -> Board
getFile :: Diagonal -> Board
getFile Diagonal
n = (Board -> Board -> Board) -> Vector Board -> Board
forall a. Storable a => (a -> a -> a) -> Vector a -> a
foldl1' Board -> Board -> Board
(.|) ((Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map Diagonal -> Board
f Vector Diagonal
sideSquares)
where
f :: Diagonal -> Board
f = (Board
1 Board -> Diagonal -> Board
forall a. Bits a => a -> Diagonal -> a
<< Diagonal
n <<) (Diagonal -> Board) -> (Diagonal -> Diagonal) -> Diagonal -> 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
. (Diagonal -> Diagonal -> Diagonal
forall a. Num a => a -> a -> a
* Diagonal
8)
getPreviousFile :: File -> Board
getPreviousFile :: Diagonal -> Board
getPreviousFile Diagonal
n
| Diagonal
n Diagonal -> Diagonal -> Bool
forall a. Eq a => a -> a -> Bool
== Diagonal
0 = Board
0
| Bool
otherwise = Diagonal -> Board
getFile (Diagonal
n Diagonal -> Diagonal -> Diagonal
forall a. Num a => a -> a -> a
- Diagonal
1)
getNextFile :: File -> Board
getNextFile :: Diagonal -> Board
getNextFile Diagonal
n
| Diagonal
n Diagonal -> Diagonal -> Bool
forall a. Eq a => a -> a -> Bool
== Diagonal
7 = Board
0
| Bool
otherwise = Diagonal -> Board
getFile (Diagonal
n Diagonal -> Diagonal -> Diagonal
forall a. Num a => a -> a -> a
+ Diagonal
1)
getSquareDistance :: Square -> Square -> Int
getSquareDistance :: Diagonal -> Diagonal -> Diagonal
getSquareDistance Diagonal
n1 Diagonal
n2 =
Vector Diagonal
squareDistanceVec Vector Diagonal -> Diagonal -> Diagonal
forall a. Storable a => Vector a -> Diagonal -> a
!! (Diagonal
n1 Diagonal -> Diagonal -> Diagonal
forall a. Num a => a -> a -> a
* Diagonal
64 Diagonal -> Diagonal -> Diagonal
forall a. Num a => a -> a -> a
+ Diagonal
n2)
getDiag :: Diag -> Board
getDiag :: Diagonal -> Board
getDiag = (Diagonal -> Diagonal) -> Diagonal -> Board
diagHelper (Diagonal
7 -)
getAntiDiag :: Int -> Board
getAntiDiag :: Diagonal -> Board
getAntiDiag = (Diagonal -> Diagonal) -> Diagonal -> Board
diagHelper Diagonal -> Diagonal
forall a. a -> a
forall {k} (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
diagHelper :: (Int -> Int) -> Int -> Board
diagHelper :: (Diagonal -> Diagonal) -> Diagonal -> Board
diagHelper Diagonal -> Diagonal
f Diagonal
n = (Board -> Board -> Board) -> Vector Board -> Board
forall a. Storable a => (a -> a -> a) -> Vector a -> a
foldl1 Board -> Board -> Board
(.|) Vector Board
xs
where
xs :: Vector Board
xs = [Element (Vector Board)] -> Vector Board
forall seq. IsSequence seq => [Element seq] -> seq
fromList do
Diagonal
x <- Vector Diagonal -> [Element (Vector Diagonal)]
forall mono. MonoFoldable mono => mono -> [Element mono]
toList Vector Diagonal
sideSquares
let y :: Diagonal
y = Diagonal -> Diagonal
f (Diagonal
n Diagonal -> Diagonal -> Diagonal
forall a. Num a => a -> a -> a
- Diagonal
x) Diagonal -> Diagonal -> Diagonal
forall a. Integral a => a -> a -> a
`rem` Diagonal
8
Bool -> [()]
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> [()]) -> Bool -> [()]
forall a b. (a -> b) -> a -> b
$ Diagonal -> Diagonal -> Diagonal -> Bool
inRange Diagonal
0 Diagonal
7 (Diagonal
n Diagonal -> Diagonal -> Diagonal
forall a. Num a => a -> a -> a
- Diagonal
x)
Board -> [Board]
forall a. a -> [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Board -> [Board]) -> Board -> [Board]
forall a b. (a -> b) -> a -> b
$ Diagonal -> Board
toBoard (Diagonal
y Diagonal -> Diagonal -> Diagonal
forall a. Num a => a -> a -> a
+ Diagonal
8 Diagonal -> Diagonal -> Diagonal
forall a. Num a => a -> a -> a
* Diagonal
x)
northMove :: Square -> Board
northMove :: Diagonal -> Board
northMove Diagonal
n = Diagonal -> Board
aboveMask Diagonal
n Board -> Board -> Board
& Vector Board
rankMovesVec Vector Board -> Diagonal -> Board
forall a. Storable a => Vector a -> Diagonal -> a
!! Diagonal
n
eastMove :: Square -> Board
eastMove :: Diagonal -> Board
eastMove Diagonal
n = Diagonal -> Board
aboveMask Diagonal
n Board -> Board -> Board
& Vector Board
fileMovesVec Vector Board -> Diagonal -> Board
forall a. Storable a => Vector a -> Diagonal -> a
!! Diagonal
n
westMove :: Square -> Board
westMove :: Diagonal -> Board
westMove Diagonal
n = Diagonal -> Board
belowMask Diagonal
n Board -> Board -> Board
& Vector Board
fileMovesVec Vector Board -> Diagonal -> Board
forall a. Storable a => Vector a -> Diagonal -> a
!! Diagonal
n
southMove :: Square -> Board
southMove :: Diagonal -> Board
southMove Diagonal
n = Diagonal -> Board
belowMask Diagonal
n Board -> Board -> Board
& Vector Board
rankMovesVec Vector Board -> Diagonal -> Board
forall a. Storable a => Vector a -> Diagonal -> a
!! Diagonal
n
northWestMove :: Square -> Board
northWestMove :: Diagonal -> Board
northWestMove Diagonal
n = Diagonal -> Board
aboveMask Diagonal
n Board -> Board -> Board
& Vector Board
diagMovesVec Vector Board -> Diagonal -> Board
forall a. Storable a => Vector a -> Diagonal -> a
!! Diagonal
n
northEastMove :: Square -> Board
northEastMove :: Diagonal -> Board
northEastMove Diagonal
n = Diagonal -> Board
aboveMask Diagonal
n Board -> Board -> Board
& Vector Board
antiDiagMovesVec Vector Board -> Diagonal -> Board
forall a. Storable a => Vector a -> Diagonal -> a
!! Diagonal
n
southEastMove :: Square -> Board
southEastMove :: Diagonal -> Board
southEastMove Diagonal
n = Diagonal -> Board
belowMask Diagonal
n Board -> Board -> Board
& Vector Board
diagMovesVec Vector Board -> Diagonal -> Board
forall a. Storable a => Vector a -> Diagonal -> a
!! Diagonal
n
southWestMove :: Square -> Board
southWestMove :: Diagonal -> Board
southWestMove Diagonal
n = Diagonal -> Board
belowMask Diagonal
n Board -> Board -> Board
& Vector Board
antiDiagMovesVec Vector Board -> Diagonal -> Board
forall a. Storable a => Vector a -> Diagonal -> a
!! Diagonal
n
aboveMask :: Square -> Board
aboveMask :: Diagonal -> Board
aboveMask Diagonal
n = (Diagonal -> Board
toBoard Diagonal
63 Board -> Board -> Board
forall a. Num a => a -> a -> a
- Diagonal -> Board
toBoard Diagonal
n) Board -> Diagonal -> Board
forall a. Bits a => a -> Diagonal -> a
<< Diagonal
1
belowMask :: Square -> Board
belowMask :: Diagonal -> Board
belowMask Diagonal
n = Diagonal -> Board
toBoard Diagonal
n Board -> Board -> Board
forall a. Num a => a -> a -> a
- Board
1
ranks :: Vector Board
ranks :: Vector Board
ranks = (Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map Diagonal -> Board
getRank Vector Diagonal
sideSquares
files :: Vector Board
files :: Vector Board
files = (Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map Diagonal -> Board
getFile Vector Diagonal
sideSquares
diags :: Vector Board
diags :: Vector Board
diags = (Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map Diagonal -> Board
getDiag Vector Diagonal
diagonals
antiDiags :: Vector Board
antiDiags :: Vector Board
antiDiags = (Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map Diagonal -> Board
getAntiDiag Vector Diagonal
diagonals
knightMovesVec :: Vector Board
knightMovesVec :: Vector Board
knightMovesVec = (Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map Diagonal -> Board
knightMove Vector Diagonal
squares
kingMovesVec :: Vector Board
kingMovesVec :: Vector Board
kingMovesVec = (Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map Diagonal -> Board
kingMove Vector Diagonal
squares
fileMovesVec :: Vector Board
fileMovesVec :: Vector Board
fileMovesVec = Vector Board -> Element (Vector Board) -> Vector Board
forall seq. SemiSequence seq => seq -> Element seq -> seq
snoc ((Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map Diagonal -> Board
fileMove Vector Diagonal
squares) Board
Element (Vector Board)
0
rankMovesVec :: Vector Board
rankMovesVec :: Vector Board
rankMovesVec = Vector Board -> Element (Vector Board) -> Vector Board
forall seq. SemiSequence seq => seq -> Element seq -> seq
snoc ((Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map Diagonal -> Board
rankMove Vector Diagonal
squares) Board
Element (Vector Board)
0
diagMovesVec :: Vector Board
diagMovesVec :: Vector Board
diagMovesVec = Vector Board -> Element (Vector Board) -> Vector Board
forall seq. SemiSequence seq => seq -> Element seq -> seq
snoc ((Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map Diagonal -> Board
diagMove Vector Diagonal
squares) Board
Element (Vector Board)
0
antiDiagMovesVec :: Vector Board
antiDiagMovesVec :: Vector Board
antiDiagMovesVec = Vector Board -> Element (Vector Board) -> Vector Board
forall seq. SemiSequence seq => seq -> Element seq -> seq
snoc ((Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map Diagonal -> Board
antiDiagMove Vector Diagonal
squares) Board
Element (Vector Board)
0
westMovesVec :: Vector Board
westMovesVec :: Vector Board
westMovesVec = Vector Board -> Element (Vector Board) -> Vector Board
forall seq. SemiSequence seq => seq -> Element seq -> seq
snoc ((Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map Diagonal -> Board
westMove Vector Diagonal
squares) Board
Element (Vector Board)
0
northMovesVec :: Vector Board
northMovesVec :: Vector Board
northMovesVec = Vector Board -> Element (Vector Board) -> Vector Board
forall seq. SemiSequence seq => seq -> Element seq -> seq
snoc ((Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map Diagonal -> Board
northMove Vector Diagonal
squares) Board
Element (Vector Board)
0
eastMovesVec :: Vector Board
eastMovesVec :: Vector Board
eastMovesVec = Vector Board -> Element (Vector Board) -> Vector Board
forall seq. SemiSequence seq => seq -> Element seq -> seq
snoc ((Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map Diagonal -> Board
eastMove Vector Diagonal
squares) Board
Element (Vector Board)
0
southMovesVec :: Vector Board
southMovesVec :: Vector Board
southMovesVec = Vector Board -> Element (Vector Board) -> Vector Board
forall seq. SemiSequence seq => seq -> Element seq -> seq
snoc ((Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map Diagonal -> Board
southMove Vector Diagonal
squares) Board
Element (Vector Board)
0
northWestMovesVec :: Vector Board
northWestMovesVec :: Vector Board
northWestMovesVec = Vector Board -> Element (Vector Board) -> Vector Board
forall seq. SemiSequence seq => seq -> Element seq -> seq
snoc ((Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map Diagonal -> Board
northWestMove Vector Diagonal
squares) Board
Element (Vector Board)
0
northEastMovesVec :: Vector Board
northEastMovesVec :: Vector Board
northEastMovesVec = Vector Board -> Element (Vector Board) -> Vector Board
forall seq. SemiSequence seq => seq -> Element seq -> seq
snoc ((Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map Diagonal -> Board
northEastMove Vector Diagonal
squares) Board
Element (Vector Board)
0
southEastMovesVec :: Vector Board
southEastMovesVec :: Vector Board
southEastMovesVec = Vector Board -> Element (Vector Board) -> Vector Board
forall seq. SemiSequence seq => seq -> Element seq -> seq
snoc ((Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map Diagonal -> Board
southEastMove Vector Diagonal
squares) Board
Element (Vector Board)
0
southWestMovesVec :: Vector Board
southWestMovesVec :: Vector Board
southWestMovesVec = Vector Board -> Element (Vector Board) -> Vector Board
forall seq. SemiSequence seq => seq -> Element seq -> seq
snoc ((Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map Diagonal -> Board
southWestMove Vector Diagonal
squares) Board
Element (Vector Board)
0
whiteKnightOutpostAttackersVec :: Vector Board
whiteKnightOutpostAttackersVec :: Vector Board
whiteKnightOutpostAttackersVec =
(Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map (Bool -> Diagonal -> Board
knightOutpostAttackers Bool
True) Vector Diagonal
squares
blackKnightOutpostAttackersVec :: Vector Board
blackKnightOutpostAttackersVec :: Vector Board
blackKnightOutpostAttackersVec =
(Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map (Bool -> Diagonal -> Board
knightOutpostAttackers Bool
False) Vector Diagonal
squares
whitePassedPawnBlockersVec :: Vector Board
whitePassedPawnBlockersVec :: Vector Board
whitePassedPawnBlockersVec =
(Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map (Bool -> Diagonal -> Board
passedPawnBlockers Bool
True) Vector Diagonal
squares
blackPassedPawnBlockersVec :: Vector Board
blackPassedPawnBlockersVec :: Vector Board
blackPassedPawnBlockersVec =
(Diagonal -> Board) -> Vector Diagonal -> Vector Board
forall a b.
(Storable a, Storable b) =>
(a -> b) -> Vector a -> Vector b
map (Bool -> Diagonal -> Board
passedPawnBlockers Bool
False) Vector Diagonal
squares
squareDistanceVec :: Vector Int
squareDistanceVec :: Vector Diagonal
squareDistanceVec = [Element (Vector Diagonal)] -> Vector Diagonal
forall seq. IsSequence seq => [Element seq] -> seq
fromList do
Diagonal
n1 <- Vector Diagonal -> [Element (Vector Diagonal)]
forall mono. MonoFoldable mono => mono -> [Element mono]
toList Vector Diagonal
squares
Diagonal
n2 <- Vector Diagonal -> [Element (Vector Diagonal)]
forall mono. MonoFoldable mono => mono -> [Element mono]
toList Vector Diagonal
squares
Diagonal -> [Diagonal]
forall a. a -> [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Diagonal -> [Diagonal]) -> Diagonal -> [Diagonal]
forall a b. (a -> b) -> a -> b
$ Diagonal -> Diagonal -> Diagonal
squareDistance Diagonal
n1 Diagonal
n2
{-# NOINLINE pieceRngVec #-}
pieceRngVec :: Vector Board
pieceRngVec :: Vector Board
pieceRngVec = IO (Vector Board) -> Vector Board
forall a. IO a -> a
unsafePerformIO
(Diagonal -> Diagonal -> Vector Board -> Vector Board
forall a.
Storable a =>
Diagonal -> Diagonal -> Vector a -> Vector a
slice Diagonal
0 Diagonal
768 (Vector Board -> Vector Board)
-> IO (Vector Board) -> IO (Vector Board)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO (Vector Board)
genRandoms)
{-# NOINLINE castlingRngVec #-}
castlingRngVec :: Vector Board
castlingRngVec :: Vector Board
castlingRngVec = IO (Vector Board) -> Vector Board
forall a. IO a -> a
unsafePerformIO
(Diagonal -> Diagonal -> Vector Board -> Vector Board
forall a.
Storable a =>
Diagonal -> Diagonal -> Vector a -> Vector a
slice Diagonal
768 Diagonal
16 (Vector Board -> Vector Board)
-> IO (Vector Board) -> IO (Vector Board)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO (Vector Board)
genRandoms)
{-# NOINLINE enPassantRngVec #-}
enPassantRngVec :: Vector Board
enPassantRngVec :: Vector Board
enPassantRngVec = IO (Vector Board) -> Vector Board
forall a. IO a -> a
unsafePerformIO
(Diagonal -> Diagonal -> Vector Board -> Vector Board
forall a.
Storable a =>
Diagonal -> Diagonal -> Vector a -> Vector a
slice Diagonal
784 Diagonal
8 (Vector Board -> Vector Board)
-> IO (Vector Board) -> IO (Vector Board)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO (Vector Board)
genRandoms)
{-# NOINLINE sideToMoveRng #-}
sideToMoveRng :: Board
sideToMoveRng :: Board
sideToMoveRng = IO Board -> Board
forall a. IO a -> a
unsafePerformIO
((Vector Board -> Diagonal -> Board
forall a. Storable a => Vector a -> Diagonal -> a
!! Diagonal
792) (Vector Board -> Board) -> IO (Vector Board) -> IO Board
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO (Vector Board)
genRandoms)
genRandoms :: IO (Vector Board)
genRandoms :: IO (Vector Board)
genRandoms = [Board] -> Vector Board
[Element (Vector Board)] -> Vector Board
forall seq. IsSequence seq => [Element seq] -> seq
fromList
([Board] -> Vector Board)
-> (StdGen -> [Board]) -> StdGen -> Vector 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
. Index [Board] -> [Board] -> [Board]
forall seq. IsSequence seq => Index seq -> seq -> seq
take Diagonal
Index [Board]
1000 ([Board] -> [Board]) -> (StdGen -> [Board]) -> StdGen -> [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
. StdGen -> [Board]
forall g. RandomGen g => g -> [Board]
forall a g. (Random a, RandomGen g) => g -> [a]
randoms
(StdGen -> Vector Board) -> IO StdGen -> IO (Vector Board)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO StdGen
forall (m :: * -> *). MonadIO m => m StdGen
getStdGen
squares :: Vector Square
squares :: Vector Diagonal
squares = [Element (Vector Diagonal)] -> Vector Diagonal
forall seq. IsSequence seq => [Element seq] -> seq
fromList [Diagonal
Element (Vector Diagonal)
0 .. Diagonal
Element (Vector Diagonal)
63]
sideSquares :: Vector SideSquare
sideSquares :: Vector Diagonal
sideSquares = [Element (Vector Diagonal)] -> Vector Diagonal
forall seq. IsSequence seq => [Element seq] -> seq
fromList [Diagonal
Element (Vector Diagonal)
0 .. Diagonal
Element (Vector Diagonal)
7]
diagonals :: Vector Diagonal
diagonals :: Vector Diagonal
diagonals = [Element (Vector Diagonal)] -> Vector Diagonal
forall seq. IsSequence seq => [Element seq] -> seq
fromList [Diagonal
Element (Vector Diagonal)
0 .. Diagonal
Element (Vector Diagonal)
14]
shortCastleSlidingFiles :: Board
shortCastleSlidingFiles :: Board
shortCastleSlidingFiles = Board
file_F Board -> Board -> Board
.| Board
file_G
longCastleSlidingFiles :: Board
longCastleSlidingFiles :: Board
longCastleSlidingFiles = Board
file_C Board -> Board -> Board
.| Board
file_D
shortCastleFiles :: Board
shortCastleFiles :: Board
shortCastleFiles = Board
file_F Board -> Board -> Board
.| Board
file_G Board -> Board -> Board
.| Board
file_H
longCastleFiles :: Board
longCastleFiles :: Board
longCastleFiles = Board
file_A Board -> Board -> Board
.| Board
file_B Board -> Board -> Board
.| Board
file_C
whiteKnightOutpostRanks :: Board
whiteKnightOutpostRanks :: Board
whiteKnightOutpostRanks = Board
rank_5 Board -> Board -> Board
.| Board
rank_6 Board -> Board -> Board
.| Board
rank_7
blackKnightOutpostRanks :: Board
blackKnightOutpostRanks :: Board
blackKnightOutpostRanks = Board
rank_4 Board -> Board -> Board
.| Board
rank_3 Board -> Board -> Board
.| Board
rank_2
knightOupostFiles :: Board
knightOupostFiles :: Board
knightOupostFiles = Board
file_C Board -> Board -> Board
.| Board
file_D Board -> Board -> Board
.| Board
file_E Board -> Board -> Board
.| Board
file_F
rank_1 :: Board
rank_1 :: Board
rank_1 = Diagonal -> Board
getRank Diagonal
0
rank_2 :: Board
rank_2 :: Board
rank_2 = Diagonal -> Board
getRank Diagonal
1
rank_3 :: Board
rank_3 :: Board
rank_3 = Diagonal -> Board
getRank Diagonal
2
rank_4 :: Board
rank_4 :: Board
rank_4 = Diagonal -> Board
getRank Diagonal
3
rank_5 :: Board
rank_5 :: Board
rank_5 = Diagonal -> Board
getRank Diagonal
4
rank_6 :: Board
rank_6 :: Board
rank_6 = Diagonal -> Board
getRank Diagonal
5
rank_7 :: Board
rank_7 :: Board
rank_7 = Diagonal -> Board
getRank Diagonal
6
rank_8 :: Board
rank_8 :: Board
rank_8 = Diagonal -> Board
getRank Diagonal
7
file_A :: Board
file_A :: Board
file_A = Diagonal -> Board
getFile Diagonal
0
file_B :: Board
file_B :: Board
file_B = Diagonal -> Board
getFile Diagonal
1
file_C :: Board
file_C :: Board
file_C = Diagonal -> Board
getFile Diagonal
2
file_D :: Board
file_D :: Board
file_D = Diagonal -> Board
getFile Diagonal
3
file_E :: Board
file_E :: Board
file_E = Diagonal -> Board
getFile Diagonal
4
file_F :: Board
file_F :: Board
file_F = Diagonal -> Board
getFile Diagonal
5
file_G :: Board
file_G :: Board
file_G = Diagonal -> Board
getFile Diagonal
6
file_H :: Board
file_H :: Board
file_H = Diagonal -> Board
getFile Diagonal
7