preprocessor-tools-0.1: Language/Haskell/Preprocessor/Util.hs
module Language.Haskell.Preprocessor.Util (
parens, noParens,
splitVal, splitTag, splitSemis, splitAllBy, splitBy,
valIs, tagIs
) where
import Language.Haskell.Preprocessor.Ast
parens, noParens :: [Ast] -> Ast
parens asts = Block {
item = newToken { tag = Other, val = "(" },
lbrace = Nothing,
body = asts,
rbrace = Nothing,
next = Single newToken { tag = Other, val = ")" }
}
noParens asts = Block {
item = newToken { tag = Other, val = "" },
lbrace = Nothing,
body = asts,
rbrace = Nothing,
next = Single newToken { tag = Other, val = "" }
}
splitVal :: String -> [Ast] -> Maybe ([Ast], Ast, [Ast])
splitVal = splitBy . valIs
splitTag :: Tag -> [Ast] -> Maybe ([Ast], Ast, [Ast])
splitTag = splitBy . tagIs
splitSemis :: [Ast] -> [[Ast]]
splitSemis = filter (not . null) . splitAllBy isSemi where
isSemi t = valIs ";" t || tagIs VSemi t
splitAllBy :: (Ast -> Bool) -> [Ast] -> [[Ast]]
splitAllBy _ [] = []
splitAllBy pred lst = case splitBy pred lst of
Nothing -> [lst]
Just (f, _, b) -> f : splitAllBy pred b
splitBy :: (Ast -> Bool) -> [Ast] -> Maybe ([Ast], Ast, [Ast])
splitBy pred lst = case lst of
[] -> Nothing
x:xs | pred x -> Just ([], x, xs)
| otherwise -> do
(front, middle, back) <- splitBy pred xs
return (x:front, middle, back)
valIs :: String -> Ast -> Bool
valIs v Single { item = t } = val t == v
valIs _ _ = False
tagIs :: Tag -> Ast -> Bool
tagIs v Single { item = t } = tag t == v
tagIs _ _ = False