ghcup-hs/3rdparty/libarchive/src/Codec/Archive/Common.hs

33 lines
1.2 KiB
Haskell

module Codec.Archive.Common ( actFree
, actFreeCallback
, hmemcpy
) where
import Codec.Archive.Foreign
import Codec.Archive.Monad (ArchiveM, bracketM)
import Control.Composition ((.**))
import Control.Monad (void)
import Control.Monad.IO.Class (MonadIO (..))
import Foreign.C.Types (CSize (..))
import Foreign.Ptr
foreign import ccall memcpy :: Ptr a -- ^ Destination
-> Ptr b -- ^ Source
-> CSize -- ^ Size
-> IO (Ptr a) -- ^ Pointer to destination
hmemcpy :: Ptr a -> Ptr b -> CSize -> IO ()
hmemcpy = void .** memcpy
-- | Do something with an 'Archive' and then free it
actFree :: IO (Ptr Archive)
-> (Ptr Archive -> ArchiveM a)
-> ArchiveM a
actFree get = bracketM get archiveFree
actFreeCallback :: MonadIO m
=> (Ptr Archive -> m a)
-> (Ptr Archive, IO ()) -- ^ 'Ptr' to an 'Archive' and an 'IO' action to clean up when done
-> m a
actFreeCallback fact (a, freeAct) = fact a <* liftIO (archiveFree a) <* liftIO freeAct