{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
module BishBosh.State.EnPassantAbscissa (
EnPassantAbscissa(getAbscissa),
mkMaybeEnPassantAbscissa
) where
import qualified BishBosh.Attribute.LogicalColour as Attribute.LogicalColour
import qualified BishBosh.Cartesian.Coordinates as Cartesian.Coordinates
import qualified BishBosh.Component.Move as Component.Move
import qualified BishBosh.Component.Piece as Component.Piece
import qualified BishBosh.Component.QualifiedMove as Component.QualifiedMove
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.State.MaybePieceByCoordinates as State.MaybePieceByCoordinates
import qualified Control.DeepSeq
import qualified Data.Array.IArray
newtype EnPassantAbscissa x = MkEnPassantAbscissa {
getAbscissa :: x
} deriving (Eq, Ord)
instance Data.Array.IArray.Ix x => Component.Zobrist.Hashable1D EnPassantAbscissa x where
listRandoms1D MkEnPassantAbscissa { getAbscissa = x } = return . Component.Zobrist.dereferenceRandomByEnPassantAbscissa x
instance Control.DeepSeq.NFData x => Control.DeepSeq.NFData (EnPassantAbscissa x) where
rnf MkEnPassantAbscissa { getAbscissa = x } = Control.DeepSeq.rnf x
mkMaybeEnPassantAbscissa :: (
Enum x,
Enum y,
Ord x,
Ord y
)
=> Attribute.LogicalColour.LogicalColour
-> State.MaybePieceByCoordinates.MaybePieceByCoordinates x y
-> Component.Turn.Turn x y
-> Maybe (EnPassantAbscissa x)
mkMaybeEnPassantAbscissa nextLogicalColour maybePieceByCoordinates lastTurn
| Component.Turn.isPawnDoubleAdvance (Property.Opposable.getOpposite nextLogicalColour) lastTurn
, let destination = Component.Move.getDestination . Component.QualifiedMove.getMove $ Component.Turn.getQualifiedMove lastTurn
, any (
(
== Just (Component.Piece.mkPawn nextLogicalColour)
) . (
`State.MaybePieceByCoordinates.dereference` maybePieceByCoordinates
)
) $ Cartesian.Coordinates.getAdjacents destination = Just . MkEnPassantAbscissa $ Cartesian.Coordinates.getX destination
| otherwise = Nothing