{-# LANGUAGE GeneralizedNewtypeDeriving, MagicHash, BangPatterns #-}
module Data.BufferBuilder.Utf8 (
Utf8Builder
, runUtf8Builder
, appendText
, appendString
, appendChar
, appendByte7
, appendChar7
, appendBS7
, appendLiteral7
, appendUrlEncoded
, appendDecimalSignedInt
, appendDecimalDouble
, appendEscapedJson
, appendEscapedJsonLiteral
, appendEscapedJsonText
, unsafeAppendBufferBuilder
, unsafeAppendByte
, unsafeAppendChar8
, unsafeAppendLiteral
, unsafeAppendLiteralN
, unsafeAppendBS
) where
import GHC.Base
import GHC.Word
import Control.Applicative
import Data.ByteString (ByteString)
import Data.BufferBuilder (BufferBuilder)
import qualified Data.BufferBuilder as BB
import Data.Text (Text)
import Data.Text.Encoding (encodeUtf8)
newtype Utf8Builder a = Utf8Builder { Utf8Builder a -> BufferBuilder a
unBuilder :: BufferBuilder a }
deriving (a -> Utf8Builder b -> Utf8Builder a
(a -> b) -> Utf8Builder a -> Utf8Builder b
(forall a b. (a -> b) -> Utf8Builder a -> Utf8Builder b)
-> (forall a b. a -> Utf8Builder b -> Utf8Builder a)
-> Functor Utf8Builder
forall a b. a -> Utf8Builder b -> Utf8Builder a
forall a b. (a -> b) -> Utf8Builder a -> Utf8Builder b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> Utf8Builder b -> Utf8Builder a
$c<$ :: forall a b. a -> Utf8Builder b -> Utf8Builder a
fmap :: (a -> b) -> Utf8Builder a -> Utf8Builder b
$cfmap :: forall a b. (a -> b) -> Utf8Builder a -> Utf8Builder b
Functor, Functor Utf8Builder
a -> Utf8Builder a
Functor Utf8Builder
-> (forall a. a -> Utf8Builder a)
-> (forall a b.
Utf8Builder (a -> b) -> Utf8Builder a -> Utf8Builder b)
-> (forall a b c.
(a -> b -> c) -> Utf8Builder a -> Utf8Builder b -> Utf8Builder c)
-> (forall a b. Utf8Builder a -> Utf8Builder b -> Utf8Builder b)
-> (forall a b. Utf8Builder a -> Utf8Builder b -> Utf8Builder a)
-> Applicative Utf8Builder
Utf8Builder a -> Utf8Builder b -> Utf8Builder b
Utf8Builder a -> Utf8Builder b -> Utf8Builder a
Utf8Builder (a -> b) -> Utf8Builder a -> Utf8Builder b
(a -> b -> c) -> Utf8Builder a -> Utf8Builder b -> Utf8Builder c
forall a. a -> Utf8Builder a
forall a b. Utf8Builder a -> Utf8Builder b -> Utf8Builder a
forall a b. Utf8Builder a -> Utf8Builder b -> Utf8Builder b
forall a b. Utf8Builder (a -> b) -> Utf8Builder a -> Utf8Builder b
forall a b c.
(a -> b -> c) -> Utf8Builder a -> Utf8Builder b -> Utf8Builder c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: Utf8Builder a -> Utf8Builder b -> Utf8Builder a
$c<* :: forall a b. Utf8Builder a -> Utf8Builder b -> Utf8Builder a
*> :: Utf8Builder a -> Utf8Builder b -> Utf8Builder b
$c*> :: forall a b. Utf8Builder a -> Utf8Builder b -> Utf8Builder b
liftA2 :: (a -> b -> c) -> Utf8Builder a -> Utf8Builder b -> Utf8Builder c
$cliftA2 :: forall a b c.
(a -> b -> c) -> Utf8Builder a -> Utf8Builder b -> Utf8Builder c
<*> :: Utf8Builder (a -> b) -> Utf8Builder a -> Utf8Builder b
$c<*> :: forall a b. Utf8Builder (a -> b) -> Utf8Builder a -> Utf8Builder b
pure :: a -> Utf8Builder a
$cpure :: forall a. a -> Utf8Builder a
$cp1Applicative :: Functor Utf8Builder
Applicative, Applicative Utf8Builder
a -> Utf8Builder a
Applicative Utf8Builder
-> (forall a b.
Utf8Builder a -> (a -> Utf8Builder b) -> Utf8Builder b)
-> (forall a b. Utf8Builder a -> Utf8Builder b -> Utf8Builder b)
-> (forall a. a -> Utf8Builder a)
-> Monad Utf8Builder
Utf8Builder a -> (a -> Utf8Builder b) -> Utf8Builder b
Utf8Builder a -> Utf8Builder b -> Utf8Builder b
forall a. a -> Utf8Builder a
forall a b. Utf8Builder a -> Utf8Builder b -> Utf8Builder b
forall a b. Utf8Builder a -> (a -> Utf8Builder b) -> Utf8Builder b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: a -> Utf8Builder a
$creturn :: forall a. a -> Utf8Builder a
>> :: Utf8Builder a -> Utf8Builder b -> Utf8Builder b
$c>> :: forall a b. Utf8Builder a -> Utf8Builder b -> Utf8Builder b
>>= :: Utf8Builder a -> (a -> Utf8Builder b) -> Utf8Builder b
$c>>= :: forall a b. Utf8Builder a -> (a -> Utf8Builder b) -> Utf8Builder b
$cp1Monad :: Applicative Utf8Builder
Monad)
runUtf8Builder :: Utf8Builder () -> ByteString
runUtf8Builder :: Utf8Builder () -> ByteString
runUtf8Builder Utf8Builder ()
a = BufferBuilder () -> ByteString
forall a. BufferBuilder a -> ByteString
BB.runBufferBuilder (BufferBuilder () -> ByteString) -> BufferBuilder () -> ByteString
forall a b. (a -> b) -> a -> b
$ Utf8Builder () -> BufferBuilder ()
forall a. Utf8Builder a -> BufferBuilder a
unBuilder Utf8Builder ()
a
{-# INLINE runUtf8Builder #-}
appendText :: Text -> Utf8Builder ()
appendText :: Text -> Utf8Builder ()
appendText Text
a = BufferBuilder () -> Utf8Builder ()
forall a. BufferBuilder a -> Utf8Builder a
Utf8Builder (BufferBuilder () -> Utf8Builder ())
-> BufferBuilder () -> Utf8Builder ()
forall a b. (a -> b) -> a -> b
$ ByteString -> BufferBuilder ()
BB.appendBS (ByteString -> BufferBuilder ()) -> ByteString -> BufferBuilder ()
forall a b. (a -> b) -> a -> b
$ Text -> ByteString
encodeUtf8 Text
a
{-# INLINE appendText #-}
appendString :: String -> Utf8Builder ()
appendString :: String -> Utf8Builder ()
appendString String
s = (Char -> Utf8Builder ()) -> String -> Utf8Builder ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Char -> Utf8Builder ()
appendChar String
s
{-# INLINABLE appendString #-}
appendChar :: Char -> Utf8Builder ()
appendChar :: Char -> Utf8Builder ()
appendChar Char
c = BufferBuilder () -> Utf8Builder ()
forall a. BufferBuilder a -> Utf8Builder a
Utf8Builder (BufferBuilder () -> Utf8Builder ())
-> BufferBuilder () -> Utf8Builder ()
forall a b. (a -> b) -> a -> b
$ Char -> BufferBuilder ()
BB.appendCharUtf8 Char
c
{-# INLINE appendChar #-}
appendByte7 :: Word8 -> Utf8Builder ()
appendByte7 :: Word8 -> Utf8Builder ()
appendByte7 = BufferBuilder () -> Utf8Builder ()
forall a. BufferBuilder a -> Utf8Builder a
Utf8Builder (BufferBuilder () -> Utf8Builder ())
-> (Word8 -> BufferBuilder ()) -> Word8 -> Utf8Builder ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> BufferBuilder ()
BB.appendByte7
{-# INLINE appendByte7 #-}
appendChar7 :: Char -> Utf8Builder ()
appendChar7 :: Char -> Utf8Builder ()
appendChar7 = BufferBuilder () -> Utf8Builder ()
forall a. BufferBuilder a -> Utf8Builder a
Utf8Builder (BufferBuilder () -> Utf8Builder ())
-> (Char -> BufferBuilder ()) -> Char -> Utf8Builder ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> BufferBuilder ()
BB.appendChar7
{-# INLINE appendChar7 #-}
appendBS7 :: ByteString -> Utf8Builder ()
appendBS7 :: ByteString -> Utf8Builder ()
appendBS7 = BufferBuilder () -> Utf8Builder ()
forall a. BufferBuilder a -> Utf8Builder a
Utf8Builder (BufferBuilder () -> Utf8Builder ())
-> (ByteString -> BufferBuilder ()) -> ByteString -> Utf8Builder ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> BufferBuilder ()
BB.appendBS7
{-# INLINE appendBS7 #-}
appendLiteral7 :: Addr# -> Utf8Builder ()
appendLiteral7 :: Addr# -> Utf8Builder ()
appendLiteral7 Addr#
addr = BufferBuilder () -> Utf8Builder ()
forall a. BufferBuilder a -> Utf8Builder a
Utf8Builder (BufferBuilder () -> Utf8Builder ())
-> BufferBuilder () -> Utf8Builder ()
forall a b. (a -> b) -> a -> b
$ Addr# -> BufferBuilder ()
BB.appendLiteral7 Addr#
addr
{-# INLINE appendLiteral7 #-}
appendUrlEncoded :: ByteString -> Utf8Builder ()
appendUrlEncoded :: ByteString -> Utf8Builder ()
appendUrlEncoded = BufferBuilder () -> Utf8Builder ()
forall a. BufferBuilder a -> Utf8Builder a
Utf8Builder (BufferBuilder () -> Utf8Builder ())
-> (ByteString -> BufferBuilder ()) -> ByteString -> Utf8Builder ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> BufferBuilder ()
BB.appendUrlEncoded
{-# INLINE appendUrlEncoded #-}
appendDecimalSignedInt :: Int -> Utf8Builder ()
appendDecimalSignedInt :: Int -> Utf8Builder ()
appendDecimalSignedInt Int
a = BufferBuilder () -> Utf8Builder ()
forall a. BufferBuilder a -> Utf8Builder a
Utf8Builder (BufferBuilder () -> Utf8Builder ())
-> BufferBuilder () -> Utf8Builder ()
forall a b. (a -> b) -> a -> b
$ Int -> BufferBuilder ()
BB.appendDecimalSignedInt Int
a
{-# INLINE appendDecimalSignedInt #-}
appendDecimalDouble :: Double -> Utf8Builder ()
appendDecimalDouble :: Double -> Utf8Builder ()
appendDecimalDouble Double
d = BufferBuilder () -> Utf8Builder ()
forall a. BufferBuilder a -> Utf8Builder a
Utf8Builder (BufferBuilder () -> Utf8Builder ())
-> BufferBuilder () -> Utf8Builder ()
forall a b. (a -> b) -> a -> b
$ Double -> BufferBuilder ()
BB.appendDecimalDouble Double
d
{-# INLINE appendDecimalDouble #-}
appendEscapedJsonLiteral :: Addr# -> Utf8Builder ()
appendEscapedJsonLiteral :: Addr# -> Utf8Builder ()
appendEscapedJsonLiteral Addr#
addr = BufferBuilder () -> Utf8Builder ()
forall a. BufferBuilder a -> Utf8Builder a
Utf8Builder (BufferBuilder () -> Utf8Builder ())
-> BufferBuilder () -> Utf8Builder ()
forall a b. (a -> b) -> a -> b
$ Addr# -> BufferBuilder ()
BB.appendEscapedJsonLiteral Addr#
addr
appendEscapedJson :: ByteString -> Utf8Builder ()
appendEscapedJson :: ByteString -> Utf8Builder ()
appendEscapedJson ByteString
a = BufferBuilder () -> Utf8Builder ()
forall a. BufferBuilder a -> Utf8Builder a
Utf8Builder (BufferBuilder () -> Utf8Builder ())
-> BufferBuilder () -> Utf8Builder ()
forall a b. (a -> b) -> a -> b
$ ByteString -> BufferBuilder ()
BB.appendEscapedJson ByteString
a
{-# INLINE appendEscapedJson #-}
appendEscapedJsonText :: Text -> Utf8Builder ()
appendEscapedJsonText :: Text -> Utf8Builder ()
appendEscapedJsonText Text
txt = BufferBuilder () -> Utf8Builder ()
forall a. BufferBuilder a -> Utf8Builder a
Utf8Builder (BufferBuilder () -> Utf8Builder ())
-> BufferBuilder () -> Utf8Builder ()
forall a b. (a -> b) -> a -> b
$ Text -> BufferBuilder ()
BB.appendEscapedJsonText Text
txt
{-# INLINE appendEscapedJsonText #-}
unsafeAppendBufferBuilder :: BufferBuilder () -> Utf8Builder ()
unsafeAppendBufferBuilder :: BufferBuilder () -> Utf8Builder ()
unsafeAppendBufferBuilder = BufferBuilder () -> Utf8Builder ()
forall a. BufferBuilder a -> Utf8Builder a
Utf8Builder
unsafeAppendByte :: Word8 -> Utf8Builder ()
unsafeAppendByte :: Word8 -> Utf8Builder ()
unsafeAppendByte = BufferBuilder () -> Utf8Builder ()
forall a. BufferBuilder a -> Utf8Builder a
Utf8Builder (BufferBuilder () -> Utf8Builder ())
-> (Word8 -> BufferBuilder ()) -> Word8 -> Utf8Builder ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> BufferBuilder ()
BB.appendByte
{-# INLINE unsafeAppendByte #-}
unsafeAppendChar8 :: Char -> Utf8Builder ()
unsafeAppendChar8 :: Char -> Utf8Builder ()
unsafeAppendChar8 = BufferBuilder () -> Utf8Builder ()
forall a. BufferBuilder a -> Utf8Builder a
Utf8Builder (BufferBuilder () -> Utf8Builder ())
-> (Char -> BufferBuilder ()) -> Char -> Utf8Builder ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> BufferBuilder ()
BB.appendChar8
{-# INLINE unsafeAppendChar8 #-}
unsafeAppendLiteral :: Addr# -> Utf8Builder ()
unsafeAppendLiteral :: Addr# -> Utf8Builder ()
unsafeAppendLiteral Addr#
addr = BufferBuilder () -> Utf8Builder ()
forall a. BufferBuilder a -> Utf8Builder a
Utf8Builder (BufferBuilder () -> Utf8Builder ())
-> BufferBuilder () -> Utf8Builder ()
forall a b. (a -> b) -> a -> b
$ Addr# -> BufferBuilder ()
BB.appendLiteral Addr#
addr
{-# INLINE unsafeAppendLiteral #-}
unsafeAppendLiteralN :: Int -> Addr# -> Utf8Builder ()
unsafeAppendLiteralN :: Int -> Addr# -> Utf8Builder ()
unsafeAppendLiteralN !Int
len Addr#
addr = BufferBuilder () -> Utf8Builder ()
forall a. BufferBuilder a -> Utf8Builder a
Utf8Builder (BufferBuilder () -> Utf8Builder ())
-> BufferBuilder () -> Utf8Builder ()
forall a b. (a -> b) -> a -> b
$ Int -> Addr# -> BufferBuilder ()
BB.unsafeAppendLiteralN Int
len Addr#
addr
{-# INLINE unsafeAppendLiteralN #-}
unsafeAppendBS :: ByteString -> Utf8Builder ()
unsafeAppendBS :: ByteString -> Utf8Builder ()
unsafeAppendBS ByteString
a = BufferBuilder () -> Utf8Builder ()
forall a. BufferBuilder a -> Utf8Builder a
Utf8Builder (BufferBuilder () -> Utf8Builder ())
-> BufferBuilder () -> Utf8Builder ()
forall a b. (a -> b) -> a -> b
$ ByteString -> BufferBuilder ()
BB.appendBS ByteString
a
{-# INLINE unsafeAppendBS #-}