module Data.String.Interpolate.Parse where import Data.String.Interpolate.Internal.Util data Node = Literal String | Expression String parseNodes :: String -> [Node] parseNodes :: String -> [Node] parseNodes = String -> String -> [Node] go "" where go :: String -> String -> [Node] go :: String -> String -> [Node] go acc :: String acc input :: String input = case String input of "" -> [(String -> Node lit (String -> Node) -> (String -> String) -> String -> Node forall b c a. (b -> c) -> (a -> b) -> a -> c . String -> String forall a. [a] -> [a] reverse) String acc] '\\':x :: Char x:xs :: String xs -> String -> String -> [Node] go (Char xChar -> String -> String forall a. a -> [a] -> [a] :'\\'Char -> String -> String forall a. a -> [a] -> [a] :String acc) String xs '#':'{':xs :: String xs -> case (Char -> Bool) -> String -> (String, String) forall a. (a -> Bool) -> [a] -> ([a], [a]) span (Char -> Char -> Bool forall a. Eq a => a -> a -> Bool /= '}') String xs of (ys :: String ys, _:zs :: String zs) -> (String -> Node lit (String -> Node) -> (String -> String) -> String -> Node forall b c a. (b -> c) -> (a -> b) -> a -> c . String -> String forall a. [a] -> [a] reverse) String acc Node -> [Node] -> [Node] forall a. a -> [a] -> [a] : String -> Node Expression String ys Node -> [Node] -> [Node] forall a. a -> [a] -> [a] : String -> String -> [Node] go "" String zs (_, "") -> [String -> Node lit (String -> String forall a. [a] -> [a] reverse String acc String -> String -> String forall a. [a] -> [a] -> [a] ++ String input)] x :: Char x:xs :: String xs -> String -> String -> [Node] go (Char xChar -> String -> String forall a. a -> [a] -> [a] :String acc) String xs lit :: String -> Node lit :: String -> Node lit = String -> Node Literal (String -> Node) -> (String -> String) -> String -> Node forall b c a. (b -> c) -> (a -> b) -> a -> c . String -> String unescape