prlg/app/Env.hs

26 lines
643 B
Haskell

module Env where
import Code (Interp(..), InterpFn, PrlgEnv)
import Control.Monad.Trans.State.Lazy (gets, modify)
import qualified IR
withStrTable :: (IR.StrTable -> (IR.StrTable, a)) -> Env.PrlgEnv a
withStrTable f = do
st <- gets strtable
let (st', x) = f st
modify (\s -> s {strtable = st'})
return x
findStruct :: String -> Int -> Env.PrlgEnv IR.Id
findStruct str arity = do
stri <- findAtom str
return IR.Id {IR.str = stri, IR.arity = arity}
findAtom :: String -> Env.PrlgEnv Int
findAtom = withStrTable . flip IR.strtablize
type PrlgEnv a = Code.PrlgEnv a
prlgError :: String -> InterpFn
prlgError = pure . pure . Left