on 4e1760f help sign in
elk/src/FreeVar.hs
30 lines 969 B history raw
1module FreeVar (freeIn) where
3import Ast
4import Data.Set hiding (map)
6x `freeIn` expr = member x $ freeVars expr
8freeVars expr =
9 let f = freeVars in
10 case expr of
11 Range e1 e2 -> union (f e1) (f e2)
12 Binop op e1 e2 -> union (f e1) (f e2)
13 Lambda x e -> delete x (f e)
14 App e1 e2 -> union (f e1) (f e2)
15 If e1 e2 e3 -> unions $ map f [e1,e2,e3]
16 Lift e es -> unions $ map f es
17 Fold e1 e2 e3 -> unions $ map f [e1,e2,e3]
18 Async e -> f e
19 Let defs e -> foldr delete (unions (f e : map f es)) vs
20 where (vs,es) = unzip defs
21 Var x -> singleton x
22 Data name es -> unions (map f es)
23 Case e cases -> union (f e) (unions $ map caseFreeVars cases)
24 _ -> empty
26caseFreeVars (p,e) = difference (freeVars e) (pvars p)
27 where pvars p = case p of
28 PAnything -> empty
29 PVar x -> singleton x
30 PData _ ps -> unions (map pvars ps)