-- | Optimizer steps for simplifying JavaScript blocks
module Language.PureScript.CoreImp.Optimizer.Blocks
  ( collapseNestedBlocks
  , collapseNestedIfs
  ) where

import Prelude

import Language.PureScript.CoreImp.AST (AST(..), BinaryOperator(..), everywhere)

-- | Collapse blocks which appear nested directly below another block
collapseNestedBlocks :: AST -> AST
collapseNestedBlocks :: AST -> AST
collapseNestedBlocks = (AST -> AST) -> AST -> AST
everywhere AST -> AST
collapse where
  collapse :: AST -> AST
  collapse :: AST -> AST
collapse (Block Maybe SourceSpan
ss [AST]
sts) = Maybe SourceSpan -> [AST] -> AST
Block Maybe SourceSpan
ss (forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap AST -> [AST]
go [AST]
sts)
  collapse AST
js = AST
js
  
  go :: AST -> [AST]
  go :: AST -> [AST]
go (Block Maybe SourceSpan
_ [AST]
sts) = [AST]
sts
  go AST
s = [AST
s]

collapseNestedIfs :: AST -> AST
collapseNestedIfs :: AST -> AST
collapseNestedIfs = (AST -> AST) -> AST -> AST
everywhere AST -> AST
collapse where
  collapse :: AST -> AST
  collapse :: AST -> AST
collapse (IfElse Maybe SourceSpan
_ (BooleanLiteral Maybe SourceSpan
_ Bool
True) (Block Maybe SourceSpan
_ [AST
js]) Maybe AST
_) = AST
js
  collapse (IfElse Maybe SourceSpan
s1 AST
cond1 (Block Maybe SourceSpan
_ [IfElse Maybe SourceSpan
s2 AST
cond2 AST
body Maybe AST
Nothing]) Maybe AST
Nothing) =
      Maybe SourceSpan -> AST -> AST -> Maybe AST -> AST
IfElse Maybe SourceSpan
s1 (Maybe SourceSpan -> BinaryOperator -> AST -> AST -> AST
Binary Maybe SourceSpan
s2 BinaryOperator
And AST
cond1 AST
cond2) AST
body forall a. Maybe a
Nothing
  collapse AST
js = AST
js