diff --git a/src/Mtlstats/Prompt.hs b/src/Mtlstats/Prompt.hs index 47e65b1..d02ccb0 100644 --- a/src/Mtlstats/Prompt.hs +++ b/src/Mtlstats/Prompt.hs @@ -43,6 +43,7 @@ module Mtlstats.Prompt ( goalieNumPrompt, goalieNamePrompt, selectPlayerPrompt, + selectActivePlayerPrompt, selectGoaliePrompt, selectPositionPrompt, playerToEditPrompt @@ -263,18 +264,21 @@ goalieNamePrompt :: Prompt goalieNamePrompt = namePrompt "Goalie name: " $ modify . (progMode.createGoalieStateL.cgsName .~) --- | Selects a player (creating one if necessary) -selectPlayerPrompt - :: String +-- | Selects a player using a specified search function (creating the +-- player if necessary) +selectPlayerPromptWith + :: (String -> [Player] -> [(Int, Player)]) + -- ^ The search function + -> String -- ^ The prompt string -> (Maybe Int -> Action ()) -- ^ The callback to run (takes the index number of the payer as -- input) -> Prompt -selectPlayerPrompt pStr callback = selectPrompt SelectParams +selectPlayerPromptWith sFunc pStr callback = selectPrompt SelectParams { spPrompt = pStr , spSearchHeader = "Player select:" - , spSearch = \sStr db -> playerSearch sStr (db^.dbPlayers) + , spSearch = \sStr db -> sFunc sStr (db^.dbPlayers) , spSearchExact = \sStr db -> fst <$> playerSearchExact sStr (db^.dbPlayers) , spElemDesc = playerSummary , spProcessChar = capitalizeName @@ -292,6 +296,26 @@ selectPlayerPrompt pStr callback = selectPrompt SelectParams modify $ progMode .~ CreatePlayer cps } +-- | Selects a player (creating one if necessary) +selectPlayerPrompt + :: String + -- ^ The prompt string + -> (Maybe Int -> Action ()) + -- ^ The callback to run (takes the index number of the payer as + -- input) + -> Prompt +selectPlayerPrompt = selectPlayerPromptWith playerSearch + +-- | Selects an active player (creating one if necessary) +selectActivePlayerPrompt + :: String + -- ^ The prompt string + -> (Maybe Int -> Action ()) + -- ^ The callback to run (takes the index number of the payer as + -- input) + -> Prompt +selectActivePlayerPrompt = selectPlayerPromptWith activePlayerSearch + -- | Selects a goalie (creating one if necessary) selectGoaliePrompt :: String diff --git a/src/Mtlstats/Types.hs b/src/Mtlstats/Types.hs index b64f46a..1bee699 100644 --- a/src/Mtlstats/Types.hs +++ b/src/Mtlstats/Types.hs @@ -176,6 +176,7 @@ module Mtlstats.Types ( addGameStats, -- ** Player Helpers playerSearch, + activePlayerSearch, playerSearchExact, modifyPlayer, playerSummary, @@ -1003,6 +1004,23 @@ addGameStats s1 s2 = GameStats , _gmsGoalsAgainst = s1^.gmsGoalsAgainst + s2^.gmsGoalsAgainst } +-- | Searches through a list of players with a specified criteria +playerSearchWith + :: (Player -> Bool) + -- ^ The search criteria + -> String + -- ^ The search string + -> [Player] + -- ^ The list of players to search + -> [(Int, Player)] + -- ^ The matching players with their index numbers +playerSearchWith criteria sStr = + filter match . zip [0..] + where + match (_, p) + = map toUpper sStr `isInfixOf` map toUpper (p^.pName) + && criteria p + -- | Searches through a list of players playerSearch :: String @@ -1011,9 +1029,17 @@ playerSearch -- ^ The list of players to search -> [(Int, Player)] -- ^ The matching players with their index numbers -playerSearch sStr = - filter match . zip [0..] - where match (_, p) = map toUpper sStr `isInfixOf` map toUpper (p^.pName) +playerSearch = playerSearchWith $ const True + +-- | Searches through a list of players for an active player +activePlayerSearch + :: String + -- ^ The search string + -> [Player] + -- ^ The list of players to search + -> [(Int, Player)] + -- ^ The matching players with their index numbers +activePlayerSearch = playerSearchWith (^.pActive) -- | Searches for a player by exact match on name playerSearchExact diff --git a/test/TypesSpec.hs b/test/TypesSpec.hs index d88de00..1104e51 100644 --- a/test/TypesSpec.hs +++ b/test/TypesSpec.hs @@ -73,6 +73,7 @@ spec = describe "Mtlstats.Types" $ do gmsPointsSpec addGameStatsSpec playerSearchSpec + activePlayerSearchSpec playerSearchExactSpec modifyPlayerSpec playerSummarySpec @@ -647,6 +648,19 @@ playerSearchSpec = describe "playerSearch" $ mapM_ , ( "x", [] ) ] +activePlayerSearchSpec :: Spec +activePlayerSearchSpec = describe "activePlayerSearch" $ mapM_ + (\(sStr, expected) -> context sStr $ + it ("should return " ++ show expected) $ let + ps = [joe, bob, steve & pActive .~ False] + in activePlayerSearch sStr ps `shouldBe` expected) + -- search, result + [ ( "joe", [(0, joe)] ) + , ( "o", [(0, joe), (1, bob)] ) + , ( "e", [(0, joe)] ) + , ( "x", [] ) + ] + playerSearchExactSpec :: Spec playerSearchExactSpec = describe "playerSearchExact" $ mapM_ (\(sStr, expected) -> context sStr $