To turn a FixedPrim into a strict ByteString, with the current public interface I can do something like this:
myTypePrim :: FixedPrim MyType
myTypeToLazyByteString :: MyType -> BL.ByteString
myTypeToLazyByteString =
-- Some kind of allocation strategy to create a chunk of desired size
BB.toLazyByteStringWith (BB.untrimmedStrategy 36 BB.defaultChunkSize) mempty
. BBP.primFixed myTypePrim
-- Makes a copy with memcmp
myTypeToStrictByteString :: MyType -> BS.ByteString
myTypeToStrictByteString = toStrict . myTypeToLazyByteString
Once primFixed :: FixedPrim a -> a -> Builder converts a value to Builder, there are only utilities to convert it into a lazy bytestring.
One alternative is to use runF :: FixedPrim a -> a -> Ptr Word8 -> IO () together with create :: create :: Int -> (Ptr Word8 -> IO ()) -> IO ByteString but that relies on two internal modules Data.ByteString.Builder.Prim.Internal and Data.ByteString.Internal.
I propose three solutions:
- Create function
Builder -> Ptr Word8 -> IO ()
- Export
runF :: FixedPrim a -> a -> Ptr Word8 -> IO () from the public module Data.ByteString.Builder.Prim.
- Create function
primToByteString :: FixedPrim a -> a -> ByteString that creates a strict bytestring right away.
For both 1 and 2 the code would rely on the create from the semi-public module Data.ByteString.Internal.
For the context, the benchmarking in haskell-hvr/uuid#80 shows that the overhead of copy from toStrict slows down the conversion by 40% (28ns vs 20ns).
To turn a FixedPrim into a strict ByteString, with the current public interface I can do something like this:
Once
primFixed :: FixedPrim a -> a -> Builderconverts a value toBuilder, there are only utilities to convert it into a lazy bytestring.One alternative is to use
runF :: FixedPrim a -> a -> Ptr Word8 -> IO ()together withcreate :: create :: Int -> (Ptr Word8 -> IO ()) -> IO ByteStringbut that relies on two internal modulesData.ByteString.Builder.Prim.InternalandData.ByteString.Internal.I propose three solutions:
Builder -> Ptr Word8 -> IO ()runF :: FixedPrim a -> a -> Ptr Word8 -> IO ()from the public moduleData.ByteString.Builder.Prim.primToByteString :: FixedPrim a -> a -> ByteStringthat creates a strict bytestring right away.For both 1 and 2 the code would rely on the
createfrom the semi-public moduleData.ByteString.Internal.For the context, the benchmarking in haskell-hvr/uuid#80 shows that the overhead of copy from
toStrictslows down the conversion by 40% (28ns vs 20ns).