33 lines
1.2 KiB
Haskell
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
|