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 -- FIXME Parse group by using @topic syntax -- TODO Display number of issues within one group -- -- ``` -- Issue D -- Issue E -- -- @topic tags (2 issues) -- Issue A -- Issue B @topic ids -- -- @topic ids (2 issues) -- Issue B @topic tags -- Issue C -- ``` -- 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.strOption ( O.long "group-by" <> O.metavar "TAG" <> O.help "Group selected issues." ) ) 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)