module Data.Conduit.VFS.Zip.Import (
createDiskZipVFS,
emptyZipVFS,
createZipVFS
) where
import ClassyPrelude hiding (finally)
import Data.Conduit.VFS.Zip.Types
import Conduit
import Control.Monad.State.Lazy
import Codec.Archive.Zip (Archive, toArchive, fromArchive, emptyArchive)
import qualified Data.ByteString.Lazy as LBS
import Control.Monad.Trans.Resource (allocate)
import UnliftIO.Directory (doesFileExist)
import Control.Monad.Extra (ifM)
createDiskZipVFS :: (MonadResource m) => FilePath -> m (ZipVFS m Archive)
createDiskZipVFS archiveFilePath = createZipVFS . snd <$> allocate readArchive writeArchive
where
readArchive =
ifM
(doesFileExist archiveFilePath)
(toArchive <$> LBS.readFile archiveFilePath)
(return emptyArchive)
writeArchive = LBS.writeFile archiveFilePath . fromArchive
{-# INLINEABLE createDiskZipVFS #-}
emptyZipVFS :: (Applicative m) => ZipVFS m Archive
emptyZipVFS = createZipVFS emptyArchive
{-# INLINE emptyZipVFS #-}
createZipVFS :: (Applicative m) => Archive -> ZipVFS m Archive
createZipVFS archive = ZipVFS $ StateT stateImpl
where
stateImpl = const $ pure (archive, archive)
{-# INLINE createZipVFS #-}