packages feed

Elm-0.1.0: src/FreeVar.hs

module FreeVar (freeIn) where

import Ast
import Data.Set hiding (map)

x `freeIn` expr = member x $ freeVars expr

freeVars expr =
    let f = freeVars in
    case expr of
      Range e1 e2 -> union (f e1) (f e2)
      Binop op e1 e2 -> union (f e1) (f e2)
      Lambda x e -> delete x (f e)
      App e1 e2 -> union (f e1) (f e2)
      If e1 e2 e3 -> unions $ map f [e1,e2,e3]
      Lift e es -> unions $ map f es
      Fold e1 e2 e3 -> unions $ map f [e1,e2,e3]
      Async e -> f e
      Let defs e -> foldr delete (unions (f e : map f es)) vs
              where (vs,es) = unzip defs
      Var x -> singleton x
      Data name es -> unions (map f es)
      Case e cases -> union (f e) (unions $ map caseFreeVars cases)
      _ -> empty

caseFreeVars (p,e) = difference (freeVars e) (pvars p)
    where pvars p = case p of
                      PAnything -> empty
                      PVar x -> singleton x
                      PData _ ps -> unions (map pvars ps)