haskell/sc-mini-pfp/TreeInterpreter.hs
module TreeInterpreter where
import Data
import Data.List
import DataUtil
import Data.Maybe
intTree :: Tree Conf -> Env -> Value
intTree (Node e Stop) env =
e // env
intTree (Node (Ctr cname _) (Decompose ts)) env =
Ctr cname $ map (\t -> intTree t env) ts
intTree (Node _ (Transient t)) env =
intTree t env
intTree (Node e (Variants cs)) env =
head $ catMaybes $ map (try env) cs
intTree (Node (Let (v, e1) e2) (Decompose [t1, t2])) env =
intTree t2 ((v, intTree t1 env) : env)
intTree (Node _ (Fold t ren)) env =
intTree t $ map (\(k, v) -> (renKey k, v)) env where
renKey k = maybe k fst (find ((k ==) . snd) ren)
try :: Env -> (Contract, Tree Conf) -> (Maybe Expr)
try env (Contract v (Pat pn vs), t) =
if cn == pn then (Just $ intTree t extEnv) else Nothing where
c@(Ctr cn cargs) = (Var v) // env
extEnv = zip vs cargs ++ env