aboutsummaryrefslogtreecommitdiff
path: root/src/Haskell/Env.hs
blob: 21b2d4b2425408cf55eb41d3a399bc42981e9781 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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"