module UHC.Util.Nm
where
import Data.Maybe
import Data.Char
import Data.List
import UHC.Util.Pretty
import UHC.Util.FPath(FPATH(mkFPath))
import UHC.Util.Utils
data Nm' s
= NmEmp
| Nm { nmStr :: s }
| NmSel { nmNm :: Nm' s
, nmMbSel :: Maybe s
}
| NmQual { nmNm :: Nm' s
, nmQual :: s
}
deriving (Eq,Ord)
type Nm = Nm' String
nmSelSep, nmQualSep :: String
nmSelSep = "."
nmQualSep = "_"
nmBase' :: Nm -> String
nmBase' (NmSel n _) = nmBase' n
nmBase' (Nm s) = s
nmBase' NmEmp = ""
nmBase :: Nm -> Nm
nmBase = Nm . nmBase'
nmSetSuff :: Nm -> String -> Nm
nmSetSuff n s = NmSel (nmBase n) (Just s)
nmSetBase :: Nm -> String -> Nm
nmSetBase n s
= nmFromMbL (Just s:nL)
where (_:nL) = nmToMbL n
nmSetSel :: Nm' s -> s -> Nm' s
nmSetSel n s = NmSel n (Just s)
nmSel :: Nm -> String
nmSel = maybe "" id . nmMbSel
nmInit :: Nm -> Nm
nmInit (NmSel n _) = n
nmInit n = n
nmToMbL :: Nm' s -> [Maybe s]
nmToMbL
= reverse . ns
where ns (NmSel n s) = s : ns n
ns (Nm s) = [Just s]
ns NmEmp = []
nmToL :: Nm -> [String]
nmToL = map (maybe "" id) . nmToMbL
nmFromMbL :: [Maybe s] -> Nm' s
nmFromMbL
= n . reverse
where n [Just s] = Nm s
n (s:ss) = NmSel (n ss) s
n [] = NmEmp
nmFromL :: [s] -> Nm' s
nmFromL = nmFromMbL . map Just
nmApd :: Nm' s -> Nm' s -> Nm' s
nmApd n1 n2
= nmFromMbL (l1 ++ l2)
where l1 = nmToMbL n1
l2 = nmToMbL n2
nmApdL :: [Nm' s] -> Nm' s
nmApdL
= nmFromMbL . concat . map nmToMbL
nmStrApd :: Nm -> Nm -> Nm
nmStrApd n1 n2
= Nm (s1 ++ s2)
where s1 = show n1
s2 = show n2
nmCapitalize :: Nm -> Nm
nmCapitalize n
= case nmToMbL n of
(Just s:ns) -> nmFromMbL (Just (strCapitalize s) : ns)
_ -> n
nmDashed :: Nm -> Nm
nmDashed = Nm . map (\c -> if isAlphaNum c then c else '-') . show
nmFlatten :: Nm -> Nm
nmFlatten = Nm . show
nmShow' :: String -> Nm -> String
nmShow' sep = concat . intersperse sep . nmToL
nmShowAG :: Nm -> String
nmShowAG = nmShow' "_"
instance Show Nm where
show = nmShow' nmSelSep
instance PP Nm where
pp = ppListSep "" "" nmSelSep . nmToL
instance Functor Nm' where
fmap f NmEmp = NmEmp
fmap f (Nm s) = Nm (f s)
fmap f (NmSel n ms) = NmSel (fmap f n) (fmap f ms)
fmap f (NmQual n s) = NmQual (fmap f n) ( f s)
class NM a where
mkNm :: a -> Nm
instance NM Nm where
mkNm = id
instance NM String where
mkNm s = nmFromL [s]
instance NM Int where
mkNm = mkNm . show
instance FPATH Nm where
mkFPath = mkFPath . show