@@ -1,13 +1,41 @@
11{-# LANGUAGE BangPatterns #-}
2+{-# LANGUAGE CPP #-}
23
34module Network.Wai.Handler.Warp.IO where
45
5−import Blaze.ByteString.Builder.Internal.Types (Builder(..), BuildSignal(..), BufRange(..), runBuildStep, buildStep)
66import Data.ByteString.Internal (ByteString(..))
77import Foreign.ForeignPtr (newForeignPtr_)
8−import Foreign.Ptr (plusPtr, minusPtr)
98import Network.Wai.Handler.Warp.Buffer
109
10+#if MIN_VERSION_blaze_builder(0,4,0)
11+
12+import Blaze.ByteString.Builder (Builder)
13+import Data.ByteString.Builder.Extra (runBuilder, Next(Done, More, Chunk))
14+
15+toBufIOWith :: Buffer -> BufSize -> (ByteString -> IO ()) -> Builder -> IO ()
16+toBufIOWith buf !size io builder = loop firstWriter
17+ where
18+ firstWriter = runBuilder builder
19+ runIO len = toBS buf len >>= io
20+ loop writer = do
21+ (len, signal) <- writer buf size
22+ case signal of
23+ Done -> runIO len
24+ More minSize next
25+ | size < minSize -> error "toBufIOWith: BufferFull: minSize"
26+ | otherwise -> do
27+ runIO len
28+ loop next
29+ Chunk bs next -> do
30+ runIO len
31+ io bs
32+ loop next
33+
34+#else /* !MIN_VERSION_blaze_builder(0,4,0) */
35+
36+import Blaze.ByteString.Builder.Internal.Types (Builder(..), BuildSignal(..), BufRange(..), runBuildStep, buildStep)
37+import Foreign.Ptr (plusPtr, minusPtr)
38+
1139toBufIOWith :: Buffer -> BufSize -> (ByteString -> IO ()) -> Builder -> IO ()
1240toBufIOWith buf !size io (Builder build) = loop firstStep
1341 where
@@ -29,6 +57,8 @@ toBufIOWith buf !size io (Builder build) = loop firstStep
2957 io bs
3058 loop next
3159
60+#endif /* !MIN_VERSION_blaze_builder(0,4,0) */
61+
3262toBS :: Buffer -> Int -> IO ByteString
3363toBS ptr siz = do
3464 fptr <- newForeignPtr_ ptr