module DDC.Core.Module.Name
( ModuleName (..)
, readModuleName
, isMainModuleName
, QualName (..))
where
import Data.Typeable
import Control.DeepSeq
data ModuleName
= ModuleName [String]
deriving (Show, Eq, Ord, Typeable)
instance NFData ModuleName where
rnf (ModuleName ss)
= rnf ss
readModuleName :: String -> Maybe ModuleName
readModuleName [] = Nothing
readModuleName str
= Just $ ModuleName $ go str
where
go s
| elem '.' s
, (n, '.' : rest) <- span (/= '.') s
= n : go rest
| otherwise
= [s]
isMainModuleName :: ModuleName -> Bool
isMainModuleName mn
= case mn of
ModuleName ["Main"] -> True
_ -> False
data QualName n
= QualName ModuleName n
deriving Show
instance NFData n => NFData (QualName n) where
rnf (QualName mn n)
= rnf mn `seq` rnf n