packages feed

edentv-4.1.0.0: TinyZipper.lhs

This is -*- Literate Haskell -*-

Our own wrappers around zip file handling in Haskell.

Written by Oleg Lobachev, 2010.

\begin{code}
module TinyZipper where

import Prelude hiding (readFile)
import Codec.Archive.Zip
import Data.ByteString.Lazy (ByteString, readFile)
import System.IO.Unsafe (unsafePerformIO) -- yeah!
import Data.Maybe
\end{code}

We need to read files from a zip archive, if possible: without unpacking it.

Ideal is something like String (with zip file name) -> [FileContents].

\begin{code}
type FileContents = ByteString
readZip :: FilePath -> IO (Either String [FileContents])
readZip filePath = do
    zippedFile <- readFile filePath
    let archive  = toArchive zippedFile
        fileList = filesInArchive archive
        entries  = catMaybes $ zipWith (findEntryByPath) fileList (repeat archive)
        files    = map (fromEntry) entries
    return $ seq files $ Right files
\end{code}