1
module Network.Wai.Zlib (compress) where
5
import Data.ByteString (ByteString)
9
compress :: Enumerator -> Enumerator
11
Enumerator $ \iter acc -> do
12
def <- initDeflate 7 $ WindowBits 31
13
compressInner iter acc enum def
15
compressInner :: (acc -> ByteString -> IO (Either acc acc))
19
-> IO (Either acc acc)
20
compressInner iter acc enum def = do
21
eacc <- runEnumerator enum (compressIter iter def) acc
23
Left acc' -> return $ Left acc'
24
Right acc' -> finishStream iter def acc'
26
finishStream :: (acc -> ByteString -> IO (Either acc acc))
29
-> IO (Either acc acc)
30
finishStream iter def acc = finishDeflate def $ drain iter acc
32
compressIter :: (acc -> ByteString -> IO (Either acc acc))
36
-> IO (Either acc acc)
37
compressIter iter def acc bsI = withDeflateInput def bsI $ drain iter acc
39
drain :: (acc -> ByteString -> IO (Either acc acc))
41
-> IO (Maybe ByteString)
42
-> IO (Either acc acc)
43
drain iter acc pop = do
46
Nothing -> return $ Right acc
50
Left acc' -> return $ Left acc'
51
Right acc' -> drain iter acc' pop