module Env where import qualified Code import Control.Monad.IO.Class import Control.Monad.Trans.State.Lazy import qualified IR import qualified Operators import System.Console.Haskeline data PrlgState = PrlgState { defs :: Code.Defs , ops :: Operators.Ops , strtable :: IR.StrTable } deriving (Show) type PrlgEnv a = StateT PrlgState (InputT IO) a withStrTable :: (IR.StrTable -> (IR.StrTable, a)) -> PrlgEnv a withStrTable f = do st <- gets strtable let (st', x) = f st modify (\s -> s {strtable = st'}) return x findStruct :: String -> Int -> PrlgEnv IR.Id findStruct str arity = do stri <- findAtom str return IR.Id {IR.str = stri, IR.arity = arity} findAtom :: String -> PrlgEnv Int findAtom = withStrTable . flip IR.strtablize