module Hint.Eval where import Control.Applicative ((<|>)) import qualified Data.Map as M import Hint.Parser (Value (..)) type Ident = String type Env = M.Map Ident Value data Scope = Scope { env :: [Env] } deriving (Show, Eq) defaultEnv :: Env defaultEnv = M.fromList [("pi", VInt 3), ("version", VString "0.1")] basic :: Scope basic = Scope (pure defaultEnv) next :: Env next = M.fromList [("ident", VInt 12), ("pi", VInt 4)] enter :: Scope -> Env -> Scope enter (Scope es) e = Scope (e : es) leave :: Scope -> Scope leave (Scope [] ) = error "bad" leave (Scope (_ : es)) = Scope es scopeLookup :: Ident -> Scope -> Maybe Value scopeLookup _ (Scope []) = Nothing scopeLookup i (Scope (e : es)) = M.lookup i e <|> scopeLookup i (Scope es)