packages feed

resourcet-1.3.0: UnliftIO/Resource.hs

-- | Unlifted "Control.Monad.Trans.Resource".
--
-- @since 1.1.10
module UnliftIO.Resource
  ( -- * UnliftIO variants
    runResourceT
  , liftResourceT
  , allocateU
    -- * Reexports
  , module Control.Monad.Trans.Resource
  ) where

import qualified Control.Monad.Trans.Resource as Res
import Control.Monad.Trans.Resource.Internal (ResourceT (..))
import Control.Monad.IO.Unlift
import Control.Monad.Trans.Resource (ResourceT, ReleaseKey, allocate, register, release, unprotect, MonadResource)

-- | Unlifted version of 'Res.runResourceT'.
--
-- @since 1.1.10
runResourceT :: MonadUnliftIO m => ResourceT m a -> m a
runResourceT m = withRunInIO $ \run -> Res.runResourceT $ Res.transResourceT run m

-- | Lifted version of 'Res.liftResourceT'.
--
-- @since 1.1.10
liftResourceT :: MonadIO m => ResourceT IO a -> ResourceT m a
liftResourceT (ResourceT f) = ResourceT $ liftIO . f

-- | Unlifted 'allocate'.
--
-- @since 1.2.6
allocateU
  :: (MonadUnliftIO m, MonadResource m)
  => m a
  -> (a -> m ())
  -> m (ReleaseKey, a)
allocateU alloc free = withRunInIO $ \run ->
  run $ allocate (run alloc) (run . free)