module Control.Compilation.Environment
where
import Control.Compilation
type StateExtensionEnv a = [(String, a)]
instance StateExtension (StateExtensionEnv a) where
initial = []
class StateExtension a => HasEnvironment a b where
project :: a -> StateExtensionEnv b
inject :: StateExtensionEnv b -> a -> a
addEnv :: String -> b -> Compilation a ()
addEnv v x =
do s :: a <- get
env :: StateExtensionEnv b <- return $ project s
set $ inject ((v,x):env) s
popEnv :: Compilation a ()
popEnv =
do s :: a <- get
env :: StateExtensionEnv b <- return $ project s
set $ inject (tail env) s
dropEnv :: Int -> Compilation a ()
dropEnv n =
do s :: a <- get
env :: StateExtensionEnv b <- return $ project s
set $ inject (drop n env) s
lookupEnv :: String -> Compilation a (Maybe b)
lookupEnv v =
do s :: a <- get
env :: StateExtensionEnv b <- return $ project s
return $ lookup v env
setEnv :: StateExtensionEnv b -> Compilation a ()
setEnv env =
do s :: a <- get
set $ inject env s
getEnv :: Compilation a (StateExtensionEnv b)
getEnv =
do s :: a <- get
env :: StateExtensionEnv b <- return $ project s
return $ env
--eof