| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Data.BufferBuilder
Contents
Description
A library for efficiently building up a buffer of data. When given data known to be strict, use of BufferBuilder compiles directly into a series of efficient C function calls.
- data BufferBuilder a
- runBufferBuilder :: BufferBuilder a -> ByteString
- runBufferBuilder' :: BufferBuilder a -> (a, ByteString)
- data Options = Options {
- initialCapacity :: !Int
- trimFinalBuffer :: !Bool
- runBufferBuilderWithOptions :: Options -> BufferBuilder a -> ByteString
- runBufferBuilderWithOptions' :: Options -> BufferBuilder a -> (a, ByteString)
- calculateLength :: BufferBuilder a -> Int
- currentLength :: BufferBuilder Int
- appendByte :: Word8 -> BufferBuilder ()
- appendChar8 :: Char -> BufferBuilder ()
- appendBS :: ByteString -> BufferBuilder ()
- appendLBS :: ByteString -> BufferBuilder ()
- appendLiteral :: Addr# -> BufferBuilder ()
- unsafeAppendLiteralN :: Int -> Addr# -> BufferBuilder ()
- appendByte7 :: Word8 -> BufferBuilder ()
- appendChar7 :: Char -> BufferBuilder ()
- appendBS7 :: ByteString -> BufferBuilder ()
- appendLiteral7 :: Addr# -> BufferBuilder ()
- unsafeAppendLiteralN7 :: Int -> Addr# -> BufferBuilder ()
- appendCharUtf8 :: Char -> BufferBuilder ()
- appendStringUtf8 :: String -> BufferBuilder ()
- appendDecimalSignedInt :: Int -> BufferBuilder ()
- appendDecimalDouble :: Double -> BufferBuilder ()
- appendEscapedJson :: ByteString -> BufferBuilder ()
- appendEscapedJsonLiteral :: Addr# -> BufferBuilder ()
- appendEscapedJsonText :: Text -> BufferBuilder ()
- appendUrlEncoded :: ByteString -> BufferBuilder ()
The BufferBuilder Monad
data BufferBuilder a Source
BufferBuilder is the type of a monadic action that appends to an implicit,
growable buffer. Use runBufferBuilder to extract the resulting
buffer as a ByteString.
runBufferBuilder :: BufferBuilder a -> ByteString Source
Run a sequence of BufferBuilder actions and extract the resulting
buffer as a ByteString.
runBufferBuilder' :: BufferBuilder a -> (a, ByteString) Source
Run a sequence of BufferBuilder actions and extract the resulting
buffer as a ByteString. Also returns the BufferBuilder's result.
Optional configuration
Constructors
| Options | |
Fields
| |
runBufferBuilderWithOptions' :: Options -> BufferBuilder a -> (a, ByteString) Source
Query builder
calculateLength :: BufferBuilder a -> Int Source
Given a BufferBuilder, calculate its length. This runs every BufferBuilder action in a mode that simply accumulates the number of bytes without copying any data into an output buffer.
currentLength :: BufferBuilder Int Source
Reads current length of BufferBuilder. If memory allocation has failed at any point, this returns zero. In the future, currentLength may throw an exception upon memory allocation failure.
Appending bytes and byte strings
appendByte :: Word8 -> BufferBuilder () Source
Append a single byte to the output buffer. To append multiple bytes in sequence and
avoid redundant bounds checks, consider using appendBS, appendLiteral, or unsafeAppendLiteralN.
appendChar8 :: Char -> BufferBuilder () Source
Appends a character to the buffer, truncating it to the bottom 8 bits.
appendBS :: ByteString -> BufferBuilder () Source
Appends a ByteString to the buffer. When appending constant, hardcoded strings, to
avoid a CAF and the costs of its associated tag check and indirect jump, use
appendLiteral or unsafeAppendLiteralN instead.
appendLBS :: ByteString -> BufferBuilder () Source
Appends a lazy ByteString to the buffer. This function operates by traversing
the lazy ByteString chunks, appending each in turn.
appendLiteral :: Addr# -> BufferBuilder () Source
Appends a zero-terminated MagicHash string literal. Use this function instead of
appendBS for string constants. For example:
appendLiteral "true"#
If the length of the string literal is known, calling
unsafeAppendLiteralN is faster, as unsafeAppendLiteralN avoids a strlen
operation which has nontrivial cost in some benchmarks.
unsafeAppendLiteralN :: Int -> Addr# -> BufferBuilder () Source
Appends a MagicHash string literal with a known length. Use this when the string literal's length is known. For example:
unsafeAppendLiteralN 4 "true"#
Per byte, this is the fastest append function. It amounts to a C function call with two constant arguments. The C function checks to see if it needs to grow the buffer and then it simply calls memcpy.
WARNING: passing an incorrect length value is likely to cause an access violation or worse.
Appending bytes and byte strings, truncated to 7 bits
appendByte7 :: Word8 -> BufferBuilder () Source
appendChar7 :: Char -> BufferBuilder () Source
appendBS7 :: ByteString -> BufferBuilder () Source
appendLiteral7 :: Addr# -> BufferBuilder () Source
unsafeAppendLiteralN7 :: Int -> Addr# -> BufferBuilder () Source
UTF-8 encoding
appendCharUtf8 :: Char -> BufferBuilder () Source
Appends a UTF-8-encoded Char to the buffer.
appendStringUtf8 :: String -> BufferBuilder () Source
Appends a UTF-8-encoded String to the buffer. The best way to improve performance here
is to use ByteString or Text instead of String.
Printing numbers
appendDecimalSignedInt :: Int -> BufferBuilder () Source
Appends a decimal integer, just like calling printf("%d", ...)
appendDecimalDouble :: Double -> BufferBuilder () Source
Appends a decimal double, just like calling printf("%f", ...)
JSON escaping
appendEscapedJson :: ByteString -> BufferBuilder () Source
appendEscapedJsonLiteral :: Addr# -> BufferBuilder () Source
appendEscapedJsonText :: Text -> BufferBuilder () Source
URL percent-encoding
appendUrlEncoded :: ByteString -> BufferBuilder () Source
Append a percent-encoded ByteString. All characters except for alphanumerics, -, ., _, and ~ will be encoded. The string produced by URL encoding is guaranteed ASCII-7 and thus valid UTF-8. Moreover, it is not required to be JSON-escaped.