module Data.Model.Env(State,Env,withEnv,enterCtx,addDef,closeCtx) where
import Control.Monad.Trans.State.Lazy
import Data.Bifunctor
import qualified Data.Map as M
import Data.Model.Types
data Env = Env {ctx::[QualName]
,env::HTypeEnv
} deriving Show
withEnv :: State Env HType -> HTypeModel
withEnv m = (\(t,e) -> TypeModel (unVar <$> t) e) . second env $ runState m (Env [] M.empty)
enterCtx :: QualName -> State Env Bool
enterCtx name = do
f <- inCtx name
modify (\e -> e {ctx = name : ctx e})
return f
inCtx :: QualName -> State Env Bool
inCtx name = (name `elem`) <$> gets (\e -> ctx e ++ M.keys (env e))
addDef :: QualName -> HADT -> State Env ()
addDef ref adt = modify (\e -> e {env = M.insert ref adt (env e)})
closeCtx :: State Env ()
closeCtx = modify (\e -> e {ctx = drop 1 (ctx e)})