interpolate-0.0.3: src/Data/String/Interpolate/Parse.hs
module Data.String.Interpolate.Parse where
import Data.String.Interpolate.Util
data Node = Literal String | Expression String
parseNodes :: String -> [Node]
parseNodes = go ""
where
go :: String -> String -> [Node]
go acc input = case input of
"" -> [(lit . reverse) acc]
'\\':x:xs -> go (x:'\\':acc) xs
'#':'{':xs -> case span (/= '}') xs of
(ys, _:zs) -> (lit . reverse) acc : Expression ys : go "" zs
(_, "") -> [lit (reverse acc ++ input)]
x:xs -> go (x:acc) xs
lit :: String -> Node
lit = Literal . unescape