{-# LANGUAGE LambdaCase #-}
module BishBosh.Rule.GameTerminationReason(
GameTerminationReason(),
toResult,
mkCheckMate,
mkResignation,
mkDraw,
isCheckMateBy,
isCheckMate,
isResignation,
isDraw,
isDrawByInsufficientMaterial,
isStaleMate
) where
import qualified BishBosh.Attribute.LogicalColour as Attribute.LogicalColour
import qualified BishBosh.Property.FixedMembership as Property.FixedMembership
import qualified BishBosh.Property.Opposable as Property.Opposable
import qualified BishBosh.Rule.DrawReason as Rule.DrawReason
import qualified BishBosh.Rule.Result as Rule.Result
import qualified Control.DeepSeq
data GameTerminationReason
= CheckMateOf Attribute.LogicalColour.LogicalColour
| ResignationBy Attribute.LogicalColour.LogicalColour
| Draw Rule.DrawReason.DrawReason
deriving (GameTerminationReason -> GameTerminationReason -> Bool
(GameTerminationReason -> GameTerminationReason -> Bool)
-> (GameTerminationReason -> GameTerminationReason -> Bool)
-> Eq GameTerminationReason
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GameTerminationReason -> GameTerminationReason -> Bool
$c/= :: GameTerminationReason -> GameTerminationReason -> Bool
== :: GameTerminationReason -> GameTerminationReason -> Bool
$c== :: GameTerminationReason -> GameTerminationReason -> Bool
Eq, Eq GameTerminationReason
Eq GameTerminationReason
-> (GameTerminationReason -> GameTerminationReason -> Ordering)
-> (GameTerminationReason -> GameTerminationReason -> Bool)
-> (GameTerminationReason -> GameTerminationReason -> Bool)
-> (GameTerminationReason -> GameTerminationReason -> Bool)
-> (GameTerminationReason -> GameTerminationReason -> Bool)
-> (GameTerminationReason
-> GameTerminationReason -> GameTerminationReason)
-> (GameTerminationReason
-> GameTerminationReason -> GameTerminationReason)
-> Ord GameTerminationReason
GameTerminationReason -> GameTerminationReason -> Bool
GameTerminationReason -> GameTerminationReason -> Ordering
GameTerminationReason
-> GameTerminationReason -> GameTerminationReason
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: GameTerminationReason
-> GameTerminationReason -> GameTerminationReason
$cmin :: GameTerminationReason
-> GameTerminationReason -> GameTerminationReason
max :: GameTerminationReason
-> GameTerminationReason -> GameTerminationReason
$cmax :: GameTerminationReason
-> GameTerminationReason -> GameTerminationReason
>= :: GameTerminationReason -> GameTerminationReason -> Bool
$c>= :: GameTerminationReason -> GameTerminationReason -> Bool
> :: GameTerminationReason -> GameTerminationReason -> Bool
$c> :: GameTerminationReason -> GameTerminationReason -> Bool
<= :: GameTerminationReason -> GameTerminationReason -> Bool
$c<= :: GameTerminationReason -> GameTerminationReason -> Bool
< :: GameTerminationReason -> GameTerminationReason -> Bool
$c< :: GameTerminationReason -> GameTerminationReason -> Bool
compare :: GameTerminationReason -> GameTerminationReason -> Ordering
$ccompare :: GameTerminationReason -> GameTerminationReason -> Ordering
$cp1Ord :: Eq GameTerminationReason
Ord, ReadPrec [GameTerminationReason]
ReadPrec GameTerminationReason
Int -> ReadS GameTerminationReason
ReadS [GameTerminationReason]
(Int -> ReadS GameTerminationReason)
-> ReadS [GameTerminationReason]
-> ReadPrec GameTerminationReason
-> ReadPrec [GameTerminationReason]
-> Read GameTerminationReason
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GameTerminationReason]
$creadListPrec :: ReadPrec [GameTerminationReason]
readPrec :: ReadPrec GameTerminationReason
$creadPrec :: ReadPrec GameTerminationReason
readList :: ReadS [GameTerminationReason]
$creadList :: ReadS [GameTerminationReason]
readsPrec :: Int -> ReadS GameTerminationReason
$creadsPrec :: Int -> ReadS GameTerminationReason
Read, Int -> GameTerminationReason -> ShowS
[GameTerminationReason] -> ShowS
GameTerminationReason -> String
(Int -> GameTerminationReason -> ShowS)
-> (GameTerminationReason -> String)
-> ([GameTerminationReason] -> ShowS)
-> Show GameTerminationReason
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GameTerminationReason] -> ShowS
$cshowList :: [GameTerminationReason] -> ShowS
show :: GameTerminationReason -> String
$cshow :: GameTerminationReason -> String
showsPrec :: Int -> GameTerminationReason -> ShowS
$cshowsPrec :: Int -> GameTerminationReason -> ShowS
Show)
instance Control.DeepSeq.NFData GameTerminationReason where
rnf :: GameTerminationReason -> ()
rnf (CheckMateOf LogicalColour
logicalColour) = LogicalColour -> ()
forall a. NFData a => a -> ()
Control.DeepSeq.rnf LogicalColour
logicalColour
rnf (ResignationBy LogicalColour
logicalColour) = LogicalColour -> ()
forall a. NFData a => a -> ()
Control.DeepSeq.rnf LogicalColour
logicalColour
rnf (Draw DrawReason
drawReason) = DrawReason -> ()
forall a. NFData a => a -> ()
Control.DeepSeq.rnf DrawReason
drawReason
instance Property.Opposable.Opposable GameTerminationReason where
getOpposite :: GameTerminationReason -> GameTerminationReason
getOpposite (CheckMateOf LogicalColour
logicalColour) = LogicalColour -> GameTerminationReason
CheckMateOf (LogicalColour -> GameTerminationReason)
-> LogicalColour -> GameTerminationReason
forall a b. (a -> b) -> a -> b
$ LogicalColour -> LogicalColour
forall a. Opposable a => a -> a
Property.Opposable.getOpposite LogicalColour
logicalColour
getOpposite (ResignationBy LogicalColour
logicalColour) = LogicalColour -> GameTerminationReason
ResignationBy (LogicalColour -> GameTerminationReason)
-> LogicalColour -> GameTerminationReason
forall a b. (a -> b) -> a -> b
$ LogicalColour -> LogicalColour
forall a. Opposable a => a -> a
Property.Opposable.getOpposite LogicalColour
logicalColour
getOpposite GameTerminationReason
draw = GameTerminationReason
draw
instance Property.FixedMembership.FixedMembership GameTerminationReason where
members :: [GameTerminationReason]
members = (LogicalColour -> GameTerminationReason)
-> [LogicalColour] -> [GameTerminationReason]
forall a b. (a -> b) -> [a] -> [b]
map LogicalColour -> GameTerminationReason
CheckMateOf [LogicalColour]
forall a. FixedMembership a => [a]
Property.FixedMembership.members [GameTerminationReason]
-> [GameTerminationReason] -> [GameTerminationReason]
forall a. [a] -> [a] -> [a]
++ (LogicalColour -> GameTerminationReason)
-> [LogicalColour] -> [GameTerminationReason]
forall a b. (a -> b) -> [a] -> [b]
map LogicalColour -> GameTerminationReason
ResignationBy [LogicalColour]
forall a. FixedMembership a => [a]
Property.FixedMembership.members [GameTerminationReason]
-> [GameTerminationReason] -> [GameTerminationReason]
forall a. [a] -> [a] -> [a]
++ (DrawReason -> GameTerminationReason)
-> [DrawReason] -> [GameTerminationReason]
forall a b. (a -> b) -> [a] -> [b]
map DrawReason -> GameTerminationReason
Draw [DrawReason]
forall a. FixedMembership a => [a]
Property.FixedMembership.members
toResult :: GameTerminationReason -> Rule.Result.Result
toResult :: GameTerminationReason -> Result
toResult = Result -> Result
forall a. Opposable a => a -> a
Property.Opposable.getOpposite (Result -> Result)
-> (GameTerminationReason -> Result)
-> GameTerminationReason
-> Result
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe LogicalColour -> Result
Rule.Result.mkResult (Maybe LogicalColour -> Result)
-> (GameTerminationReason -> Maybe LogicalColour)
-> GameTerminationReason
-> Result
forall b c a. (b -> c) -> (a -> b) -> a -> c
. \case
CheckMateOf LogicalColour
logicalColour -> LogicalColour -> Maybe LogicalColour
forall a. a -> Maybe a
Just LogicalColour
logicalColour
ResignationBy LogicalColour
logicalColour -> LogicalColour -> Maybe LogicalColour
forall a. a -> Maybe a
Just LogicalColour
logicalColour
Draw DrawReason
_ -> Maybe LogicalColour
forall a. Maybe a
Nothing
mkCheckMate :: Attribute.LogicalColour.LogicalColour -> GameTerminationReason
mkCheckMate :: LogicalColour -> GameTerminationReason
mkCheckMate = LogicalColour -> GameTerminationReason
CheckMateOf
mkResignation :: Attribute.LogicalColour.LogicalColour -> GameTerminationReason
mkResignation :: LogicalColour -> GameTerminationReason
mkResignation = LogicalColour -> GameTerminationReason
ResignationBy
mkDraw :: Rule.DrawReason.DrawReason -> GameTerminationReason
mkDraw :: DrawReason -> GameTerminationReason
mkDraw = DrawReason -> GameTerminationReason
Draw
isCheckMateBy :: Attribute.LogicalColour.LogicalColour -> GameTerminationReason -> Bool
isCheckMateBy :: LogicalColour -> GameTerminationReason -> Bool
isCheckMateBy LogicalColour
logicalColour (CheckMateOf LogicalColour
logicalColour') = LogicalColour
logicalColour LogicalColour -> LogicalColour -> Bool
forall a. Eq a => a -> a -> Bool
/= LogicalColour
logicalColour'
isCheckMateBy LogicalColour
_ GameTerminationReason
_ = Bool
False
isCheckMate :: GameTerminationReason -> Bool
isCheckMate :: GameTerminationReason -> Bool
isCheckMate (CheckMateOf LogicalColour
_) = Bool
True
isCheckMate GameTerminationReason
_ = Bool
False
isResignation :: GameTerminationReason -> Bool
isResignation :: GameTerminationReason -> Bool
isResignation (ResignationBy LogicalColour
_) = Bool
True
isResignation GameTerminationReason
_ = Bool
False
isDraw :: GameTerminationReason -> Bool
isDraw :: GameTerminationReason -> Bool
isDraw (Draw DrawReason
_) = Bool
True
isDraw GameTerminationReason
_ = Bool
False
isDrawByInsufficientMaterial :: GameTerminationReason -> Bool
isDrawByInsufficientMaterial :: GameTerminationReason -> Bool
isDrawByInsufficientMaterial (Draw DrawReason
draw) = DrawReason
draw DrawReason -> DrawReason -> Bool
forall a. Eq a => a -> a -> Bool
== DrawReason
Rule.DrawReason.insufficientMaterial
isDrawByInsufficientMaterial GameTerminationReason
_ = Bool
False
isStaleMate :: GameTerminationReason -> Bool
isStaleMate :: GameTerminationReason -> Bool
isStaleMate (Draw DrawReason
draw) = DrawReason
draw DrawReason -> DrawReason -> Bool
forall a. Eq a => a -> a -> Bool
== DrawReason
Rule.DrawReason.staleMate
isStaleMate GameTerminationReason
_ = Bool
False