module Issue.GroupBy ( groupByArg, groupIssuesBy, ) where import Data.Map (Map) import Data.Map qualified as M import Data.Maybe (mapMaybe) import Data.Text qualified as T import Issue (Issue (..)) import Issue.Tag (Tag (..)) import Issue.Tag qualified as I import Options.Applicative qualified as O -- TODO Add issues marker as internal tags -- -- The internal makers `TODO`, `FIXME`, etc. should be available via the -- internal tag @type -- TODO Add author and editor as internal tags groupByArg :: O.Parser (Maybe T.Text) groupByArg = O.optional ( O.option (O.maybeReader (parse . T.pack)) ( O.long "group-by" <> O.metavar "TAG" <> O.help "Group selected issues." ) ) where parse s | "@" `T.isPrefixOf` s = Just (T.drop 1 s) | otherwise = Nothing groupIssuesBy :: T.Text -> [Issue] -> Map T.Text [Issue] groupIssuesBy groupBy issues = foldl ( \collected issue -> foldl (flip $ M.alter (Just . maybe [issue] (issue :))) collected (groupsOfIssue groupBy issue) ) M.empty issues where groupsOfIssue group issue = mapMaybe I.tagValue $ filter (\(Tag key _) -> key == group) (issue.tags ++ issue.internalTags)