module Haskell.Env where import Control.Monad import qualified Data.Map.Strict as Map import Haskell.AST data Env = Env { eDefs :: Map.Map Name Expr } deriving (Show) emptyEnv :: Env emptyEnv = Env Map.empty envFromAST :: AST -> Either String Env envFromAST = addAST emptyEnv addAST :: Env -> AST -> Either String Env addAST env (AST tops) = foldM addTop env tops addTop :: Env -> Toplevel -> Either String Env addTop env (TopDef (Def n ex)) = Right $ env { eDefs = Map.insert n ex (eDefs env) } addTop _ _ = Left "Only plain top-level definitions supported for the moment" forget :: Name -> Env -> Either String Env forget name env = if Map.member name (eDefs env) then Right $ env { eDefs = Map.delete name (eDefs env) } else Left $ "Name '" ++ name ++ "' not found in environment"