uni-util-2.2.0.0: Util/NameMangle.hs
-- | Module for generating unique names which correspond to given names
-- (of type ref).
module Util.NameMangle(
NameMangler,
newNameMangler, -- :: IO (NameMangler ref)
MangledName, -- synonym for String. MangledNames are generated by
-- UniqueString.
newMangledName, -- :: NameMangler ref -> ref -> IO MangledName
readMangledName, -- :: NameMangler ref -> MangledName -> IO ref
) where
import Util.Registry
import Util.UniqueString
-- ---------------------------------------------------------------------
-- Data types
-- ---------------------------------------------------------------------
type MangledName = String
-- | For now we just do this naively, with a Registry. Since the names are
-- generated sequentially a dynamic array would be more efficient, perhaps.
data NameMangler ref = NameMangler {
nameSource :: UniqueStringSource,
fromMangledName :: Registry MangledName ref
}
-- ---------------------------------------------------------------------
-- Functions
-- ---------------------------------------------------------------------
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