cao-0.1: src/Language/CAO/Common/Name.hs
{-
Module : $Header$
Description : Variable names
Copyright : (c) SMART Team / HASLab
License : GPL
Maintainer : Paulo Silva <paufil@di.uminho.pt>
Stability : experimental
Portability : non-portable (<reason>)
Variables
-}
module Language.CAO.Common.Name
(
-- * Names
Name
, NameSpace
, IsName (..)
--, hashName
, nameStr
, setNameStr
, getNS
, mkName
, prefix
-- * Constructing Names
, mkVarName, mkFunName, mkTvName
, mkPolIndName, mkStructFldName
, isVarName, isFunName, isTvName
, isPolIndName, isStructFldName
) where
import Language.CAO.Common.Outputable
-- | A Name appearing in CAO code
--
data Name = Name !NameSpace
!String
deriving (Show, Read)
class IsName a where
varName :: a -> Name
instance IsName Name where
varName = id
mkName :: NameSpace -> String -> Name
mkName = Name
nameStr :: Name -> String
nameStr (Name _ s) = s
setNameStr :: String -> Name -> Name
setNameStr s (Name ns _) = Name ns s
prefix :: String -> Name -> Name
prefix s (Name ns s1) = Name ns (s ++ s1)
getNS :: Name -> NameSpace
getNS (Name ns _) = ns
instance Eq Name where
Name _ s1 == Name _ s2 = s1 == s2
instance Ord Name where
compare (Name _ s1) (Name _ s2) = s1 `compare` s2
instance PP Name where
ppr (Name sp n) = text n
<> ifPprDebug (text "##Kind=" <> text (show sp))
-- | NameSpace for different kinds of 'Name'
--
data NameSpace
= Variable -- ^ CAO variable names
| StructFld -- ^ Struct fields
| FunName -- ^ Function names
| PolInd -- ^ Polynomial ind
| TvName -- ^ Type synonyms or structs
deriving (Eq, Ord, Show, Read)
mkVarName :: String -> Name
mkVarName = Name Variable
mkFunName :: String -> Name
mkFunName = Name FunName
mkTvName :: String -> Name
mkTvName = Name TvName
mkPolIndName :: String -> Name
mkPolIndName = Name PolInd
mkStructFldName :: String -> Name
mkStructFldName = Name StructFld
isVarName, isStructFldName, isPolIndName
, isTvName , isFunName :: Name -> Bool
isVarName (Name Variable _) = True
isVarName _ = False
isFunName (Name FunName _) = True
isFunName _ = False
isTvName (Name TvName _) = True
isTvName _ = False
isPolIndName (Name PolInd _) = True
isPolIndName _ = False
isStructFldName (Name StructFld _) = True
isStructFldName _ = False