aboutsummaryrefslogtreecommitdiff
path: root/src/Haskell/Env.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Haskell/Env.hs')
-rw-r--r--src/Haskell/Env.hs29
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"