module Util.NameMangle(
NameMangler,
newNameMangler,
MangledName,
newMangledName,
readMangledName,
) where
import Util.Registry
import Util.UniqueString
type MangledName = String
data NameMangler ref = NameMangler {
nameSource :: UniqueStringSource,
fromMangledName :: Registry MangledName ref
}
newNameMangler :: IO (NameMangler ref)
newNameMangler =
do
nameSource <- newUniqueStringSource
fromMangledName <- newRegistry
return (NameMangler {nameSource = nameSource,
fromMangledName = fromMangledName})
newMangledName :: NameMangler ref -> ref -> IO MangledName
newMangledName (NameMangler {nameSource = nameSource,
fromMangledName = fromMangledName}) str =
do
name <- newUniqueString nameSource
setValue fromMangledName name str
return name
readMangledName :: NameMangler ref -> MangledName -> IO ref
readMangledName (NameMangler {fromMangledName = fromMangledName}) name =
do
refOpt <- getValueOpt fromMangledName name
case refOpt of
Nothing -> error ("NameMangle: couldn't retrieve "++name)
Just ref -> return ref