diff options
author | Alexander Foremny <aforemny@posteo.de> | 2023-11-09 15:43:28 +0100 |
---|---|---|
committer | Alexander Foremny <aforemny@posteo.de> | 2023-11-09 15:47:28 +0100 |
commit | a37d3605e40b5c9c125568045e0fb99e9796fe49 (patch) | |
tree | d2a16285cd3724580e2db5f5d04b8f217b4ac873 /app/Issue/Group.hs | |
parent | 12511580c732895e8c5d045e18803a766ed733b8 (diff) |
group-by -> group
Diffstat (limited to 'app/Issue/Group.hs')
-rw-r--r-- | app/Issue/Group.hs | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/app/Issue/Group.hs b/app/Issue/Group.hs new file mode 100644 index 0000000..69caf20 --- /dev/null +++ b/app/Issue/Group.hs @@ -0,0 +1,47 @@ +module Issue.Group + ( groupArg, + 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 + +groupArg :: O.Parser (Maybe T.Text) +groupArg = + O.optional + ( O.option + (O.maybeReader (parse . T.pack)) + ( O.long "group" + <> 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 group issues = + foldl + ( \collected issue -> + foldl + (flip $ M.alter (Just . maybe [issue] (issue :))) + collected + (groupsOfIssue group issue) + ) + M.empty + issues + +groupsOfIssue :: T.Text -> Issue -> [T.Text] +groupsOfIssue group issue = + mapMaybe I.tagValue + . filter (\(Tag key _) -> key == group) + $ issue.tags ++ issue.internalTags |