diff options
Diffstat (limited to 'src/Haskell/Env.hs')
-rw-r--r-- | src/Haskell/Env.hs | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/Haskell/Env.hs b/src/Haskell/Env.hs new file mode 100644 index 0000000..21b2d4b --- /dev/null +++ b/src/Haskell/Env.hs @@ -0,0 +1,29 @@ +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" |