bytezap-1.3.0: Bytestring builder with zero intermediate allocation
Safe HaskellSafe-Inferred
LanguageGHC2021

Bytezap.Poke

Synopsis

Documentation

type Poke# s = Addr# -> Int# -> State# s -> (# State# s, Int# #) Source #

newtype Poke s Source #

Poke newtype wrapper.

Constructors

Poke 

Fields

Instances

Instances details
Monoid (Poke s) Source # 
Instance details

Defined in Bytezap.Poke

Methods

mempty :: Poke s #

mappend :: Poke s -> Poke s -> Poke s #

mconcat :: [Poke s] -> Poke s #

Semigroup (Poke s) Source #

Sequence two Pokes left-to-right.

Instance details

Defined in Bytezap.Poke

Methods

(<>) :: Poke s -> Poke s -> Poke s #

sconcat :: NonEmpty (Poke s) -> Poke s #

stimes :: Integral b => b -> Poke s -> Poke s #

unsafeRunPokeBS :: Int -> Poke RealWorld -> ByteString Source #

Execute a Poke at a fresh ByteString of the given length.

unsafeRunPokeBSUptoN :: Int -> Poke RealWorld -> ByteString Source #

Execute a Poke at a fresh ByteString of the given maximum length. Does not reallocate if final size is less than estimated.

unsafeRunPoke :: MonadPrim s m => Poke s -> Ptr Word8 -> m Int Source #

Execute a Poke at a pointer. Returns the number of bytes written.

The pointer must be a mutable buffer with enough space to hold the poke. Absolutely none of this is checked. Use with caution. Sensible uses:

  • implementing pokes to ByteStrings and the like
  • executing known-length (!!) pokes to known-length (!!) buffers e.g. together with allocaBytes

prim :: forall a s. Prim' a => a -> Poke s Source #

Poke a type via its Prim' instance.

replicateByte :: Int -> Word8 -> Poke RealWorld Source #

essentially memset

fromStructPoke :: Int -> Poke s -> Poke s Source #

Use a struct poke as a regular poke.

To do this, we must associate a constant byte length with an existing poker. Note that pokers don't expose the type of the data they are serializing, so this is a very clumsy operation by itself. You should only be using this when you have such types in scope, and the constant length should be obtained in a sensible manner (e.g. KnownSizeOf for generic struct pokers, or your own constant size class if you're doing funky stuff).

toStructPoke :: Poke s -> Poke s Source #

Use a struct poke as a regular poke by throwing away the return offset.