@@ -1,32 +0,0 @@
1−module FreeVar (freeIn,freeVars) where
2−
3−import Ast
4−import Control.Arrow ((***))
5−import Data.Set (union, unions, delete, singleton, empty, difference, member)
6−
7−x `freeIn` expr = member x $ freeVars expr
8−
9−freeVars expr =
10− let f = freeVars in
11− case expr of
12− Range e1 e2 -> f e1 `union` f e2
13− Binop op e1 e2 -> f e1 `union` f e2
14− Lambda x e -> delete x (f e)
15− App e1 e2 -> f e1 `union` f e2
16− If e1 e2 e3 -> unions $ map f [e1,e2,e3]
17− Guard ps -> map (f *** f) ps
18− Lift e es -> unions $ map f es
19− Fold e1 e2 e3 -> unions $ map f [e1,e2,e3]
20− Async e -> f e
21− Let defs e -> foldr delete (unions (f e : map f es)) vs
22− where (vs,es) = unzip defs
23− Var x -> singleton x
24− Data name es -> unions (map f es)
25− Case e cases -> f e `union` unions (map caseFreeVars cases)
26− _ -> empty
27−
28−caseFreeVars (p,e) = difference (freeVars e) (pvars p)
29− where pvars p = case p of
30− PAnything -> empty
31− PVar x -> singleton x
32− PData _ ps -> unions (map pvars ps)