streaming-wai 0.1.0 → 0.1.1
raw patch · 2 files changed
+23/−9 lines, 2 files
Files
- src/Network/Wai/Streaming.hs +22/−8
- streaming-wai.cabal +1/−1
src/Network/Wai/Streaming.hs view
@@ -2,6 +2,7 @@ module Network.Wai.Streaming ( Flush(..) -- * ByteStrings+ , streamingRequest , streamingResponse , streamingBody @@ -13,17 +14,30 @@ import Streaming import Network.Wai+import Control.Monad (unless) import Data.ByteString (ByteString) import Data.ByteString.Builder (byteString, Builder) import Network.HTTP.Types.Header import Network.HTTP.Types.Status import Streaming.Prelude as S+import Data.ByteString as BS -data Flush a = Chunk !a+data Flush a = Chunk a | Flush deriving (Show, Functor) +-- | Stream the 'Request' body+streamingRequest :: MonadIO m => Request -> Stream (Of ByteString) m ()+streamingRequest req = loop+ where+ go = liftIO (requestBody req)+ loop = do+ bs <- go+ unless (BS.null bs) $ do+ yield bs+ loop + -- | Stream strict 'ByteString's into a 'Response' streamingResponse :: Stream (Of ByteString) IO r -> Status@@ -35,11 +49,11 @@ -- | Stream strict 'ByteString's into a 'StreamingBody' streamingBody :: Stream (Of ByteString) IO r -> StreamingBody-streamingBody src write flush = S.foldM_ writer flush return src+streamingBody src write flush = void $ effects $ for src writer where- writer _ a = do- write (byteString a)- flush+ writer a = do+ lift (write (byteString a))+ lift flush -- $flush --@@ -56,7 +70,7 @@ -- | Stream 'Builder's into a 'StreamingBody' streamingBodyF :: Stream (Of (Flush Builder)) IO r -> StreamingBody-streamingBodyF src write flush = S.foldM_ writer flush return src+streamingBodyF src write flush = void $ effects $ for src writer where- writer _ (Chunk a) = write a- writer _ Flush = flush+ writer (Chunk a) = lift (write a)+ writer Flush = lift flush
streaming-wai.cabal view
@@ -1,5 +1,5 @@ name: streaming-wai-version: 0.1.0+version: 0.1.1 synopsis: Streaming Wai utilities description: Please see README.md homepage: http://github.com/jb55/streaming-wai