diff --git a/src/Mtlstats/Actions/EditGoalie.hs b/src/Mtlstats/Actions/EditGoalie.hs deleted file mode 100644 index c1599b2..0000000 --- a/src/Mtlstats/Actions/EditGoalie.hs +++ /dev/null @@ -1,164 +0,0 @@ -{- | - -mtlstats -Copyright (C) 2019 Rhéal Lamothe - - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at -your option) any later version. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . - --} - -module Mtlstats.Actions.EditGoalie - ( editGoalieNumber - , editGoalieName - , editGoalieYtdGames - , editGoalieYtdMins - , editGoalieYtdGoals - , editGoalieYtdWins - , editGoalieYtdLosses - , editGoalieYtdTies - , editGoalieLtGames - , editGoalieLtMins - , editGoalieLtGoals - , editGoalieLtWins - , editGoalieLtLosses - , editGoalieLtTies - ) where - -import Control.Monad (void) -import Data.Maybe (fromMaybe) -import Lens.Micro ((^.), (&), (.~), (%~)) - -import Mtlstats.Types -import Mtlstats.Util - --- | Edits a goalie's number -editGoalieNumber - :: Int - -- ^ New goalie number - -> ProgState - -> ProgState -editGoalieNumber num = editGoalie (gNumber .~ num) EGMenu - --- | Edits a goalie's name -editGoalieName - :: String - -- ^ The new name - -> ProgState - -> ProgState -editGoalieName name = editGoalie (gName .~ name) EGMenu - --- | Edits a goalie's YTD games -editGoalieYtdGames - :: Int - -- ^ The number of games played - -> ProgState - -> ProgState -editGoalieYtdGames games = editGoalie (gYtd.gsGames .~ games) EGYtd - --- | Edits a goalie's YTD minutes -editGoalieYtdMins - :: Int - -- ^ The number of minutes played - -> ProgState - -> ProgState -editGoalieYtdMins mins = editGoalie (gYtd.gsMinsPlayed .~ mins) EGYtd - --- | Edits a goalie's YTD goals allowed -editGoalieYtdGoals - :: Int - -- ^ The number of goals - -> ProgState - -> ProgState -editGoalieYtdGoals goals = editGoalie (gYtd.gsGoalsAllowed .~ goals) EGYtd - --- | Edits a goalie's YTD wins -editGoalieYtdWins - :: Int - -- ^ The number of wins - -> ProgState - -> ProgState -editGoalieYtdWins wins = editGoalie (gYtd.gsWins .~ wins) EGYtd - --- | Edits a goalie's YTD losses -editGoalieYtdLosses - :: Int - -- ^ The number of losses - -> ProgState - -> ProgState -editGoalieYtdLosses losses = editGoalie (gYtd.gsLosses .~ losses) EGYtd - --- | Edits a goalie's YTD ties -editGoalieYtdTies - :: Int - -- ^ The number of ties - -> ProgState - -> ProgState -editGoalieYtdTies ties = editGoalie (gYtd.gsTies .~ ties) EGYtd - --- | Edits a goalie's lifetime games played -editGoalieLtGames - :: Int - -- ^ The number of games - -> ProgState - -> ProgState -editGoalieLtGames games = editGoalie (gLifetime.gsGames .~ games) EGLifetime - --- | Edits a goalie's lifetime minutes played -editGoalieLtMins - :: Int - -- ^ The number of minutes - -> ProgState - -> ProgState -editGoalieLtMins mins = editGoalie (gLifetime.gsMinsPlayed .~ mins) EGLifetime - --- | Edits a goalie's lifetime goals allowed -editGoalieLtGoals - :: Int - -- ^ The number of goals - -> ProgState - -> ProgState -editGoalieLtGoals goals = editGoalie (gLifetime.gsGoalsAllowed .~ goals) EGLifetime - --- | Edits a goalie's lifetime wins -editGoalieLtWins - :: Int - -- ^ The number of wins - -> ProgState - -> ProgState -editGoalieLtWins wins = editGoalie (gLifetime.gsWins .~ wins) EGLifetime - --- | Edits a goalie's lifetime losses -editGoalieLtLosses - :: Int - -- ^ The number of losses - -> ProgState - -> ProgState -editGoalieLtLosses losses = editGoalie (gLifetime.gsLosses .~ losses) EGLifetime - --- | Edits a goalie's lifetime ties -editGoalieLtTies - :: Int - -- ^ The number of ties - -> ProgState - -> ProgState -editGoalieLtTies ties = editGoalie (gLifetime.gsTies .~ ties) EGLifetime - -editGoalie :: (Goalie -> Goalie) -> EditGoalieMode -> ProgState -> ProgState -editGoalie f mode s = fromMaybe s $ do - gid <- s^.progMode.editGoalieStateL.egsSelectedGoalie - void $ nth gid $ s^.database.dbGoalies - Just $ s - & database.dbGoalies %~ modifyNth gid f - & progMode.editGoalieStateL.egsMode .~ mode diff --git a/src/Mtlstats/Control/EditGoalie.hs b/src/Mtlstats/Control/EditGoalie.hs index 10fa61a..0db94fd 100644 --- a/src/Mtlstats/Control/EditGoalie.hs +++ b/src/Mtlstats/Control/EditGoalie.hs @@ -46,23 +46,23 @@ selectC = promptController goalieToEditPrompt editC :: EditGoalieMode -> Controller editC = \case - EGMenu -> menuC - EGNumber -> numberC - EGName -> nameC - EGYtd -> ytdMenuC - EGLifetime -> lifetimeMenuC - EGYtdGames -> ytdGamesC - EGYtdMins -> ytdMinsC - EGYtdGoals -> ytdGoalsC - EGYtdWins -> ytdWinsC - EGYtdLosses -> ytdLossesC - EGYtdTies -> ytdTiesC - EGLtGames -> ltGamesC - EGLtMins -> ltMinsC - EGLtGoals -> ltGoalsC - EGLtWins -> ltWinsC - EGLtLosses -> ltLossesC - EGLtTies -> ltTiesC + EGMenu -> menuC + EGNumber -> numberC + EGName -> nameC + EGYtd -> ytdMenuC + EGLifetime -> lifetimeMenuC + EGYtdGames b -> ytdGamesC b + EGYtdMins b -> ytdMinsC b + EGYtdGoals b -> ytdGoalsC b + EGYtdWins b -> ytdWinsC b + EGYtdLosses b -> ytdLossesC b + EGYtdTies -> ytdTiesC + EGLtGames b -> ltGamesC b + EGLtMins b -> ltMinsC b + EGLtGoals b -> ltGoalsC b + EGLtWins b -> ltWinsC b + EGLtLosses b -> ltLossesC b + EGLtTies -> ltTiesC menuC :: Controller menuC = menuControllerWith header editGoalieMenu @@ -79,38 +79,38 @@ ytdMenuC = menuControllerWith header editGoalieYtdMenu lifetimeMenuC :: Controller lifetimeMenuC = menuControllerWith header editGoalieLtMenu -ytdGamesC :: Controller -ytdGamesC = promptController editGoalieYtdGamesPrompt +ytdGamesC :: Bool -> Controller +ytdGamesC = promptController . editGoalieYtdGamesPrompt -ytdMinsC :: Controller -ytdMinsC = promptController editGoalieYtdMinsPrompt +ytdMinsC :: Bool -> Controller +ytdMinsC = promptController . editGoalieYtdMinsPrompt -ytdGoalsC :: Controller -ytdGoalsC = promptController editGoalieYtdGoalsPrompt +ytdGoalsC :: Bool -> Controller +ytdGoalsC = promptController . editGoalieYtdGoalsPrompt -ytdWinsC :: Controller -ytdWinsC = promptController editGoalieYtdWinsPrompt +ytdWinsC :: Bool -> Controller +ytdWinsC = promptController . editGoalieYtdWinsPrompt -ytdLossesC :: Controller -ytdLossesC = promptController editGoalieYtdLossesPrompt +ytdLossesC :: Bool -> Controller +ytdLossesC = promptController . editGoalieYtdLossesPrompt ytdTiesC :: Controller ytdTiesC = promptController editGoalieYtdTiesPrompt -ltGamesC :: Controller -ltGamesC = promptController editGoalieLtGamesPrompt +ltGamesC :: Bool -> Controller +ltGamesC = promptController . editGoalieLtGamesPrompt -ltMinsC :: Controller -ltMinsC = promptController editGoalieLtMinsPrompt +ltMinsC :: Bool -> Controller +ltMinsC = promptController . editGoalieLtMinsPrompt -ltGoalsC :: Controller -ltGoalsC = promptController editGoalieLtGoalsPrompt +ltGoalsC :: Bool -> Controller +ltGoalsC = promptController . editGoalieLtGoalsPrompt -ltWinsC :: Controller -ltWinsC = promptController editGoalieLtWinsPrompt +ltWinsC :: Bool -> Controller +ltWinsC = promptController . editGoalieLtWinsPrompt -ltLossesC :: Controller -ltLossesC = promptController editGoalieLtLossesPrompt +ltLossesC :: Bool -> Controller +ltLossesC = promptController . editGoalieLtLossesPrompt ltTiesC :: Controller ltTiesC = promptController editGoalieLtTiesPrompt diff --git a/src/Mtlstats/Control/EditPlayer.hs b/src/Mtlstats/Control/EditPlayer.hs index 1aeb464..812f971 100644 --- a/src/Mtlstats/Control/EditPlayer.hs +++ b/src/Mtlstats/Control/EditPlayer.hs @@ -38,18 +38,18 @@ editPlayerC :: EditPlayerState -> Controller editPlayerC eps | null $ eps^.epsSelectedPlayer = selectPlayerC | otherwise = case eps^.epsMode of - EPMenu -> menuC - EPNumber -> numberC - EPName -> nameC - EPPosition -> positionC - EPYtd -> ytdC - EPLifetime -> lifetimeC - EPYtdGoals -> ytdGoalsC - EPYtdAssists -> ytdAssistsC - EPYtdPMin -> ytdPMinC - EPLtGoals -> ltGoalsC - EPLtAssists -> ltAssistsC - EPLtPMin -> ltPMinC + EPMenu -> menuC + EPNumber -> numberC + EPName -> nameC + EPPosition -> positionC + EPYtd -> ytdC + EPLifetime -> lifetimeC + EPYtdGoals b -> ytdGoalsC b + EPYtdAssists b -> ytdAssistsC b + EPYtdPMin -> ytdPMinC + EPLtGoals b -> ltGoalsC b + EPLtAssists b -> ltAssistsC b + EPLtPMin -> ltPMinC selectPlayerC :: Controller selectPlayerC = promptController playerToEditPrompt @@ -72,20 +72,20 @@ ytdC = menuControllerWith header editPlayerYtdMenu lifetimeC :: Controller lifetimeC = menuControllerWith header editPlayerLtMenu -ytdGoalsC :: Controller -ytdGoalsC = promptController editPlayerYtdGoalsPrompt +ytdGoalsC :: Bool -> Controller +ytdGoalsC = promptController . editPlayerYtdGoalsPrompt -ytdAssistsC :: Controller -ytdAssistsC = promptController editPlayerYtdAssistsPrompt +ytdAssistsC :: Bool -> Controller +ytdAssistsC = promptController . editPlayerYtdAssistsPrompt ytdPMinC :: Controller ytdPMinC = promptController editPlayerYtdPMinPrompt -ltGoalsC :: Controller -ltGoalsC = promptController editPlayerLtGoalsPrompt +ltGoalsC :: Bool -> Controller +ltGoalsC = promptController . editPlayerLtGoalsPrompt -ltAssistsC :: Controller -ltAssistsC = promptController editPlayerLtAssistsPrompt +ltAssistsC :: Bool -> Controller +ltAssistsC = promptController . editPlayerLtAssistsPrompt ltPMinC :: Controller ltPMinC = promptController editPlayerLtPMinPrompt diff --git a/src/Mtlstats/Menu/EditGoalie.hs b/src/Mtlstats/Menu/EditGoalie.hs index 38e15c3..f9daf1e 100644 --- a/src/Mtlstats/Menu/EditGoalie.hs +++ b/src/Mtlstats/Menu/EditGoalie.hs @@ -51,13 +51,14 @@ editGoalieMenu = Menu "*** EDIT GOALTENDER ***" () $ map editGoalieYtdMenu :: Menu () editGoalieYtdMenu = editMenu "*** EDIT GOALTENDER YEAR-TO-DATE ***" -- key, label, value - [ ( '1', "Edit YTD games", EGYtdGames ) - , ( '2', "Edit YTD minutes", EGYtdMins ) - , ( '3', "Edit YTD goals", EGYtdGoals ) - , ( '4', "Edit YTD wins", EGYtdWins ) - , ( '5', "Edit YTD losses", EGYtdLosses ) - , ( '6', "Edit YTD ties", EGYtdTies ) - , ( 'R', "Return to edit menu", EGMenu ) + [ ( '1', "Edit all YTD stats", EGYtdGames True ) + , ( '2', "Edit YTD games", EGYtdGames False ) + , ( '3', "Edit YTD minutes", EGYtdMins False ) + , ( '4', "Edit YTD goals", EGYtdGoals False ) + , ( '5', "Edit YTD wins", EGYtdWins False ) + , ( '6', "Edit YTD losses", EGYtdLosses False ) + , ( '7', "Edit YTD ties", EGYtdTies ) + , ( 'R', "Return to edit menu", EGMenu ) ] -- | The 'Goalie' lifetime edit menu @@ -65,13 +66,14 @@ editGoalieLtMenu :: Menu () editGoalieLtMenu = editMenu "*** EDIT GOALTENDER LIFETIME ***" -- key, label, value - [ ( '1', "Edit lifetime games", EGLtGames ) - , ( '2', "Edit lifetime minutes", EGLtMins ) - , ( '3', "Edit lifetime goals", EGLtGoals ) - , ( '4', "Edit lifetime wins", EGLtWins ) - , ( '5', "Edit lifetime losses", EGLtLosses ) - , ( '6', "Edit lifetime ties", EGLtTies ) - , ( 'R', "Return to edit menu", EGMenu ) + [ ( '1', "Edit all lifetime stats", EGLtGames True ) + , ( '2', "Edit lifetime games", EGLtGames False ) + , ( '3', "Edit lifetime minutes", EGLtMins False ) + , ( '4', "Edit lifetime goals", EGLtGoals False ) + , ( '5', "Edit lifetime wins", EGLtWins False ) + , ( '6', "Edit lifetime losses", EGLtLosses False ) + , ( '7', "Edit lifetime ties", EGLtTies ) + , ( 'R', "Return to edit menu", EGMenu ) ] editMenu :: String -> [(Char, String, EditGoalieMode)] -> Menu () diff --git a/src/Mtlstats/Menu/EditPlayer.hs b/src/Mtlstats/Menu/EditPlayer.hs index b0a0e0b..2b6312d 100644 --- a/src/Mtlstats/Menu/EditPlayer.hs +++ b/src/Mtlstats/Menu/EditPlayer.hs @@ -53,10 +53,11 @@ editPlayerYtdMenu :: Menu () editPlayerYtdMenu = editMenu "*** EDIT PLAYER YEAR-TO-DATE ***" -- key, label, value - [ ( '1', "Edit YTD goals", EPYtdGoals ) - , ( '2', "Edit YTD assists", EPYtdAssists ) - , ( '3', "Edit YTD penalty mins", EPYtdPMin ) - , ( 'R', "Return to player edit menu", EPMenu ) + [ ( '1', "Edit all YTD stats", EPYtdGoals True ) + , ( '2', "Edit YTD goals", EPYtdGoals False ) + , ( '3', "Edit YTD assists", EPYtdAssists False ) + , ( '4', "Edit YTD penalty mins", EPYtdPMin ) + , ( 'R', "Return to player edit menu", EPMenu ) ] -- | The 'Player' lifetime stats edit menu @@ -64,10 +65,11 @@ editPlayerLtMenu :: Menu () editPlayerLtMenu = editMenu "*** EDIT PLAYER LIFETIME ***" -- key, label, value - [ ( '1', "Edit lifetime goals", EPLtGoals ) - , ( '2', "Edit lifetime assits", EPLtAssists ) - , ( '3', "Edit lifetime penalty mins", EPLtPMin ) - , ( 'R', "Return to edit player menu", EPMenu ) + [ ( '1', "Edit all lifetime stats", EPLtGoals True ) + , ( '2', "Edit lifetime goals", EPLtGoals False ) + , ( '3', "Edit lifetime assits", EPLtAssists False ) + , ( '4', "Edit lifetime penalty mins", EPLtPMin ) + , ( 'R', "Return to edit player menu", EPMenu ) ] editMenu :: String -> [(Char, String, EditPlayerMode)] -> Menu () diff --git a/src/Mtlstats/Prompt.hs b/src/Mtlstats/Prompt.hs index 667d185..068251a 100644 --- a/src/Mtlstats/Prompt.hs +++ b/src/Mtlstats/Prompt.hs @@ -31,6 +31,7 @@ module Mtlstats.Prompt ( ucStrPrompt, namePrompt, numPrompt, + numPromptWithFallback, selectPrompt, -- * Individual prompts playerNumPrompt, @@ -47,7 +48,6 @@ import Control.Monad (when) import Control.Monad.Extra (whenJust) import Control.Monad.Trans.State (gets, modify) import Data.Char (isDigit, toUpper) -import Data.Foldable (forM_) import Lens.Micro ((^.), (&), (.~), (?~), (%~)) import Lens.Micro.Extras (view) import Text.Read (readMaybe) @@ -145,12 +145,25 @@ numPrompt -> (Int -> Action ()) -- ^ The callback function for the result -> Prompt -numPrompt pStr act = Prompt +numPrompt pStr = numPromptWithFallback pStr $ return () + +-- | Builds a numeric prompt with a fallback action +numPromptWithFallback + :: String + -- ^ The prompt string + -> Action () + -- ^ The action to call on invalid (or blank) input + -> (Int -> Action ()) + -- ^ The callback function for the result + -> Prompt +numPromptWithFallback pStr fallback act = Prompt { promptDrawer = drawSimplePrompt pStr , promptProcessChar = \ch str -> if isDigit ch then str ++ [ch] else str - , promptAction = \inStr -> forM_ (readMaybe inStr) act + , promptAction = \inStr -> case readMaybe inStr of + Nothing -> fallback + Just n -> act n , promptSpecialKey = const $ return () } diff --git a/src/Mtlstats/Prompt/EditGoalie.hs b/src/Mtlstats/Prompt/EditGoalie.hs index 44ff8a0..a5da5c6 100644 --- a/src/Mtlstats/Prompt/EditGoalie.hs +++ b/src/Mtlstats/Prompt/EditGoalie.hs @@ -37,12 +37,13 @@ module Mtlstats.Prompt.EditGoalie , editGoalieLtTiesPrompt ) where -import Control.Monad.Trans.State (modify) -import Lens.Micro ((.~)) +import Control.Monad.Extra (whenJustM) +import Control.Monad.Trans.State (gets, modify) +import Lens.Micro ((^.), (.~), (%~)) -import Mtlstats.Actions.EditGoalie import Mtlstats.Prompt import Mtlstats.Types +import Mtlstats.Util -- | Prompt to select a 'Goalie' for editing goalieToEditPrompt :: Prompt @@ -51,70 +52,150 @@ goalieToEditPrompt = selectGoaliePrompt "Goalie to edit: " $ -- | Prompt to edit a goalie's number editGoalieNumberPrompt :: Prompt -editGoalieNumberPrompt = numPrompt "Goalie number: " $ - modify . editGoalieNumber +editGoalieNumberPrompt = editNum "Goalie number: " EGMenu + (gNumber .~) -- | Prompt to edit a goalie's name editGoalieNamePrompt :: Prompt -editGoalieNamePrompt = namePrompt "Goalie name: " $ - modify . editGoalieName +editGoalieNamePrompt = namePrompt "Goalie name: " $ \name -> + if null name + then goto EGMenu + else editGoalie EGMenu $ gName .~ name -- | Prompt to edit a goalie's YTD games played -editGoalieYtdGamesPrompt :: Prompt -editGoalieYtdGamesPrompt = numPrompt "Year-to-date games played: " $ - modify . editGoalieYtdGames +editGoalieYtdGamesPrompt + :: Bool + -- ^ Indicates whether or not we're in batch mode + -> Prompt +editGoalieYtdGamesPrompt batchMode = + editNum "Year-to-date games played: " mode + (gYtd.gsGames .~) + where + mode = if batchMode then EGYtdMins True else EGYtd -- | Prompt to edit a goalie's YTD minutes played -editGoalieYtdMinsPrompt :: Prompt -editGoalieYtdMinsPrompt = numPrompt "Year-to-date minutes played: " $ - modify . editGoalieYtdMins +editGoalieYtdMinsPrompt + :: Bool + -- ^ Indicates whether or not we're in batch mode + -> Prompt +editGoalieYtdMinsPrompt batchMode = + editNum "Year-to-date minutes played: " mode + (gYtd.gsMinsPlayed .~) + where + mode = if batchMode then EGYtdGoals True else EGYtd -- | Prompt to edit a goalie's YTD goales allowed -editGoalieYtdGoalsPrompt :: Prompt -editGoalieYtdGoalsPrompt = numPrompt "Year-to-date goals allowed: " $ - modify . editGoalieYtdGoals +editGoalieYtdGoalsPrompt + :: Bool + -- ^ Indicates whether or not we're in batch mode + -> Prompt +editGoalieYtdGoalsPrompt batchMode = + editNum "Year-to-date goals allowed: " mode + (gYtd.gsGoalsAllowed .~) + where + mode = if batchMode then EGYtdWins True else EGYtd -- | Prompt to edit a goalie's YTD wins -editGoalieYtdWinsPrompt :: Prompt -editGoalieYtdWinsPrompt = numPrompt "Year-to-date wins: " $ - modify . editGoalieYtdWins +editGoalieYtdWinsPrompt + :: Bool + -- ^ Indicates whether or not we're in batch mode + -> Prompt +editGoalieYtdWinsPrompt batchMode = + editNum "Year-to-date wins: " mode + (gYtd.gsWins .~) + where + mode = if batchMode then EGYtdLosses True else EGYtd -- | Prompt to edit a goalie's YTD losses -editGoalieYtdLossesPrompt :: Prompt -editGoalieYtdLossesPrompt = numPrompt "Year-to-date losses: " $ - modify . editGoalieYtdLosses +editGoalieYtdLossesPrompt + :: Bool + -- ^ Indicates whether or not we're in batch mode + -> Prompt +editGoalieYtdLossesPrompt batchMode = + editNum "Year-to-date losses: " mode + (gYtd.gsLosses .~) + where + mode = if batchMode then EGYtdTies else EGYtd -- | Prompt to edit a goalie's YTD ties editGoalieYtdTiesPrompt :: Prompt -editGoalieYtdTiesPrompt = numPrompt "Year-to-date ties: " $ - modify . editGoalieYtdTies +editGoalieYtdTiesPrompt = editNum "Year-to-date ties: " EGYtd + (gYtd.gsTies .~) -- | Prompt to edit a goalie's lifetime games played -editGoalieLtGamesPrompt :: Prompt -editGoalieLtGamesPrompt = numPrompt "Lifetime games played: " $ - modify . editGoalieLtGames +editGoalieLtGamesPrompt + :: Bool + -- ^ Indicates whether or not we're in batch mode + -> Prompt +editGoalieLtGamesPrompt batchMode = + editNum "Lifetime games played: " mode + (gLifetime.gsGames .~) + where + mode = if batchMode then EGLtMins True else EGLifetime -- | Prompt to edit a goalie's lifetime minutes played -editGoalieLtMinsPrompt :: Prompt -editGoalieLtMinsPrompt = numPrompt "Lifetime minutes played: " $ - modify . editGoalieLtMins +editGoalieLtMinsPrompt + :: Bool + -- ^ Indicates whether or not we're in batch mode + -> Prompt +editGoalieLtMinsPrompt batchMode = + editNum "Lifetime minutes played: " mode + (gLifetime.gsMinsPlayed .~) + where + mode = if batchMode then EGLtGoals True else EGLifetime -- | Prompt to edit a goalie's lifetime goals allowed -editGoalieLtGoalsPrompt :: Prompt -editGoalieLtGoalsPrompt = numPrompt "Lifetime goals allowed: " $ - modify . editGoalieLtGoals +editGoalieLtGoalsPrompt + :: Bool + -- ^ Indicates whether or not we're in batch mode + -> Prompt +editGoalieLtGoalsPrompt batchMode = + editNum "Lifetime goals allowed: " mode + (gLifetime.gsGoalsAllowed .~) + where + mode = if batchMode then EGLtWins True else EGLifetime -- | Prompt to edit a goalie's lifetime wins -editGoalieLtWinsPrompt :: Prompt -editGoalieLtWinsPrompt = numPrompt "Lifetime wins: " $ - modify . editGoalieLtWins +editGoalieLtWinsPrompt + :: Bool + -- ^ Indicates whether or not we're in batch mode + -> Prompt +editGoalieLtWinsPrompt batchMode = + editNum "Lifetime wins: " mode + (gLifetime.gsWins .~) + where + mode = if batchMode then EGLtLosses True else EGLifetime -- | Prompt to edit a goalie's lifetime losses -editGoalieLtLossesPrompt :: Prompt -editGoalieLtLossesPrompt = numPrompt "Lifetime losses: " $ - modify . editGoalieLtLosses +editGoalieLtLossesPrompt + :: Bool + -- ^ Indicates whether or not we're in batch mode + -> Prompt +editGoalieLtLossesPrompt batchMode = + editNum "Lifetime losses: " mode + (gLifetime.gsLosses .~) + where + mode = if batchMode then EGLtTies else EGLifetime -- | Prompt to edit a goalie's lifetime ties editGoalieLtTiesPrompt :: Prompt -editGoalieLtTiesPrompt = numPrompt "Lifetime ties: " $ - modify . editGoalieLtTies +editGoalieLtTiesPrompt = editNum "Lifetime ties: " EGLifetime + (gLifetime.gsTies .~) + +editNum + :: String + -> EditGoalieMode + -> (Int -> Goalie -> Goalie) + -> Prompt +editNum pStr mode f = numPromptWithFallback pStr + (goto mode) + (editGoalie mode . f) + +editGoalie :: EditGoalieMode -> (Goalie -> Goalie) -> Action () +editGoalie mode f = + whenJustM (gets (^.progMode.editGoalieStateL.egsSelectedGoalie)) $ \gid -> do + modify $ database.dbGoalies %~ modifyNth gid f + goto mode + +goto :: EditGoalieMode -> Action () +goto = modify . (progMode.editGoalieStateL.egsMode .~) diff --git a/src/Mtlstats/Prompt/EditPlayer.hs b/src/Mtlstats/Prompt/EditPlayer.hs index 8a52f73..91bb734 100644 --- a/src/Mtlstats/Prompt/EditPlayer.hs +++ b/src/Mtlstats/Prompt/EditPlayer.hs @@ -41,52 +41,87 @@ import Mtlstats.Util -- | Prompt to edit a player's number editPlayerNumPrompt :: Prompt -editPlayerNumPrompt = numPrompt "Player number: " $ - editPlayer EPMenu . (pNumber .~) +editPlayerNumPrompt = editNum "Player number: " EPMenu + (pNumber .~) -- | Prompt to edit a player's name editPlayerNamePrompt :: Prompt -editPlayerNamePrompt = namePrompt "Player name: " $ - editPlayer EPMenu . (pName .~) +editPlayerNamePrompt = namePrompt "Player name: " $ \name -> + if null name + then goto EPMenu + else editPlayer EPMenu $ pName .~ name -- | Prompt to edit a player's position editPlayerPosPrompt :: Prompt -editPlayerPosPrompt = ucStrPrompt "Player position: " $ - editPlayer EPMenu . (pPosition .~) +editPlayerPosPrompt = ucStrPrompt "Player position: " $ \pos -> + if null pos + then goto EPMenu + else editPlayer EPMenu $ pPosition .~ pos -- | Prompt to edit a player's year-to-date goals -editPlayerYtdGoalsPrompt :: Prompt -editPlayerYtdGoalsPrompt = numPrompt "Year-to-date goals: " $ - editPlayer EPYtd . (pYtd.psGoals .~) +editPlayerYtdGoalsPrompt + :: Bool + -- ^ Indicates wheter or not we're editing in batch mode + -> Prompt +editPlayerYtdGoalsPrompt batchMode = editNum "Year-to-date goals: " mode + (pYtd.psGoals .~) + where + mode = if batchMode then EPYtdAssists True else EPYtd -- | Prompt to edit a player's year-to-date assists -editPlayerYtdAssistsPrompt :: Prompt -editPlayerYtdAssistsPrompt = numPrompt "Year-to-date assists: " $ - editPlayer EPYtd . (pYtd.psAssists .~) +editPlayerYtdAssistsPrompt + :: Bool + -- ^ Indicates wheter or not we're editing in batch mode + -> Prompt +editPlayerYtdAssistsPrompt batchMode = editNum "Year-to-date assists: " mode + (pYtd.psAssists .~) + where + mode = if batchMode then EPYtdPMin else EPYtd -- | Prompt to edit a player's year-to-date penalty minutes editPlayerYtdPMinPrompt :: Prompt -editPlayerYtdPMinPrompt = numPrompt "Year-to-date penalty minutes: " $ - editPlayer EPYtd . (pYtd.psPMin .~) +editPlayerYtdPMinPrompt = editNum "Year-to-date penalty minutes: " EPYtd + (pYtd.psPMin .~) -- | Prompt to edit a player's lifetime goals -editPlayerLtGoalsPrompt :: Prompt -editPlayerLtGoalsPrompt = numPrompt "Lifetime goals: " $ - editPlayer EPLifetime . (pLifetime.psGoals .~) +editPlayerLtGoalsPrompt + :: Bool + -- ^ Indicates wheter or not we're editing in batch mode + -> Prompt +editPlayerLtGoalsPrompt batchMode = editNum "Lifetime goals: " mode + (pLifetime.psGoals .~) + where + mode = if batchMode then EPLtAssists True else EPLifetime -- | Prompt to edit a player's lifetime assists -editPlayerLtAssistsPrompt :: Prompt -editPlayerLtAssistsPrompt = numPrompt "Lifetime assists: " $ - editPlayer EPLifetime . (pLifetime.psAssists .~) +editPlayerLtAssistsPrompt + :: Bool + -- ^ Indicates wheter or not we're editing in batch mode + -> Prompt +editPlayerLtAssistsPrompt batchMode = editNum "Lifetime assists: " mode + (pLifetime.psAssists .~) + where + mode = if batchMode then EPLtPMin else EPLifetime -- | Prompt to edit a player's lifetime penalty minutes editPlayerLtPMinPrompt :: Prompt -editPlayerLtPMinPrompt = numPrompt "Lifetime penalty minutes: " $ - editPlayer EPLifetime . (pLifetime.psPMin .~) +editPlayerLtPMinPrompt = editNum "Lifetime penalty minutes: " EPLifetime + (pLifetime.psPMin .~) + +editNum + :: String + -> EditPlayerMode + -> (Int -> Player -> Player) + -> Prompt +editNum pStr mode f = numPromptWithFallback pStr + (goto mode) + (editPlayer mode . f) editPlayer :: EditPlayerMode -> (Player -> Player) -> Action () editPlayer mode f = - whenJustM (gets (^.progMode.editPlayerStateL.epsSelectedPlayer)) $ \pid -> - modify - $ (database.dbPlayers %~ modifyNth pid f) - . (progMode.editPlayerStateL.epsMode .~ mode) + whenJustM (gets (^.progMode.editPlayerStateL.epsSelectedPlayer)) $ \pid -> do + modify $ database.dbPlayers %~ modifyNth pid f + goto mode + +goto :: EditPlayerMode -> Action () +goto = modify . (progMode.editPlayerStateL.epsMode .~) diff --git a/src/Mtlstats/Types.hs b/src/Mtlstats/Types.hs index 6c5bc20..62c6098 100644 --- a/src/Mtlstats/Types.hs +++ b/src/Mtlstats/Types.hs @@ -347,11 +347,11 @@ data EditPlayerMode | EPPosition | EPYtd | EPLifetime - | EPYtdGoals - | EPYtdAssists + | EPYtdGoals Bool + | EPYtdAssists Bool | EPYtdPMin - | EPLtGoals - | EPLtAssists + | EPLtGoals Bool + | EPLtAssists Bool | EPLtPMin deriving (Eq, Show) @@ -369,17 +369,17 @@ data EditGoalieMode | EGName | EGYtd | EGLifetime - | EGYtdGames - | EGYtdMins - | EGYtdGoals - | EGYtdWins - | EGYtdLosses + | EGYtdGames Bool + | EGYtdMins Bool + | EGYtdGoals Bool + | EGYtdWins Bool + | EGYtdLosses Bool | EGYtdTies - | EGLtGames - | EGLtMins - | EGLtGoals - | EGLtWins - | EGLtLosses + | EGLtGames Bool + | EGLtMins Bool + | EGLtGoals Bool + | EGLtWins Bool + | EGLtLosses Bool | EGLtTies deriving (Eq, Show) diff --git a/test/Actions/EditGoalieSpec.hs b/test/Actions/EditGoalieSpec.hs deleted file mode 100644 index af8c4bb..0000000 --- a/test/Actions/EditGoalieSpec.hs +++ /dev/null @@ -1,537 +0,0 @@ -{- - -mtlstats -Copyright (C) 2019 Rhéal Lamothe - - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at -your option) any later version. - -This program is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . - --} - -module Actions.EditGoalieSpec (spec) where - -import Data.Maybe (fromJust) -import Lens.Micro ((^.), (&), (.~)) -import Test.Hspec (Spec, context, describe, it, shouldBe) - -import Mtlstats.Actions.EditGoalie -import Mtlstats.Types -import Mtlstats.Util - -spec :: Spec -spec = describe "EditGoalie" $ do - editGoalieNumberSpec - editGoalieNameSpec - editGoalieYtdGamesSpec - editGoalieYtdMinsSpec - editGoalieYtdGoalsSpec - editGoalieYtdWinsSpec - editGoalieYtdLossesSpec - editGoalieYtdTiesSpec - editGoalieLtGamesSpec - editGoalieLtMinsSpec - editGoalieLtGoalsSpec - editGoalieLtWinsSpec - editGoalieLtLossesSpec - editGoalieLtTiesSpec - -editGoalieNumberSpec :: Spec -editGoalieNumberSpec = describe "editGoalieNumber" $ editTest - (editGoalieNumber 5) - EGNumber - (uncurry newGoalie) - [ ( "set Joe" - , Just 0 - , (5, "Joe") - , (3, "Bob") - , EGMenu - ) - , ( "set Bob" - , Just 1 - , (2, "Joe") - , (5, "Bob") - , EGMenu - ) - , ( "out of bounds" - , Just 2 - , (2, "Joe") - , (3, "Bob") - , EGNumber - ) - , ( "no goalie selected" - , Nothing - , (2, "Joe") - , (3, "Bob") - , EGNumber - ) - ] - -editGoalieNameSpec :: Spec -editGoalieNameSpec = describe "editGoalieName" $ editTest - (editGoalieName "foo") - EGName - (uncurry newGoalie) - [ ( "set Joe" - , Just 0 - , ( 2, "foo" ) - , ( 3, "Bob" ) - , EGMenu - ) - , ( "set Bob" - , Just 1 - , ( 2, "Joe" ) - , ( 3, "foo" ) - , EGMenu - ) - , ( "out of bounds" - , Just 2 - , ( 2, "Joe" ) - , ( 3, "Bob" ) - , EGName - ) - , ( "no goalie selected" - , Nothing - , ( 2, "Joe" ) - , ( 3, "Bob" ) - , EGName - ) - ] - -editGoalieYtdGamesSpec :: Spec -editGoalieYtdGamesSpec = describe "editGoalieYtdGames" $ editTest - (editGoalieYtdGames 1) - EGYtdGames - (\(num, name, games) -> newGoalie num name & gYtd.gsGames .~ games) - [ ( "set Joe" - , Just 0 - , ( 2, "Joe", 1 ) - , ( 3, "Bob", 0 ) - , EGYtd - ) - , ( "set Bob" - , Just 1 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 1 ) - , EGYtd - ) - , ( "out of bounds" - , Just 2 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGYtdGames - ) - , ( "no goalie selected" - , Nothing - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGYtdGames - ) - ] - -editGoalieYtdMinsSpec :: Spec -editGoalieYtdMinsSpec = describe "editGoalieYtdMins" $ editTest - (editGoalieYtdMins 1) - EGYtdMins - (\(num, name, mins) -> newGoalie num name & gYtd.gsMinsPlayed .~ mins) - [ ( "set Joe" - , Just 0 - , ( 2, "Joe", 1 ) - , ( 3, "Bob", 0 ) - , EGYtd - ) - , ( "set Bob" - , Just 1 - , (2, "Joe", 0 ) - , (3, "Bob", 1 ) - , EGYtd - ) - , ( "out of bounds" - , Just 2 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGYtdMins - ) - , ( "no goalie selected" - , Nothing - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGYtdMins - ) - ] - -editGoalieYtdGoalsSpec :: Spec -editGoalieYtdGoalsSpec = describe "editGoalieYtdGoals" $ editTest - (editGoalieYtdGoals 1) - EGYtdGoals - (\(num, name, goals) -> newGoalie num name & gYtd.gsGoalsAllowed .~ goals) - [ ( "set Joe" - , Just 0 - , ( 2, "Joe", 1 ) - , ( 3, "Bob", 0 ) - , EGYtd - ) - , ( "set Bob" - , Just 1 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 1 ) - , EGYtd - ) - , ( "out of bounds" - , Just 2 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGYtdGoals - ) - , ( "no goalie selected" - , Nothing - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGYtdGoals - ) - ] - -editGoalieYtdWinsSpec :: Spec -editGoalieYtdWinsSpec = describe "editGoalieYtdWins" $ editTest - (editGoalieYtdWins 1) - EGYtdWins - (\(num, name, wins) -> newGoalie num name & gYtd.gsWins .~ wins) - [ ( "set Joe" - , Just 0 - , ( 2, "Joe", 1 ) - , ( 3, "Bob", 0 ) - , EGYtd - ) - , ( "set Bob" - , Just 1 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 1 ) - , EGYtd - ) - , ( "out of bounds" - , Just 2 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGYtdWins - ) - , ( "no goalie selected" - , Nothing - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGYtdWins - ) - ] - -editGoalieYtdLossesSpec :: Spec -editGoalieYtdLossesSpec = describe "editGoalieYtdLosses" $ editTest - (editGoalieYtdLosses 1) - EGYtdLosses - (\(num, name, losses) -> newGoalie num name & gYtd.gsLosses .~ losses) - [ ( "set Joe" - , Just 0 - , ( 2, "Joe", 1 ) - , ( 3, "Bob", 0 ) - , EGYtd - ) - , ( "set Bob" - , Just 1 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 1 ) - , EGYtd - ) - , ( "out of bounds" - , Just 2 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGYtdLosses - ) - , ( "no goalie selected" - , Nothing - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGYtdLosses - ) - ] - -editGoalieYtdTiesSpec :: Spec -editGoalieYtdTiesSpec = describe "editGoalieYtdTies" $ editTest - (editGoalieYtdTies 1) - EGYtdTies - (\(num, name, ties) -> newGoalie num name & gYtd.gsTies .~ ties) - [ ( "set Joe" - , Just 0 - , ( 2, "Joe", 1 ) - , ( 3, "Bob", 0 ) - , EGYtd - ) - , ( "set Bob" - , Just 1 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 1 ) - , EGYtd - ) - , ( "out of bounds" - , Just 2 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGYtdTies - ) - , ( "no goalie selected" - , Nothing - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGYtdTies - ) - ] - -editGoalieLtGamesSpec :: Spec -editGoalieLtGamesSpec = describe "editGoalieLtGames" $ editTest - (editGoalieLtGames 1) - EGLtGames - (\(num, name, games) -> newGoalie num name & gLifetime.gsGames .~ games) - [ ( "set Joe" - , Just 0 - , ( 2, "Joe", 1 ) - , ( 3, "Bob", 0 ) - , EGLifetime - ) - , ( "set Bob" - , Just 1 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 1 ) - , EGLifetime - ) - , ( "out of bounds" - , Just 2 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGLtGames - ) - , ( "no goalie selected" - , Nothing - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGLtGames - ) - ] - -editGoalieLtMinsSpec :: Spec -editGoalieLtMinsSpec = describe "editGoalieLtMins" $ editTest - (editGoalieLtMins 1) - EGLtMins - (\(num, name, mins) -> newGoalie num name & gLifetime.gsMinsPlayed .~ mins) - [ ( "set Joe" - , Just 0 - , ( 2, "Joe", 1 ) - , ( 3, "Bob", 0 ) - , EGLifetime - ) - , ( "set Bob" - , Just 1 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 1 ) - , EGLifetime - ) - , ( "out of bounds" - , Just 2 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGLtMins - ) - , ( "no goalie selected" - , Nothing - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGLtMins - ) - ] - -editGoalieLtGoalsSpec :: Spec -editGoalieLtGoalsSpec = describe "editGoalieLtGoals" $ editTest - (editGoalieLtGoals 1) - EGLtGoals - (\(num, name, goals) -> newGoalie num name & gLifetime.gsGoalsAllowed .~ goals) - [ ( "set Joe" - , Just 0 - , ( 2, "Joe", 1 ) - , ( 3, "Bob", 0 ) - , EGLifetime - ) - , ( "set Bob" - , Just 1 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 1 ) - , EGLifetime - ) - , ( "out of bounds" - , Just 2 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGLtGoals - ) - , ( "no goalie selected" - , Nothing - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGLtGoals - ) - ] - -editGoalieLtWinsSpec :: Spec -editGoalieLtWinsSpec = describe "editGoalieLtWins" $ editTest - (editGoalieLtWins 1) - EGLtWins - (\(num, name, wins) -> newGoalie num name & gLifetime.gsWins .~ wins) - [ ( "set Joe" - , Just 0 - , ( 2, "Joe", 1 ) - , ( 3, "Bob", 0 ) - , EGLifetime - ) - , ( "set Bob" - , Just 1 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 1 ) - , EGLifetime - ) - , ( "out of bounds" - , Just 2 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGLtWins - ) - , ( "no goalie selected" - , Nothing - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGLtWins - ) - ] - -editGoalieLtLossesSpec :: Spec -editGoalieLtLossesSpec = describe "editGoalieLtLosses" $ editTest - (editGoalieLtLosses 1) - EGLtLosses - (\(num, name, losses) -> newGoalie num name & gLifetime.gsLosses .~ losses) - [ ( "set Joe" - , Just 0 - , ( 2, "Joe", 1 ) - , ( 3, "Bob", 0 ) - , EGLifetime - ) - , ( "set Bob" - , Just 1 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 1 ) - , EGLifetime - ) - , ( "out of bounds" - , Just 2 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGLtLosses - ) - , ( "no goalie selected" - , Nothing - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGLtLosses - ) - ] - -editGoalieLtTiesSpec :: Spec -editGoalieLtTiesSpec = describe "editGoalieLtTies" $ editTest - (editGoalieLtTies 1) - EGLtTies - (\(num, name, ties) -> newGoalie num name & gLifetime.gsTies .~ ties) - [ ( "set Joe" - , Just 0 - , ( 2, "Joe", 1 ) - , ( 3, "Bob", 0 ) - , EGLifetime - ) - , ( "set Bob" - , Just 1 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 1 ) - , EGLifetime - ) - , ( "out of bounds" - , Just 2 - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGLtTies - ) - , ( "no goalie selected" - , Nothing - , ( 2, "Joe", 0 ) - , ( 3, "Bob", 0 ) - , EGLtTies - ) - ] - -editTest - :: (ProgState -> ProgState) - -> EditGoalieMode - -> (a -> Goalie) - -> [(String, Maybe Int, a, a, EditGoalieMode)] - -> Spec -editTest func setMode mkGoalie params = do - mapM_ - (\(setLabel, setGid, joeData, bobData, expectMode) -> context setLabel $ do - let - egs = newEditGoalieState - & egsSelectedGoalie .~ setGid - & egsMode .~ setMode - - ps = func $ progState $ EditGoalie egs - - mapM_ - (\(chkLabel, chkGid, goalieData) -> context chkLabel $ let - actual = fromJust $ nth chkGid $ ps^.database.dbGoalies - expected = mkGoalie goalieData - in it ("should be " ++ show expected) $ - actual `shouldBe` expected) - -- label, goalie ID, goalie data - [ ( "check Joe", 0, joeData ) - , ( "check Bob", 1, bobData ) - ] - - context "check mode" $ - it ("should be " ++ show expectMode) $ - ps^.progMode.editGoalieStateL.egsMode `shouldBe` expectMode) - - params - - context "wrong progMode" $ do - let ps = func $ progState MainMenu - - it "should not change the database" $ - ps^.database `shouldBe` db - - it "should not change the progMode" $ - show (ps^.progMode) `shouldBe` "MainMenu" - -joe :: Goalie -joe = newGoalie 2 "Joe" - -bob :: Goalie -bob = newGoalie 3 "Bob" - -db :: Database -db = newDatabase & dbGoalies .~ [joe, bob] - -progState :: ProgMode -> ProgState -progState mode = newProgState - & progMode .~ mode - & database .~ db diff --git a/test/ActionsSpec.hs b/test/ActionsSpec.hs index 0f6e1d9..d29fd6a 100644 --- a/test/ActionsSpec.hs +++ b/test/ActionsSpec.hs @@ -38,7 +38,6 @@ import Test.Hspec import Mtlstats.Actions import Mtlstats.Types -import qualified Actions.EditGoalieSpec as EditGoalie import qualified Actions.NewGameSpec as NewGame import qualified TypesSpec as TS @@ -63,7 +62,6 @@ spec = describe "Mtlstats.Actions" $ do scrollUpSpec scrollDownSpec NewGame.spec - EditGoalie.spec startNewSeasonSpec :: Spec startNewSeasonSpec = describe "startNewSeason" $ do