interpolate-0.2.1: src/Data/String/Interpolate/Parse.hs
module Data.String.Interpolate.Parse where
import Data.String.Interpolate.Internal.Util
data Node a = Literal String | Expression String | Abstraction a
parseNodes :: String -> [Node ()]
parseNodes = go ""
where
go :: String -> String -> [Node ()]
go acc input = case input of
"" -> lit []
'\\':x:xs -> go (x:'\\':acc) xs
'#':'{':xs | (e, '}':ys) <- span (/= '}') xs -> lit $ expression e : go "" ys
x:xs -> go (x:acc) xs
where
expression e
| null e = Abstraction ()
| otherwise = Expression e
lit :: [Node ()] -> [Node ()]
lit nodes
| null acc = nodes
| otherwise = (Literal . unescape $ reverse acc) : nodes