{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE CPP #-}

module Network.Wai.Handler.Warp.IO where

import Data.ByteString.Builder (Builder)
import Data.ByteString.Builder.Extra (runBuilder, Next(Done, More, Chunk))

import Network.Wai.Handler.Warp.Buffer
import Network.Wai.Handler.Warp.Imports
import Network.Wai.Handler.Warp.Types

toBufIOWith :: Buffer -> BufSize -> (ByteString -> IO ()) -> Builder -> IO ()
toBufIOWith :: Buffer -> BufSize -> (ByteString -> IO ()) -> Builder -> IO ()
toBufIOWith buf :: Buffer
buf !BufSize
size io :: ByteString -> IO ()
io builder :: Builder
builder = BufferWriter -> IO ()
loop BufferWriter
firstWriter
  where
    firstWriter :: BufferWriter
firstWriter = Builder -> BufferWriter
runBuilder Builder
builder
    runIO :: BufSize -> IO ()
runIO len :: BufSize
len = Buffer -> BufSize -> (ByteString -> IO ()) -> IO ()
bufferIO Buffer
buf BufSize
len ByteString -> IO ()
io
    loop :: BufferWriter -> IO ()
loop writer :: BufferWriter
writer = do
        (len :: BufSize
len, signal :: Next
signal) <- BufferWriter
writer Buffer
buf BufSize
size
        case Next
signal of
             Done -> BufSize -> IO ()
runIO BufSize
len
             More minSize :: BufSize
minSize next :: BufferWriter
next
               | BufSize
size BufSize -> BufSize -> Bool
forall a. Ord a => a -> a -> Bool
< BufSize
minSize -> [Char] -> IO ()
forall a. HasCallStack => [Char] -> a
error "toBufIOWith: BufferFull: minSize"
               | Bool
otherwise      -> do
                   BufSize -> IO ()
runIO BufSize
len
                   BufferWriter -> IO ()
loop BufferWriter
next
             Chunk bs :: ByteString
bs next :: BufferWriter
next -> do
                 BufSize -> IO ()
runIO BufSize
len
                 ByteString -> IO ()
io ByteString
bs
                 BufferWriter -> IO ()
loop BufferWriter
next