rest-gen-0.13: src/Rest/Gen/Types.hs
module Rest.Gen.Types
( ModuleName (..)
, overModuleName
, Import (..)
, Qualification (..)
, QName (..)
, Name (..)
) where
import Data.List
import Code.Build
newtype ModuleName = ModuleName { unModuleName :: String }
deriving (Eq, Show)
instance Codeable ModuleName where
code = code . unModuleName
overModuleName :: (String -> String) -> ModuleName -> ModuleName
overModuleName f = ModuleName . f . unModuleName
newtype Name = Name { unName :: String }
instance Codeable Name where
code = code . unName
data QName
= Qual ModuleName Name
| UnQual Name
instance Codeable QName where
code (UnQual n) = code n
code (Qual m n) = code m <+> "." <+> code n
data Qualification = Qualified | UnQualified
instance Codeable Qualification where
code Qualified = code "qualified"
code UnQualified = code ""
data Import
= Import Qualification ModuleName (Maybe ModuleName) (Maybe [QName])
instance Codeable Import where
code i = case i of
Import q m mas ids
-> "import"
<++> q
<++> m
<++> qualAs
<++> maybe (code "") (\v -> "(" <+> impList v <+> ")") ids
where
qualAs = case mas of
Just as
| as == m -> code ""
| otherwise -> "as" <++> as
Nothing -> code ""
impList :: [QName] -> Code
impList = foldl' (<++>) (code "") . intersperse (code ",") . map code