-- | 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 #-}