From 3e4a9dd525ec3d2875dc6a7c9a0eee73cb615a58 Mon Sep 17 00:00:00 2001 From: Jonathan Lamothe Date: Mon, 26 Aug 2019 10:20:10 -0400 Subject: [PATCH] implemented GameStats and newGameStats --- src/Mtlstats/Types.hs | 42 ++++++++++++++++++++++++++++++++++++++++++ test/TypesSpec.hs | 19 +++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/src/Mtlstats/Types.hs b/src/Mtlstats/Types.hs index 547e7be..7c38d72 100644 --- a/src/Mtlstats/Types.hs +++ b/src/Mtlstats/Types.hs @@ -33,6 +33,7 @@ module Mtlstats.Types ( PlayerStats (..), Goalie (..), GoalieStats (..), + GameStats (..), Prompt (..), -- * Lenses -- ** ProgState Lenses @@ -76,6 +77,10 @@ module Mtlstats.Types ( gsWins, gsLosses, gsTies, + -- ** GameStats Lenses + gmsWins, + gmsLosses, + gmsOvertime, -- * Constructors newProgState, newGameState, @@ -84,6 +89,7 @@ module Mtlstats.Types ( newPlayerStats, newGoalie, newGoalieStats, + newGameStats, -- * Helper Functions -- ** ProgState Helpers teamScore, @@ -316,6 +322,33 @@ instance ToJSON GoalieStats where "losses" .= l <> "ties" .= t +-- | Game statistics +data GameStats = GameStats + { _gmsWins :: Int + -- ^ Games won + , _gmsLosses :: Int + -- ^ Games lost + , _gmsOvertime :: Int + -- ^ Games lost in overtime + } deriving (Eq, Show) + +instance FromJSON GameStats where + parseJSON = withObject "GameStats" $ \v -> GameStats + <$> v .: "wins" + <*> v .: "losses" + <*> v .: "overtime" + +instance ToJSON GameStats where + toJSON (GameStats w l ot) = object + [ "wins" .= w + , "losses" .= l + , "overtime" .= ot + ] + toEncoding (GameStats w l ot) = pairs $ + "wins" .= w <> + "losses" .= l <> + "overtime" .= ot + -- | Defines a user prompt data Prompt = Prompt { promptDrawer :: ProgState -> Update () @@ -335,6 +368,7 @@ makeLenses ''Player makeLenses ''PlayerStats makeLenses ''Goalie makeLenses ''GoalieStats +makeLenses ''GameStats gameTypeL :: Lens' ProgMode (Maybe GameType) gameTypeL = lens @@ -448,6 +482,14 @@ newGoalieStats = GoalieStats , _gsTies = 0 } +-- | Constructor for a 'GameStats' value +newGameStats :: GameStats +newGameStats = GameStats + { _gmsWins = 0 + , _gmsLosses = 0 + , _gmsOvertime = 0 + } + -- | Determines the team's points teamScore :: ProgState -> Maybe Int teamScore s = case s ^. progMode . gameTypeL of diff --git a/test/TypesSpec.hs b/test/TypesSpec.hs index 20464e9..680f0a4 100644 --- a/test/TypesSpec.hs +++ b/test/TypesSpec.hs @@ -38,6 +38,7 @@ spec :: Spec spec = describe "Mtlstats.Types" $ do playerSpec goalieSpec + gameStatsSpec databaseSpec pPointsSpec gameTypeLSpec @@ -53,6 +54,10 @@ playerSpec = describe "Player" $ jsonSpec player playerJSON goalieSpec :: Spec goalieSpec = describe "Goalie" $ jsonSpec goalie goalieJSON +gameStatsSpec :: Spec +gameStatsSpec = describe "GameStats" $ + jsonSpec (gameStats 1) (gameStatsJSON 1) + databaseSpec :: Spec databaseSpec = describe "Database" $ jsonSpec db dbJSON @@ -291,6 +296,20 @@ goalieStatsJSON n = Object $ HM.fromList , ( "ties", toJSON $ n + 6 ) ] +gameStats :: Int -> GameStats +gameStats n = GameStats + { _gmsWins = n + , _gmsLosses = n + 1 + , _gmsOvertime = n + 2 + } + +gameStatsJSON :: Int -> Value +gameStatsJSON n = Object $ HM.fromList + [ ( "wins", toJSON n ) + , ( "losses", toJSON $ n + 1 ) + , ( "overtime", toJSON $ n + 2 ) + ] + db :: Database db = newDatabase & dbPlayers .~ [player]