module Text.Ginger.Optimizer
( Optimizable (..) )
where
import Text.Ginger.AST
import Data.Monoid
class Optimizable a where
optimize :: a -> a
instance Optimizable Template where
optimize = optimizeTemplate
instance Optimizable Statement where
optimize = optimizeStatement
instance Optimizable Block where
optimize = optimizeBlock
instance Optimizable Macro where
optimize = optimizeMacro
optimizeTemplate t =
t { templateBody = optimize $ templateBody t
, templateBlocks = fmap optimize $ templateBlocks t
, templateParent = fmap optimize $ templateParent t
}
optimizeStatement (MultiS items) =
case optimizeStatementList items of
[] -> NullS
[x] -> x
xs -> MultiS xs
optimizeStatement s = s
optimizeBlock (Block b) = Block $ optimize b
optimizeMacro (Macro args body) = Macro args (optimize body)
optimizeStatementList =
mergeLiterals .
cullNulls .
fmap optimize
cullNulls :: [Statement] -> [Statement]
cullNulls = filter (not . isNullS)
where
isNullS NullS = True
isNullS _ = False
mergeLiterals :: [Statement] -> [Statement]
mergeLiterals [] = []
mergeLiterals [x] = [x]
mergeLiterals (x@(LiteralS a):y@(LiteralS b):xs) = mergeLiterals $ (LiteralS $ a <> b):xs
mergeLiterals (x:xs) = x:mergeLiterals xs