module Foundation.String.Builder
( Builder
, emit
, emitChar
, toString
) where
import Foundation.Internal.Base
import Foundation.String.UTF8 (String)
import qualified Foundation.String.UTF8 as S
data Builder = E String | T [Builder]
instance IsString Builder where
fromString = E . fromString
instance Monoid Builder where
mempty = empty
mappend = append
mconcat = concat
empty :: Builder
empty = T []
emit :: String -> Builder
emit s = E s
emitChar :: Char -> Builder
emitChar c = E (S.singleton c)
toString :: Builder -> String
toString = mconcat . flatten
where
flatten (E s) = [s]
flatten (T l) = mconcat $ fmap flatten l
append :: Builder -> Builder -> Builder
append a b = T [a,b]
concat :: [Builder] -> Builder
concat = T