-- | Marks a node for pruning by returning Empty if it has no non-Empty
-- children.
prune :: Node -> Node
-prune n | not (null (children n)) = if all empty (children n) then Empty else n
+prune n | not (null (children n)) = checkChildren
| container n = Empty
| otherwise = n
+ where
+ checkChildren | all empty (children n) = Empty
+ | any empty (children n) = filterChildren n
+ | otherwise = n
+ filterChildren (Project cs) = Project $ filter (not . empty) cs
+ filterChildren (Unit cs) = Unit $ filter (not . empty) cs
+ filterChildren (DocBlock cs) = DocBlock $ filter (not . empty) cs
+ filterChildren _ = n
-- | Returns True if the supplied node is the Empty node.
empty :: Node -> Bool
Project
[ Project
[ Unit
- [ Empty
- , LetStatement
+ [ LetStatement
{ letLexpr = "s:options"
, letValue = "get(g:, 'FerretQFOptions', 1)"
}
, GenericStatement "augroup END"
, GenericStatement "endif"
, GenericStatement "endif"
- , Empty
, LetStatement
{ letLexpr = "s:map" , letValue = "get(g:, 'FerretQFMap', 1)" }
, GenericStatement "if s:map"
"vnoremap <buffer> <silent> d :call ferret#private#qf_delete()<CR>"
, GenericStatement "endif"
]
- , Empty
]
, OptionsAnnotation
, OptionAnnotation "g:FerretQFOptions" "boolean" (Just "1")
, Fenced [ ":call pathogen#helptags()" ]
, Project
[ Unit
- [ Empty
- , Empty
- , GenericStatement
+ [ GenericStatement
"if exists('g:FerretLoaded') || &compatible || v:version < 700"
, GenericStatement "finish"
, GenericStatement "endif"
, GenericStatement "autocmd QuickFixCmdPost l* nested lwindow"
, GenericStatement "augroup END"
, GenericStatement "endif"
- , Empty
, GenericStatement
"command! -nargs=+ -complete=file Ack call ferret#private#ack(<q-args>)"
- , Empty
, GenericStatement
"command! -nargs=+ -complete=file Lack call ferret#private#lack(<q-args>)"
- , Empty
, GenericStatement
"command! -nargs=1 Acks call ferret#private#acks(<q-args>)"
- , Empty
, LetStatement
{ letLexpr = "s:map" , letValue = "get(g:, 'FerretMap', 1)" }
, GenericStatement "if s:map"
, GenericStatement
"if !hasmapto('<Plug>(FerretAck)') && maparg('<leader>a', 'n') ==# ''"
- , Empty
, GenericStatement "nmap <unique> <leader>a <Plug>(FerretAck)"
, GenericStatement "endif"
, GenericStatement "nnoremap <Plug>(FerretAck) :Ack<space>"
, GenericStatement
"if !hasmapto('<Plug>FerretLack') && maparg('<leader>l', 'n') ==# ''"
- , Empty
, GenericStatement "nmap <unique> <leader>l <Plug>(FerretLack)"
, GenericStatement "endif"
, GenericStatement "nnoremap <Plug>(FerretLack) :Lack<space>"
, GenericStatement
"if !hasmapto('<Plug>(FerretAckWord)') && maparg('<leader>s', 'n') ==# ''"
- , Empty
, GenericStatement "nmap <unique> <leader>s <Plug>(FerretAckWord)"
, GenericStatement "endif"
, GenericStatement
"nnoremap <Plug>(FerretAckWord) :Ack <C-r><C-w><CR>"
, GenericStatement
"if !hasmapto('<Plug>(FerretAcks)') && maparg('<leader>r', 'n') ==# ''"
- , Empty
, GenericStatement "nmap <unique> <leader>r <Plug>(FerretAcks)"
, GenericStatement "endif"
, GenericStatement
"nnoremap <Plug>(FerretAcks) :Acks <c-r>=(exists('g:ferret_lastsearch') ? '/' . g:ferret_lastsearch . '//' : ' ')<CR><Left>"
, GenericStatement "endif"
- , Empty
, GenericStatement
"command! -bar Qargs execute 'args' ferret#private#qargs()"
- , Empty
, LetStatement
{ letLexpr = "s:commands"
, letValue = "get(g:, 'FerretQFCommands', 1)"
{ letLexpr = "&cpoptions " , letValue = "s:cpoptions" }
, UnletStatement { unletBang = False , unletBody = "s:cpoptions" }
]
- , Empty
- , Empty
]
, CommandsAnnotation
, CommandAnnotation "Ack" (Just "{pattern} {options}")