bytebuild-0.3.16.2: Build byte arrays
Safe HaskellSafe-Inferred
LanguageHaskell2010

Data.Bytes.Builder.Unsafe

Synopsis

Types

newtype Builder Source #

An unmaterialized sequence of bytes that may be pasted into a mutable byte array.

Constructors

Builder (forall s. MutableByteArray# s -> Int# -> Int# -> Commits s -> State# s -> (# State# s, MutableByteArray# s, Int#, Int#, Commits s #)) 

Instances

Instances details
IsString Builder Source # 
Instance details

Defined in Data.Bytes.Builder.Unsafe

Methods

fromString :: String -> Builder #

Monoid Builder Source # 
Instance details

Defined in Data.Bytes.Builder.Unsafe

Semigroup Builder Source # 
Instance details

Defined in Data.Bytes.Builder.Unsafe

ToBuilder Builder Source #

Identity

Instance details

Defined in Data.Bytes.Builder.Class

data BuilderState s Source #

A list of committed chunks along with the chunk currently being written to. This is kind of like a non-empty variant of Commmits but with the additional invariant that the head chunk is a mutable byte array.

data Commits s Source #

Constructors

Mutable 

Fields

Immutable 

Fields

  • ByteArray#

    Immutable chunk

  • Int#

    Offset into chunk, not necessarily zero

  • Int#

    Length (may be smaller than actual length)

  • !(Commits s)
     
Initial 

Execution

pasteST :: Builder -> BuilderState s -> ST s (BuilderState s) Source #

Run a builder, performing an in-place update on the state. The BuilderState argument must not be reused after being passed to this function. That is, its use must be affine.

Construction

fromEffect Source #

Arguments

:: Int

Maximum number of bytes the paste function needs

-> (forall s. MutableByteArray s -> Int -> ST s Int)

Paste function. Takes a byte array and an offset and returns the new offset and having pasted into the buffer.

-> Builder 

Builder State

newBuilderState :: Int -> ST s (BuilderState s) Source #

Create an empty BuilderState with a buffer of the given size.

closeBuilderState :: BuilderState s -> Commits s Source #

Push the active chunk onto the top of the commits. The BuilderState argument must not be reused after being passed to this function. That is, its use must be affine.

Finalization

reverseCommitsOntoChunks :: Chunks -> Commits s -> ST s Chunks Source #

Cons the chunks from a list of Commits onto an initial Chunks list (this argument is often ChunksNil). This reverses the order of the chunks, which is desirable since builders assemble Commits with the chunks backwards. This performs an in-place shrink and freezes any mutable byte arrays it encounters. Consequently, these must not be reused.

commitsOntoChunks :: Chunks -> Commits s -> ST s Chunks Source #

Variant of reverseCommitsOntoChunks that does not reverse the order of the commits. Since commits are built backwards by consing, this means that the chunks appended to the front will be backwards. Within each chunk, however, the bytes will be in the correct order.

Unlike reverseCommitsOntoChunks, this function is not tail recursive.

copyReverseCommits Source #

Arguments

:: MutableByteArray s

Destination

-> Int

Destination range successor

-> Commits s

Source

-> ST s Int 

Copy the contents of the chunks into a mutable array, reversing the order of the chunks. Precondition: The destination must have enough space to house the contents. This is not checked.

addCommitsLength :: Int -> Commits s -> Int Source #

Add the total number of bytes in the commits to first argument.

Commit Distance

commitDistance :: MutableByteArray# s -> Int# -> Commits s -> Int# Source #

Compute the number of bytes between the last byte and the offset specified in a chunk. Precondition: the chunk must exist in the list of committed chunks. This relies on mutable byte arrays having identity (e.g. it uses sameMutableByteArray#).

commitDistance1 :: MutableByteArray# s -> Int# -> MutableByteArray# s -> Int# -> Commits s -> Int# Source #

Variant of commitDistance where you get to supply a head of the commit list that has not yet been committed.

Safe Functions

These functions are actually completely safe, but they are defined here because they are used by typeclass instances. Import them from Data.Bytes.Builder instead.

stringUtf8 :: String -> Builder Source #

Create a builder from a cons-list of Char. These must be UTF-8 encoded.

cstring :: CString -> Builder Source #

Create a builder from a NUL-terminated CString. This ignores any textual encoding, copying bytes until NUL is reached.

Pasting with Preconditions

pasteUtf8TextJson# Source #

Arguments

:: ByteArray#

source

-> Int#

source offset

-> Int#

source length

-> MutableByteArray# s

destination buffer

-> Int#

offset into destination buffer

-> State# s

state token

-> (# State# s, Int# #) 

Encode (UTF-8 encoded) text as a JSON string, wrapping it in double quotes. This escapes all characters with code points below 0x20.

  • Precondition: The slice of the byte argument is UTF-8 encoded text.
  • Precondition: There is enough space in the buffer for the result to be written to. A simple way to ensure enough space is to allocate 6N + 2 bytes, where N is the length of the argument. However, the caller may use clever heuristics to find a lower upper bound.
  • Result: The next offset in the destination buffer