@@ -10,42 +10,77 @@ import qualified AST.Expression.Canonical as Canonical
1010import qualified AST.Pattern as Pattern
1111import qualified AST.Variable as V
1212
13+
1314subst :: String -> Canonical.Expr' -> Canonical.Expr' -> Canonical.Expr'
14−subst old new expr =
15+subst old new expression =
1516 let f (A a e) = A a (subst old new e) in
16− case expr of
17− Range e1 e2 -> Range (f e1) (f e2)
18− ExplicitList es -> ExplicitList (map f es)
19− Binop op e1 e2 -> Binop op (f e1) (f e2)
20− Lambda p e
21− | Set.member old (Pattern.boundVars p) -> expr
22− | otherwise -> Lambda p (f e)
23− App e1 e2 -> App (f e1) (f e2)
24− MultiIf ps -> MultiIf (map (f *** f) ps)
17+ case expression of
18+ Range e1 e2 ->
19+ Range (f e1) (f e2)
20+
21+ ExplicitList exprs ->
22+ ExplicitList (map f exprs)
23+
24+ Binop op e1 e2 ->
25+ Binop op (f e1) (f e2)
26+
27+ Lambda pattern body
28+ | Set.member old (Pattern.boundVars pattern) -> expression
29+ | otherwise -> Lambda pattern (f body)
30+
31+ App e1 e2 ->
32+ App (f e1) (f e2)
33+
34+ MultiIf branches ->
35+ MultiIf (map (f *** f) branches)
2536
2637 Let defs body
27− | anyShadow -> expr
38+ | anyShadow -> expression
2839 | otherwise -> Let (map substDef defs) (f body)
2940 where
30− substDef (Canonical.Definition p e t) = Canonical.Definition p (f e) t
41+ substDef (Canonical.Definition p e t) =
42+ Canonical.Definition p (f e) t
43+
3144 anyShadow =
32− any (Set.member old . Pattern.boundVars) [ p | Canonical.Definition p _ _ <- defs ]
45+ any (Set.member old . Pattern.boundVars)
46+ [ pattern | Canonical.Definition pattern _ _ <- defs ]
3347
3448 Var (V.Canonical home x) ->
3549 case home of
36− V.Module _ -> expr
37− V.BuiltIn -> expr
38− V.Local -> if x == old then new else expr
39−
40− Case e cases -> Case (f e) $ map (second f) cases
41− Data name es -> Data name (map f es)
42− Access e x -> Access (f e) x
43− Remove e x -> Remove (f e) x
44− Insert e x v -> Insert (f e) x (f v)
45− Modify r fs -> Modify (f r) (map (second f) fs)
46− Record fs -> Record (map (second f) fs)
47− Literal _ -> expr
48− Markdown uid md es -> Markdown uid md (map f es)
49− GLShader _ _ _ -> expr
50− PortIn name st -> PortIn name st
51− PortOut name st signal -> PortOut name st (f signal)
50+ V.Module _ -> expression
51+ V.BuiltIn -> expression
52+ V.Local -> if x == old then new else expression
53+
54+ Case e cases ->
55+ Case (f e) $ map (second f) cases
56+
57+ Data tag values ->
58+ Data tag (map f values)
59+
60+ Access record field ->
61+ Access (f record) field
62+
63+ Remove record field ->
64+ Remove (f record) field
65+
66+ Insert record field value ->
67+ Insert (f record) field (f value)
68+
69+ Modify record fields ->
70+ Modify (f record) (map (second f) fields)
71+
72+ Record fields ->
73+ Record (map (second f) fields)
74+
75+ Literal _ -> expression
76+
77+ Markdown uid md exprs ->
78+ Markdown uid md (map f exprs)
79+
80+ GLShader _ _ _ -> expression
81+
82+ PortIn name st ->
83+ PortIn name st
84+
85+ PortOut name st signal ->
86+ PortOut name st (f signal)