packages feed

zlib-bindings-0.0.1: file-test.hs

import Codec.Zlib
import System.Environment (getArgs)
import System.IO
import qualified Data.ByteString as S
import Control.Monad (unless)

main = do
    [action, inFile, outFile] <- getArgs
    withFile inFile ReadMode $ \inH ->
        withFile outFile WriteMode $ \outH ->
            case action of
                "inflate" -> inflate inH outH
                "deflate" -> deflate inH outH

inflate inH outH = do
    inf <- initInflate $ WindowBits 31
    go inf
    bs <- finishInflate inf
    S.hPutStr outH bs
  where
    go inf = do
        bs <- S.hGet inH 1024
        unless (S.null bs) $ do
            withInflateInput inf bs $ writer outH
            go inf

deflate inH outH = do
    def <- initDeflate 7 $ WindowBits 31
    go def
    finishDeflate def $ writer outH
  where
    go def = do
        bs <- S.hGet inH 1024
        unless (S.null bs) $ do
            withDeflateInput def bs $ writer outH
            go def

writer outH pop = do
    mbs <- pop
    case mbs of
        Nothing -> return ()
        Just bs -> do
            S.hPutStr outH bs
            writer outH pop