packages feed

mdoc-0.2.0.0: src/Mdoc/Data/Flag.hs

-- |
--
-- Module      : Mdoc.Data.Flag
-- Copyright   : (c) 2026 Patrick Brisbin
-- License     : AGPL-3
-- Maintainer  : pbrisbin@gmail.com
-- Stability   : experimental
-- Portability : POSIX
module Mdoc.Data.Flag
  ( Flag (..)
  , Flag1 (..)
  , mapFlag
  , mapFlag1
  , getShort
  , getLong
  ) where

import Mdoc.Prelude

import Data.Text qualified as T
import Mdoc.Pretty

data Flag
  = Flag Char [Flag]
  | GNUFlag String [Flag]
  deriving stock (Eq, Show)

instance Pretty Flag where
  pretty =
    mconcat
      . punctuate " , "
      . mapFlag shortSwitch longSwitch

newtype Flag1 = Flag1
  { unwrap :: Flag
  }

instance Pretty Flag1 where
  pretty = mapFlag1 shortSwitch longSwitch . (.unwrap)

shortSwitch :: Char -> Doc ann
shortSwitch c = "Fl" <+> pretty (esc $ T.singleton c)

longSwitch :: String -> Doc ann
longSwitch s = "Fl Fl" <+> pretty (esc $ pack s)

mapFlag :: (Char -> a) -> (String -> a) -> Flag -> [a]
mapFlag fShort fLong = go
 where
  go = \case
    Flag c as -> fShort c : mconcat (map go as)
    GNUFlag s as -> fLong s : mconcat (map go as)

mapFlag1 :: (Char -> a) -> (String -> a) -> Flag -> a
mapFlag1 fShort fLong = \case
  Flag c _ -> fShort c
  GNUFlag s _ -> fLong s

getShort :: Flag -> Maybe Char
getShort flag = case flag of
  Flag c _ -> Just c
  _ -> Nothing

getLong :: Flag -> Maybe String
getLong flag = case flag of
  Flag {} -> Nothing
  GNUFlag s _ -> Just s