module BishBosh.StateProperty.Censor(
NPiecesByRank,
Censor(..),
findInvalidity
) where
import Control.Arrow((&&&), (***))
import qualified BishBosh.Attribute.Rank as Attribute.Rank
import qualified BishBosh.Component.Piece as Component.Piece
import qualified BishBosh.Property.SelfValidating as Property.SelfValidating
import qualified BishBosh.Type.Count as Type.Count
type NPiecesByRank = Attribute.Rank.ArrayByRank Type.Count.NPieces
class Censor censor where
countPiecesByLogicalColour :: censor -> (Type.Count.NPieces, Type.Count.NPieces)
countPieces :: censor -> Type.Count.NPieces
countPieces = (NPieces -> NPieces -> NPieces) -> (NPieces, NPieces) -> NPieces
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry NPieces -> NPieces -> NPieces
forall a. Num a => a -> a -> a
(+) ((NPieces, NPieces) -> NPieces)
-> (censor -> (NPieces, NPieces)) -> censor -> NPieces
forall b c a. (b -> c) -> (a -> b) -> a -> c
. censor -> (NPieces, NPieces)
forall censor. Censor censor => censor -> (NPieces, NPieces)
countPiecesByLogicalColour
countPieceDifferenceByRank :: censor -> NPiecesByRank
hasInsufficientMaterial :: censor -> Bool
hasBothKings :: censor -> Bool
findInvalidity :: Censor censor => censor -> [String]
findInvalidity :: censor -> [String]
findInvalidity = [(censor -> Bool, String)] -> censor -> [String]
forall selfValidator.
[(selfValidator -> Bool, String)] -> selfValidator -> [String]
Property.SelfValidating.findErrors [
(
Bool -> Bool
not (Bool -> Bool) -> (censor -> Bool) -> censor -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. censor -> Bool
forall censor. Censor censor => censor -> Bool
hasBothKings,
String
"there must be exactly one King of each logical colour."
), (
(Bool -> Bool -> Bool) -> (Bool, Bool) -> Bool
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Bool -> Bool -> Bool
(||) ((Bool, Bool) -> Bool)
-> (censor -> (Bool, Bool)) -> censor -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((NPieces -> Bool)
-> (NPieces -> Bool) -> (NPieces, NPieces) -> (Bool, Bool))
-> (NPieces -> Bool, NPieces -> Bool)
-> (NPieces, NPieces)
-> (Bool, Bool)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry (NPieces -> Bool)
-> (NPieces -> Bool) -> (NPieces, NPieces) -> (Bool, Bool)
forall (a :: * -> * -> *) b c b' c'.
Arrow a =>
a b c -> a b' c' -> a (b, b') (c, c')
(***) (
(NPieces -> Bool) -> NPieces -> Bool
forall a. a -> a
id ((NPieces -> Bool) -> NPieces -> Bool)
-> ((NPieces -> Bool) -> NPieces -> Bool)
-> (NPieces -> Bool)
-> (NPieces -> Bool, NPieces -> Bool)
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& (NPieces -> Bool) -> NPieces -> Bool
forall a. a -> a
id ((NPieces -> Bool) -> (NPieces -> Bool, NPieces -> Bool))
-> (NPieces -> Bool) -> (NPieces -> Bool, NPieces -> Bool)
forall a b. (a -> b) -> a -> b
$ (NPieces -> NPieces -> Bool
forall a. Ord a => a -> a -> Bool
> NPieces
Component.Piece.nPiecesPerSide)
) ((NPieces, NPieces) -> (Bool, Bool))
-> (censor -> (NPieces, NPieces)) -> censor -> (Bool, Bool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. censor -> (NPieces, NPieces)
forall censor. Censor censor => censor -> (NPieces, NPieces)
countPiecesByLogicalColour,
String
"there are too many pieces of at least one logical colour."
)
]