{-# LANGUAGE CPP, DeriveFunctor, TypeSynonymInstances, FlexibleInstances, TypeFamilies #-}
module Data.String.Builder (
build
, literal
, Builder
, BuilderM
) where
import Control.Applicative
import Control.Monad
import Data.Monoid
import Data.String
data BuilderM a = BuilderM a ShowS
deriving a -> BuilderM b -> BuilderM a
(a -> b) -> BuilderM a -> BuilderM b
(forall a b. (a -> b) -> BuilderM a -> BuilderM b)
-> (forall a b. a -> BuilderM b -> BuilderM a) -> Functor BuilderM
forall a b. a -> BuilderM b -> BuilderM a
forall a b. (a -> b) -> BuilderM a -> BuilderM b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> BuilderM b -> BuilderM a
$c<$ :: forall a b. a -> BuilderM b -> BuilderM a
fmap :: (a -> b) -> BuilderM a -> BuilderM b
$cfmap :: forall a b. (a -> b) -> BuilderM a -> BuilderM b
Functor
instance Applicative BuilderM where
pure :: a -> BuilderM a
pure = a -> BuilderM a
forall (m :: * -> *) a. Monad m => a -> m a
return
<*> :: BuilderM (a -> b) -> BuilderM a -> BuilderM b
(<*>) = BuilderM (a -> b) -> BuilderM a -> BuilderM b
forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b
ap
instance Monad BuilderM where
return :: a -> BuilderM a
return a :: a
a = a -> ShowS -> BuilderM a
forall a. a -> ShowS -> BuilderM a
BuilderM a
a ShowS
forall a. a -> a
id
BuilderM a :: a
a xs :: ShowS
xs >>= :: BuilderM a -> (a -> BuilderM b) -> BuilderM b
>>= f :: a -> BuilderM b
f = case a -> BuilderM b
f a
a of
BuilderM b :: b
b ys :: ShowS
ys -> b -> ShowS -> BuilderM b
forall a. a -> ShowS -> BuilderM a
BuilderM b
b (ShowS
xs ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS
ys)
type Builder = BuilderM ()
instance Monoid Builder where
mempty :: Builder
mempty = () -> Builder
forall (m :: * -> *) a. Monad m => a -> m a
return ()
#if !MIN_VERSION_base(4,11,0)
mappend = (>>)
#else
instance Semigroup Builder where
<> :: Builder -> Builder -> Builder
(<>) = Builder -> Builder -> Builder
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
(>>)
#endif
literal :: String -> Builder
literal :: String -> Builder
literal = () -> ShowS -> Builder
forall a. a -> ShowS -> BuilderM a
BuilderM () (ShowS -> Builder) -> (String -> ShowS) -> String -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString
instance (a ~ ()) => IsString (BuilderM a) where
fromString :: String -> BuilderM a
fromString s :: String
s = String -> Builder
literal String
s Builder -> Builder -> Builder
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> Builder
literal "\n"
build :: Builder -> String
build :: Builder -> String
build (BuilderM () s :: ShowS
s) = ShowS
s ""