module BishBosh.Model.Result(
Result(
),
range,
findMaybeVictor,
mkResult,
isDraw
) where
import qualified BishBosh.Attribute.LogicalColour as Attribute.LogicalColour
import qualified BishBosh.Property.Opposable as Property.Opposable
import qualified Control.DeepSeq
import qualified Data.List.Extra
data Result
= VictoryBy Attribute.LogicalColour.LogicalColour
| Draw
deriving Eq
instance Control.DeepSeq.NFData Result where
rnf (VictoryBy logicalColour) = Control.DeepSeq.rnf logicalColour
rnf Draw = ()
instance Show Result where
showsPrec _ result = (
\(showsWhiteResult, showsBlackResult) -> showsWhiteResult . showChar '-' . showsBlackResult
) $ case result of
VictoryBy Attribute.LogicalColour.Black -> (lose, win)
VictoryBy _ -> (win, lose)
_ -> (draw, draw)
where
lose = showChar '0'
win = showChar '1'
draw = showString "1/2"
instance Read Result where
readsPrec _ s = case Data.List.Extra.trimStart s of
'0' : '-' : '1' : remainder -> [(VictoryBy Attribute.LogicalColour.Black, remainder)]
'1' : '-' : '0' : remainder -> [(VictoryBy Attribute.LogicalColour.White, remainder)]
'1' : '/' : '2' : '-' : '1' : '/' : '2' : remainder -> [(Draw, remainder)]
_ -> []
instance Property.Opposable.Opposable Result where
getOpposite (VictoryBy logicalColour) = VictoryBy $ Property.Opposable.getOpposite logicalColour
getOpposite _ = Draw
range :: [Result]
range = Draw : map VictoryBy Attribute.LogicalColour.range
mkResult :: Maybe Attribute.LogicalColour.LogicalColour -> Result
mkResult (Just logicalColour) = VictoryBy logicalColour
mkResult _ = Draw
isDraw :: Result -> Bool
isDraw Draw = True
isDraw _ = False
findMaybeVictor :: Result -> Maybe Attribute.LogicalColour.LogicalColour
findMaybeVictor (VictoryBy logicalColour) = Just logicalColour
findMaybeVictor _ = Nothing