module Stg.Machine.Env (
addLocals,
makeLocals,
val,
vals,
localVal,
NotInScope(..),
globalVal,
) where
import Control.Applicative
import qualified Data.Map as M
import Data.Monoid
import Stg.Language
import Stg.Machine.Types
import Stg.Util
addLocals :: [Mapping Var Value] -> Locals -> Locals
addLocals defs locals = makeLocals defs <> locals
makeLocals :: [Mapping Var Value] -> Locals
makeLocals = Locals . M.fromList . map (\(Mapping k v) -> (k,v))
val :: Locals -> Globals -> Atom -> Validate NotInScope Value
val _lcl _gbl (AtomLit (Literal k)) = Success (PrimInt k)
val (Locals locals) (Globals globals) (AtomVar var) =
case M.lookup var locals <|> M.lookup var globals of
Just v -> Success v
Nothing -> Failure (NotInScope [var])
vals :: Locals -> Globals -> [Atom] -> Validate NotInScope [Value]
vals locals globals = traverse (val locals globals)
localVal :: Locals -> Atom -> Validate NotInScope Value
localVal locals = val locals mempty
globalVal :: Globals -> Atom -> Validate NotInScope Value
globalVal globals = val mempty globals