module BishBosh.Model.GameTerminationReason(
GameTerminationReason(),
toResult,
mkCheckMate,
mkResignation,
mkDraw,
isCheckMateBy,
isCheckMate,
isResignation,
isDraw,
isDrawByInsufficientMaterial,
isStaleMate
) where
import qualified BishBosh.Attribute.LogicalColour as Attribute.LogicalColour
import qualified BishBosh.Model.DrawReason as Model.DrawReason
import qualified BishBosh.Model.Result as Model.Result
import qualified BishBosh.Property.Opposable as Property.Opposable
import qualified Control.DeepSeq
data GameTerminationReason
= CheckMateOf Attribute.LogicalColour.LogicalColour
| ResignationBy Attribute.LogicalColour.LogicalColour
| Draw Model.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, 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
toResult :: GameTerminationReason -> Model.Result.Result
toResult :: GameTerminationReason -> Result
toResult GameTerminationReason
gameTerminationReason = Result -> Result
forall a. Opposable a => a -> a
Property.Opposable.getOpposite (Result -> Result)
-> (Maybe LogicalColour -> Result) -> Maybe LogicalColour -> Result
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe LogicalColour -> Result
Model.Result.mkResult (Maybe LogicalColour -> Result) -> Maybe LogicalColour -> Result
forall a b. (a -> b) -> a -> b
$ case GameTerminationReason
gameTerminationReason of
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 :: Model.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
Model.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
Model.DrawReason.staleMate
isStaleMate GameTerminationReason
_ = Bool
False