{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
module BishBosh.State.Position(
Position(
getMaybeEnPassantAbscissa
),
mkPosition
) where
import qualified BishBosh.Attribute.LogicalColour as Attribute.LogicalColour
import qualified BishBosh.Component.Turn as Component.Turn
import qualified BishBosh.Component.Zobrist as Component.Zobrist
import qualified BishBosh.Property.Opposable as Property.Opposable
import qualified BishBosh.Property.Reflectable as Property.Reflectable
import qualified BishBosh.State.CastleableRooksByLogicalColour as State.CastleableRooksByLogicalColour
import qualified BishBosh.State.EnPassantAbscissa as State.EnPassantAbscissa
import qualified BishBosh.State.MaybePieceByCoordinates as State.MaybePieceByCoordinates
import qualified BishBosh.Type.Length as Type.Length
import qualified Control.DeepSeq
import qualified Data.Array.IArray
import qualified Data.Maybe
data Position x y = MkPosition {
Position x y -> LogicalColour
getNextLogicalColour :: Attribute.LogicalColour.LogicalColour,
Position x y -> MaybePieceByCoordinates x y
getMaybePieceByCoordinates :: State.MaybePieceByCoordinates.MaybePieceByCoordinates x y,
Position x y -> CastleableRooksByLogicalColour x
getCastleableRooksByLogicalColour :: State.CastleableRooksByLogicalColour.CastleableRooksByLogicalColour x,
Position x y -> Maybe (EnPassantAbscissa x)
getMaybeEnPassantAbscissa :: Maybe (State.EnPassantAbscissa.EnPassantAbscissa x)
} deriving Position x y -> Position x y -> Bool
(Position x y -> Position x y -> Bool)
-> (Position x y -> Position x y -> Bool) -> Eq (Position x y)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall x y.
(Enum x, Enum y, Ord x, Ord y) =>
Position x y -> Position x y -> Bool
/= :: Position x y -> Position x y -> Bool
$c/= :: forall x y.
(Enum x, Enum y, Ord x, Ord y) =>
Position x y -> Position x y -> Bool
== :: Position x y -> Position x y -> Bool
$c== :: forall x y.
(Enum x, Enum y, Ord x, Ord y) =>
Position x y -> Position x y -> Bool
Eq
instance (
Enum x,
Enum y,
Ord x,
Ord y
) => Ord (Position x y) where
{-# SPECIALISE instance Ord (Position Type.Length.X Type.Length.Y) #-}
position :: Position x y
position@MkPosition {
getNextLogicalColour :: forall x y. Position x y -> LogicalColour
getNextLogicalColour = LogicalColour
nextLogicalColour,
getMaybePieceByCoordinates :: forall x y. Position x y -> MaybePieceByCoordinates x y
getMaybePieceByCoordinates = MaybePieceByCoordinates x y
maybePieceByCoordinates
} compare :: Position x y -> Position x y -> Ordering
`compare` position' :: Position x y
position'@MkPosition {
getNextLogicalColour :: forall x y. Position x y -> LogicalColour
getNextLogicalColour = LogicalColour
nextLogicalColour',
getMaybePieceByCoordinates :: forall x y. Position x y -> MaybePieceByCoordinates x y
getMaybePieceByCoordinates = MaybePieceByCoordinates x y
maybePieceByCoordinates'
} = (
LogicalColour
nextLogicalColour,
MaybePieceByCoordinates x y
maybePieceByCoordinates,
Position x y -> CastleableRooksByLogicalColour x
forall x y. Position x y -> CastleableRooksByLogicalColour x
getCastleableRooksByLogicalColour Position x y
position,
Position x y -> Maybe (EnPassantAbscissa x)
forall x y. Position x y -> Maybe (EnPassantAbscissa x)
getMaybeEnPassantAbscissa Position x y
position
) (LogicalColour, MaybePieceByCoordinates x y,
CastleableRooksByLogicalColour x, Maybe (EnPassantAbscissa x))
-> (LogicalColour, MaybePieceByCoordinates x y,
CastleableRooksByLogicalColour x, Maybe (EnPassantAbscissa x))
-> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` (
LogicalColour
nextLogicalColour',
MaybePieceByCoordinates x y
maybePieceByCoordinates',
Position x y -> CastleableRooksByLogicalColour x
forall x y. Position x y -> CastleableRooksByLogicalColour x
getCastleableRooksByLogicalColour Position x y
position',
Position x y -> Maybe (EnPassantAbscissa x)
forall x y. Position x y -> Maybe (EnPassantAbscissa x)
getMaybeEnPassantAbscissa Position x y
position'
)
instance (
Control.DeepSeq.NFData x,
Control.DeepSeq.NFData y
) => Control.DeepSeq.NFData (Position x y) where
rnf :: Position x y -> ()
rnf MkPosition {
getNextLogicalColour :: forall x y. Position x y -> LogicalColour
getNextLogicalColour = LogicalColour
nextLogicalColour,
getMaybePieceByCoordinates :: forall x y. Position x y -> MaybePieceByCoordinates x y
getMaybePieceByCoordinates = MaybePieceByCoordinates x y
maybePieceByCoordinates,
getCastleableRooksByLogicalColour :: forall x y. Position x y -> CastleableRooksByLogicalColour x
getCastleableRooksByLogicalColour = CastleableRooksByLogicalColour x
castleableRooksByLogicalColour,
getMaybeEnPassantAbscissa :: forall x y. Position x y -> Maybe (EnPassantAbscissa x)
getMaybeEnPassantAbscissa = Maybe (EnPassantAbscissa x)
maybeEnPassantAbscissa
} = (LogicalColour, MaybePieceByCoordinates x y,
CastleableRooksByLogicalColour x, Maybe (EnPassantAbscissa x))
-> ()
forall a. NFData a => a -> ()
Control.DeepSeq.rnf (LogicalColour
nextLogicalColour, MaybePieceByCoordinates x y
maybePieceByCoordinates, CastleableRooksByLogicalColour x
castleableRooksByLogicalColour, Maybe (EnPassantAbscissa x)
maybeEnPassantAbscissa)
instance (
Enum x,
Enum y,
Ord x,
Ord y
) => Property.Reflectable.ReflectableOnX (Position x y) where
reflectOnX :: Position x y -> Position x y
reflectOnX position :: Position x y
position@MkPosition {
getNextLogicalColour :: forall x y. Position x y -> LogicalColour
getNextLogicalColour = LogicalColour
nextLogicalColour,
getMaybePieceByCoordinates :: forall x y. Position x y -> MaybePieceByCoordinates x y
getMaybePieceByCoordinates = MaybePieceByCoordinates x y
maybePieceByCoordinates,
getCastleableRooksByLogicalColour :: forall x y. Position x y -> CastleableRooksByLogicalColour x
getCastleableRooksByLogicalColour = CastleableRooksByLogicalColour x
castleableRooksByLogicalColour
} = Position x y
position {
getNextLogicalColour :: LogicalColour
getNextLogicalColour = LogicalColour -> LogicalColour
forall a. Opposable a => a -> a
Property.Opposable.getOpposite LogicalColour
nextLogicalColour,
getMaybePieceByCoordinates :: MaybePieceByCoordinates x y
getMaybePieceByCoordinates = MaybePieceByCoordinates x y -> MaybePieceByCoordinates x y
forall a. ReflectableOnX a => a -> a
Property.Reflectable.reflectOnX MaybePieceByCoordinates x y
maybePieceByCoordinates,
getCastleableRooksByLogicalColour :: CastleableRooksByLogicalColour x
getCastleableRooksByLogicalColour = CastleableRooksByLogicalColour x
-> CastleableRooksByLogicalColour x
forall a. ReflectableOnX a => a -> a
Property.Reflectable.reflectOnX CastleableRooksByLogicalColour x
castleableRooksByLogicalColour
}
instance (Data.Array.IArray.Ix x, Enum x, Enum y, Ord y) => Component.Zobrist.Hashable2D Position x y where
listRandoms2D :: Position x y -> Zobrist x y positionHash -> [positionHash]
listRandoms2D MkPosition {
getNextLogicalColour :: forall x y. Position x y -> LogicalColour
getNextLogicalColour = LogicalColour
nextLogicalColour,
getMaybePieceByCoordinates :: forall x y. Position x y -> MaybePieceByCoordinates x y
getMaybePieceByCoordinates = MaybePieceByCoordinates x y
maybePieceByCoordinates,
getCastleableRooksByLogicalColour :: forall x y. Position x y -> CastleableRooksByLogicalColour x
getCastleableRooksByLogicalColour = CastleableRooksByLogicalColour x
castleableRooksByLogicalColour,
getMaybeEnPassantAbscissa :: forall x y. Position x y -> Maybe (EnPassantAbscissa x)
getMaybeEnPassantAbscissa = Maybe (EnPassantAbscissa x)
maybeEnPassantAbscissa
} Zobrist x y positionHash
zobrist = (
if LogicalColour -> Bool
Attribute.LogicalColour.isBlack LogicalColour
nextLogicalColour
then (Zobrist x y positionHash -> positionHash
forall x y positionHash. Zobrist x y positionHash -> positionHash
Component.Zobrist.getRandomForBlacksMove Zobrist x y positionHash
zobrist positionHash -> [positionHash] -> [positionHash]
forall a. a -> [a] -> [a]
:)
else [positionHash] -> [positionHash]
forall a. a -> a
id
) ([positionHash] -> [positionHash])
-> ([positionHash] -> [positionHash])
-> [positionHash]
-> [positionHash]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([positionHash] -> [positionHash])
-> (EnPassantAbscissa x -> [positionHash] -> [positionHash])
-> Maybe (EnPassantAbscissa x)
-> [positionHash]
-> [positionHash]
forall b a. b -> (a -> b) -> Maybe a -> b
Data.Maybe.maybe [positionHash] -> [positionHash]
forall a. a -> a
id (
[positionHash] -> [positionHash] -> [positionHash]
forall a. [a] -> [a] -> [a]
(++) ([positionHash] -> [positionHash] -> [positionHash])
-> (EnPassantAbscissa x -> [positionHash])
-> EnPassantAbscissa x
-> [positionHash]
-> [positionHash]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (EnPassantAbscissa x -> Zobrist x y positionHash -> [positionHash]
forall (hashable :: * -> *) x y positionHash.
Hashable1D hashable x =>
hashable x -> Zobrist x y positionHash -> [positionHash]
`Component.Zobrist.listRandoms1D` Zobrist x y positionHash
zobrist)
) Maybe (EnPassantAbscissa x)
maybeEnPassantAbscissa ([positionHash] -> [positionHash])
-> [positionHash] -> [positionHash]
forall a b. (a -> b) -> a -> b
$ CastleableRooksByLogicalColour x
-> Zobrist x y positionHash -> [positionHash]
forall (hashable :: * -> *) x y positionHash.
Hashable1D hashable x =>
hashable x -> Zobrist x y positionHash -> [positionHash]
Component.Zobrist.listRandoms1D CastleableRooksByLogicalColour x
castleableRooksByLogicalColour Zobrist x y positionHash
zobrist [positionHash] -> [positionHash] -> [positionHash]
forall a. [a] -> [a] -> [a]
++ MaybePieceByCoordinates x y
-> Zobrist x y positionHash -> [positionHash]
forall (hashable :: * -> * -> *) x y positionHash.
Hashable2D hashable x y =>
hashable x y -> Zobrist x y positionHash -> [positionHash]
Component.Zobrist.listRandoms2D MaybePieceByCoordinates x y
maybePieceByCoordinates Zobrist x y positionHash
zobrist
mkPosition :: (
Enum x,
Enum y,
Ord x,
Ord y
)
=> Attribute.LogicalColour.LogicalColour
-> State.MaybePieceByCoordinates.MaybePieceByCoordinates x y
-> State.CastleableRooksByLogicalColour.CastleableRooksByLogicalColour x
-> Maybe (Component.Turn.Turn x y)
-> Position x y
{-# SPECIALISE mkPosition :: Attribute.LogicalColour.LogicalColour -> State.MaybePieceByCoordinates.MaybePieceByCoordinates Type.Length.X Type.Length.Y -> State.CastleableRooksByLogicalColour.CastleableRooksByLogicalColour Type.Length.X -> Maybe (Component.Turn.Turn Type.Length.X Type.Length.Y) -> Position Type.Length.X Type.Length.Y #-}
mkPosition :: LogicalColour
-> MaybePieceByCoordinates x y
-> CastleableRooksByLogicalColour x
-> Maybe (Turn x y)
-> Position x y
mkPosition LogicalColour
nextLogicalColour MaybePieceByCoordinates x y
maybePieceByCoordinates CastleableRooksByLogicalColour x
castleableRooksByLogicalColour Maybe (Turn x y)
maybeLastTurn = MkPosition :: forall x y.
LogicalColour
-> MaybePieceByCoordinates x y
-> CastleableRooksByLogicalColour x
-> Maybe (EnPassantAbscissa x)
-> Position x y
MkPosition {
getNextLogicalColour :: LogicalColour
getNextLogicalColour = LogicalColour
nextLogicalColour,
getMaybePieceByCoordinates :: MaybePieceByCoordinates x y
getMaybePieceByCoordinates = MaybePieceByCoordinates x y
maybePieceByCoordinates,
getCastleableRooksByLogicalColour :: CastleableRooksByLogicalColour x
getCastleableRooksByLogicalColour = CastleableRooksByLogicalColour x
castleableRooksByLogicalColour,
getMaybeEnPassantAbscissa :: Maybe (EnPassantAbscissa x)
getMaybeEnPassantAbscissa = Maybe (Turn x y)
maybeLastTurn Maybe (Turn x y)
-> (Turn x y -> Maybe (EnPassantAbscissa x))
-> Maybe (EnPassantAbscissa x)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= LogicalColour
-> MaybePieceByCoordinates x y
-> Turn x y
-> Maybe (EnPassantAbscissa x)
forall x y.
(Enum x, Enum y, Ord x, Ord y) =>
LogicalColour
-> MaybePieceByCoordinates x y
-> Turn x y
-> Maybe (EnPassantAbscissa x)
State.EnPassantAbscissa.mkMaybeEnPassantAbscissa LogicalColour
nextLogicalColour MaybePieceByCoordinates x y
maybePieceByCoordinates
}