-- | Convert a stream of blaze-builder @Builder@s into a stream of @ByteString@s. -- -- Adapted from blaze-builder-enumerator, written by myself and Simon Meier. -- -- Note that the functions here can work in any monad built on top of @IO@ or -- @ST@. -- -- Since 1.1.7.0, the functions here call their counterparts in -- "Data.Conduit.ByteString.Builder", which work with both -- 'Data.ByteString.Builder.Builder' and blaze-builder 0.3's -- 'Blaze.ByteString.Builder.Builder'. module Data.Conduit.Blaze ( -- * Conduits from builders to bytestrings builderToByteString , unsafeBuilderToByteString , builderToByteStringWith -- ** Flush , builderToByteStringFlush , builderToByteStringWithFlush -- * Buffers , B.Buffer -- ** Status information , B.freeSize , B.sliceSize , B.bufferSize -- ** Creation and modification , B.allocBuffer , B.reuseBuffer , B.nextSlice -- ** Conversion to bytestings , B.unsafeFreezeBuffer , B.unsafeFreezeNonEmptyBuffer -- * Buffer allocation strategies , B.BufferAllocStrategy , B.allNewBuffersStrategy , B.reuseBufferStrategy ) where import Data.Conduit import qualified Data.ByteString as S import Blaze.ByteString.Builder (Builder) import Control.Monad.Primitive (PrimMonad) import Control.Monad.Base (MonadBase) import Data.Streaming.Blaze import qualified Data.Conduit.ByteString.Builder as B -- | Incrementally execute builders and pass on the filled chunks as -- bytestrings. builderToByteString :: (MonadBase base m, PrimMonad base) => Conduit Builder m S.ByteString builderToByteString = B.builderToByteString {-# INLINE builderToByteString #-} -- | -- -- Since 0.0.2 builderToByteStringFlush :: (MonadBase base m, PrimMonad base) => Conduit (Flush Builder) m (Flush S.ByteString) builderToByteStringFlush = B.builderToByteStringFlush {-# INLINE builderToByteStringFlush #-} -- | Incrementally execute builders on the given buffer and pass on the filled -- chunks as bytestrings. Note that, if the given buffer is too small for the -- execution of a build step, a larger one will be allocated. -- -- WARNING: This conduit yields bytestrings that are NOT -- referentially transparent. Their content will be overwritten as soon -- as control is returned from the inner sink! unsafeBuilderToByteString :: (MonadBase base m, PrimMonad base) => IO Buffer -- action yielding the inital buffer. -> Conduit Builder m S.ByteString unsafeBuilderToByteString = B.unsafeBuilderToByteString {-# INLINE unsafeBuilderToByteString #-} -- | A conduit that incrementally executes builders and passes on the -- filled chunks as bytestrings to an inner sink. -- -- INV: All bytestrings passed to the inner sink are non-empty. builderToByteStringWith :: (MonadBase base m, PrimMonad base) => BufferAllocStrategy -> Conduit Builder m S.ByteString builderToByteStringWith = B.builderToByteStringWith {-# INLINE builderToByteStringWith #-} -- | -- -- Since 0.0.2 builderToByteStringWithFlush :: (MonadBase base m, PrimMonad base) => BufferAllocStrategy -> Conduit (Flush Builder) m (Flush S.ByteString) builderToByteStringWithFlush = B.builderToByteStringWithFlush {-# INLINE builderToByteStringWithFlush #-}