content: -- | 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)
  