compilation-0.0.0.3: Control/Compilation/Fresh.hs
----------------------------------------------------------------
--
-- | Compilation
-- Monad and combinators for quickly assembling simple
-- compilers.
--
-- @Control\/Compilation\/Fresh.hs@
--
-- State extension class and combinators for implementations
-- of a state that support generation of fresh (i.e., unique)
-- values (integers and strings).
--
----------------------------------------------------------------
--
{-# LANGUAGE TypeSynonymInstances #-}
module Control.Compilation.Fresh
where
import Control.Compilation
----------------------------------------------------------------
-- | Type synonyms and class memberships.
type FreshIndex = Integer
type StateExtensionFresh = FreshIndex
instance StateExtension StateExtensionFresh where
initial = 0
----------------------------------------------------------------
-- | State extension class definition, including combinators
-- and convenient synonyms.
class StateExtension a => HasFresh a where
project :: a -> StateExtensionFresh
inject :: StateExtensionFresh -> a -> a
freshInteger :: Compilation a Integer
freshInteger =
do s <- get
i <- return $ project s
set $ inject (i+1) s
return $ i
freshString :: Compilation a String
freshString =
do i <- freshInteger
return $ show i
freshStringWithPrefix :: String -> Compilation a String
freshStringWithPrefix prefix =
do s <- freshString
return $ prefix ++ s
freshWithPrefix :: String -> Compilation a String
freshWithPrefix = freshStringWithPrefix
fresh :: Compilation a String
fresh = freshString
fresh_ :: String -> Compilation a String
fresh_ = freshStringWithPrefix
freshes :: Integer -> Compilation a [String]
freshes i =
do ns <- mapM (\_ -> fresh) [0..i-1]
return $ [show n | n <- ns]
freshes_ :: String -> Integer -> Compilation a [String]
freshes_ prefix i =
do ns <- mapM (\_ -> fresh) [0..i-1]
return $ [prefix ++ show n | n <- ns]
--eof