CSPM-Interpreter-0.1.0.0: src/CSPM/Interpreter/Bindings.hs
----------------------------------------------------------------------------
-- |
-- Module : CSPM.Interpreter.Bindings
-- Copyright : (c) Fontaine 2008
-- License : BSD
--
-- Maintainer : Fontaine@cs.uni-duesseldorf.de
-- Stability : experimental
-- Portability : GHC-only
--
----------------------------------------------------------------------------
module CSPM.Interpreter.Bindings
where
import CSPM.Interpreter.Types
import Language.CSPM.AST hiding (Bindings)
import Control.Exception
import Control.Monad.Reader
import Data.IntMap as IntMap
import Data.List as List
lookupIdent :: LIdent -> EM Value
lookupIdent i = do
b <- getEnv
let binds = case bindType $ unUIdent $ unLabel i of
LetBound -> getLetBindings b
NotLetBound -> getArgBindings b
case (IntMap.lookup (identId i) binds) of
Just v -> return v
Nothing -> throw $ InternalError ("Bindings lookup failure :" ++ show i) Nothing Nothing
bindIdent :: LIdent -> Value -> Bindings -> Bindings
bindIdent key value bind = IntMap.insert (identId key) value bind
emptyBindings :: Bindings
emptyBindings = IntMap.empty
lookupAllChannels :: EM [Channel]
lookupAllChannels = do
letBinds <- liftM getLetBindings getEnv
return $ List.map getChannel $ List.filter isChannelField
$ IntMap.elems letBinds