dump-0.2.1: src/Internal/Parse.hs
module Internal.Parse where
import Debug.Trace
parseSimple :: String -> [String]
parseSimple "" = []
parseSimple str = match : parseSimple rest
where
match = pExp str
rest = drop (length match + 1) str
pExp :: String -> String
pExp = pUntil 0 ','
pUntil :: Int -> Char -> String -> String
pUntil _ _ "" = ""
pUntil i c (x : xs)
| x == c = ""
| x == '(' = x : matchAndRest ')'
| x == '[' = x : matchAndRest ']'
| x == '\'' = x : leaf '\''
| x == '"' = x : leaf '"'
| otherwise = x : pUntil i c xs
where
matchAndRest = factory $ pUntil $ i + 1
leaf = factory pLeaf
factory :: (Char -> String -> String) -> Char -> String
factory f cc = match ++ [cc] ++ pUntil i c rest
where
match = f cc xs
rest = drop (length match + 1) xs
pLeaf :: Char -> String -> String
pLeaf _ "" = ""
pLeaf cc (x:xs)
| x == cc = ""
| x == '\\' = x : case xs of
"" -> ""
(y:ys) -> y : pLeaf cc ys
| otherwise = x : pLeaf cc xs