aboutsummaryrefslogtreecommitdiffstats
path: root/app/Issue/Group.hs
blob: 69caf20a3c76579b2267ff5522e5d50d7276c37c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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