http-enumerator-0.2.0: Network/HTTP/Enumerator/Zlib.hs
module Network.HTTP.Enumerator.Zlib
( ungzip
) where
import Prelude hiding (head)
import Data.Enumerator
import qualified Data.ByteString as S
import Control.Monad.IO.Class (MonadIO (liftIO))
import Control.Monad.Trans.Class (lift)
import Codec.Zlib
ungzip :: MonadIO m => Enumeratee S.ByteString S.ByteString m b
ungzip inner = do
fzstr <- liftIO $ initInflate $ WindowBits 31
ungzip' fzstr inner
ungzip' :: MonadIO m => Inflate -> Enumeratee S.ByteString S.ByteString m b
ungzip' fzstr (Continue k) = do
x <- head
case x of
Nothing -> do
chunk <- liftIO $ finishInflate fzstr
lift $ runIteratee $ k $ Chunks [chunk]
Just bs -> do
chunks <- liftIO $ withInflateInput fzstr bs $ go id
step <- lift $ runIteratee $ k $ Chunks chunks
ungzip' fzstr step
where
go front pop = do
x <- pop
case x of
Nothing -> return $ front []
Just y -> go (front . (:) y) pop
ungzip' _ step = return step