module Language.PureScript.Scope (
usedNames,
unusedNames
) where
import Control.Applicative ((<$>))
import Data.Data
import Data.List ((\\), nub)
import Data.Generics (extQ, mkQ, everything)
import Language.PureScript.Values
import Language.PureScript.Names
import Language.PureScript.CodeGen.JS.AST
usedNames :: (Data d) => d -> [Ident]
usedNames val = nub $ everything (++) (mkQ [] namesV `extQ` namesB `extQ` namesJS) val
where
namesV :: Value -> [Ident]
namesV (Abs (Left arg) _) = [arg]
namesV (Var (Qualified Nothing name)) = [name]
namesV _ = []
namesB :: Binder -> [Ident]
namesB (VarBinder name) = [name]
namesB _ = []
namesJS :: JS -> [Ident]
namesJS (JSVar name) = [Ident name]
namesJS (JSFunction (Just name) args _) = Ident name : (Ident <$> args)
namesJS (JSFunction Nothing args _) = Ident <$> args
namesJS (JSVariableIntroduction name _) = [Ident name]
namesJS (JSFor name _ _ _) = [Ident name]
namesJS _ = []
unusedNames :: (Data d) => d -> [Ident]
unusedNames val =
let
allNames = usedNames val
varNames = map (Ident . ('_' :) . show) ([1..] :: [Int])
in
varNames \\ allNames