]> git.wincent.com - docvim.git/blob - lib/Text/Docvim/Optimize.hs
Add additional blank line above headings
[docvim.git] / lib / Text / Docvim / Optimize.hs
1 module Text.Docvim.Optimize (optimize) where
2
3 import Control.Lens (children, transform)
4 import Text.Docvim.AST
5
6 -- | "Optimize" a Project's AST by eliminating empty paths.
7 optimize :: Node -> Node
8 optimize = transform prune
9
10 -- | Marks a node for pruning by returning Empty if it has no non-Empty
11 -- children.
12 prune :: Node -> Node
13 prune n | not (null (children n)) = checkChildren
14         | container n = Empty
15         | otherwise = n
16   where
17     checkChildren | all empty (children n) = Empty
18                   | any empty (children n) = filterChildren n
19                   | otherwise = n
20     filterChildren (Project cs) = Project $ filter (not . empty) cs
21     filterChildren (Unit cs) = Unit $ filter (not . empty) cs
22     filterChildren (DocBlock cs) = DocBlock $ filter (not . empty) cs
23     filterChildren _ = n
24
25 -- | Returns True if the supplied node is the Empty node.
26 empty :: Node -> Bool
27 empty Empty = True
28 empty _     = False
29
30 -- | Returns True if the supplied node is a (potentially) prunable container.
31 container :: Node -> Bool
32 container (Project _)  = True
33 container (Unit _)     = True
34 container (DocBlock _) = True
35 container _            = False