summaryrefslogtreecommitdiff
path: root/src/Hint/Eval.hs
blob: 48f7b46393096f64423661a583b1eba10640e225 (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
30
31
32
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)