1-- | Removes unused variables
2module Language.PureScript.CoreImp.Optimizer.Unused
3  ( removeCodeAfterReturnStatements
4  , removeUndefinedApp
5  ) where
6
7import Prelude.Compat
8
9import Language.PureScript.CoreImp.AST
10import Language.PureScript.CoreImp.Optimizer.Common
11import qualified Language.PureScript.Constants.Prim as C
12
13removeCodeAfterReturnStatements :: AST -> AST
14removeCodeAfterReturnStatements = everywhere (removeFromBlock go)
15  where
16  go :: [AST] -> [AST]
17  go jss | not (any isReturn jss) = jss
18         | otherwise = let (body, ret : _) = break isReturn jss in body ++ [ret]
19  isReturn (Return _ _) = True
20  isReturn (ReturnNoResult _) = True
21  isReturn _ = False
22
23removeUndefinedApp :: AST -> AST
24removeUndefinedApp = everywhere convert
25  where
26  convert (App ss fn [Var _ arg]) | arg == C.undefined = App ss fn []
27  convert js = js
28