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