module BishBosh.Component.PieceSquareArray(
InterpolatedPieceSquareValues,
FindPieceSquareValue,
PieceSquareArray,
findPieceSquareValue,
mkPieceSquareArray
) where
import BishBosh.Data.Bool()
import Data.Array.IArray((!))
import qualified BishBosh.Attribute.LogicalColour as Attribute.LogicalColour
import qualified BishBosh.Attribute.Rank as Attribute.Rank
import qualified BishBosh.Cartesian.Coordinates as Cartesian.Coordinates
import qualified BishBosh.Component.Piece as Component.Piece
import qualified BishBosh.Property.Reflectable as Property.Reflectable
import qualified Control.DeepSeq
import qualified Data.Array.IArray
type InterpolatedPieceSquareValues pieceSquareValue = Either pieceSquareValue (Data.Array.IArray.Array Component.Piece.NPieces pieceSquareValue)
type InterpolatedPieceSquareValuesByCoordinates x y pieceSquareValue = Cartesian.Coordinates.ByCoordinates x y (InterpolatedPieceSquareValues pieceSquareValue)
newtype PieceSquareArray x y pieceSquareValue = MkPieceSquareArray {
deconstruct :: Attribute.Rank.ByRank (InterpolatedPieceSquareValuesByCoordinates x y pieceSquareValue)
} deriving (Eq, Show)
instance (
Control.DeepSeq.NFData pieceSquareValue,
Control.DeepSeq.NFData x,
Control.DeepSeq.NFData y
) => Control.DeepSeq.NFData (PieceSquareArray x y pieceSquareValue) where
rnf MkPieceSquareArray { deconstruct = byRank } = Control.DeepSeq.rnf byRank
mkPieceSquareArray :: (Attribute.Rank.Rank -> InterpolatedPieceSquareValuesByCoordinates x y pieceSquareValue) -> PieceSquareArray x y pieceSquareValue
mkPieceSquareArray = MkPieceSquareArray . Attribute.Rank.listArrayByRank . (`map` Attribute.Rank.range)
type FindPieceSquareValue x y pieceSquareValue
= Attribute.LogicalColour.LogicalColour
-> Attribute.Rank.Rank
-> Cartesian.Coordinates.Coordinates x y
-> pieceSquareValue
findPieceSquareValue :: (
Enum x,
Enum y,
Ord x,
Ord y
)
=> Component.Piece.NPieces
-> Attribute.LogicalColour.LogicalColour
-> Attribute.Rank.Rank
-> Cartesian.Coordinates.Coordinates x y
-> PieceSquareArray x y pieceSquareValue
-> pieceSquareValue
{-# INLINE findPieceSquareValue #-}
findPieceSquareValue nPieces logicalColour rank coordinates MkPieceSquareArray { deconstruct = byRank } = either id (! nPieces) $ byRank ! rank ! (
if Attribute.LogicalColour.isBlack logicalColour
then Property.Reflectable.reflectOnX
else id
) coordinates