    -- | Unlifted "Control.Concurrent.MVar".
    --
    -- @since 0.1.0.0
    module UnliftIO.MVar
      ( MVar
      , newEmptyMVar
      , newMVar
      , takeMVar
      , putMVar
      , readMVar
      , swapMVar
      , tryTakeMVar
      , tryPutMVar
      , isEmptyMVar
      , withMVar
      , withMVarMasked
      , modifyMVar
      , modifyMVar_
      , modifyMVarMasked
      , modifyMVarMasked_
      , tryReadMVar
      , mkWeakMVar
      ) where

    import System.Mem.Weak (Weak)
    import Control.Concurrent.MVar (MVar)
    import Control.Monad.IO.Unlift
    import qualified Control.Concurrent.MVar as M

    -- | Lifted 'M.newEmptyMVar'.
    --
    -- @since 0.1.0.0
    newEmptyMVar :: MonadIO m => m (MVar a)
    newEmptyMVar = liftIO M.newEmptyMVar

    -- | Lifted 'M.newMVar'.
    --
    -- @since 0.1.0.0
    newMVar :: MonadIO m => a -> m (MVar a)
    newMVar = liftIO . M.newMVar

    -- | Lifted 'M.takeMVar'.
    --
    -- @since 0.1.0.0
    takeMVar :: MonadIO m => MVar a -> m a
    takeMVar = liftIO . M.takeMVar

    -- | Lifted 'M.putMVar'.
    --
    -- @since 0.1.0.0
    putMVar :: MonadIO m => MVar a -> a -> m ()
    putMVar var = liftIO . M.putMVar var

    -- | Lifted 'M.readMVar'.
    --
    -- @since 0.1.0.0
    readMVar :: MonadIO m => MVar a -> m a
    readMVar = liftIO . M.readMVar

    -- | Lifted 'M.swapMVar'.
    --
    -- @since 0.1.0.0
    swapMVar :: MonadIO m => MVar a -> a -> m a
    swapMVar var = liftIO . M.swapMVar var

    -- | Lifted 'M.tryTakeMVar'.
    --
    -- @since 0.1.0.0
    tryTakeMVar :: MonadIO m => MVar a -> m (Maybe a)
    tryTakeMVar = liftIO . M.tryTakeMVar

    -- | Lifted 'M.tryPutMVar'.
    --
    -- @since 0.1.0.0
    tryPutMVar :: MonadIO m => MVar a -> a -> m Bool
    tryPutMVar var = liftIO . M.tryPutMVar var

    -- | Lifted 'M.isEmptyMVar'.
    --
    -- @since 0.1.0.0
    isEmptyMVar :: MonadIO m => MVar a -> m Bool
    isEmptyMVar = liftIO . M.isEmptyMVar

    -- | Lifted 'M.tryReadMVar'.
    --
    -- @since 0.1.0.0
    tryReadMVar :: MonadIO m => MVar a -> m (Maybe a)
    tryReadMVar = liftIO . M.tryReadMVar

    -- | Unlifted 'M.withMVar'.
    --
    -- @since 0.1.0.0
    withMVar :: MonadUnliftIO m => MVar a -> (a -> m b) -> m b
    withMVar var f = withRunInIO $ \run -> M.withMVar var (run . f)

    -- | Unlifted 'M.withMVarMasked'.
    --
    -- @since 0.1.0.0
    withMVarMasked :: MonadUnliftIO m => MVar a -> (a -> m b) -> m b
    withMVarMasked var f = withRunInIO $ \run -> M.withMVarMasked var (run . f)

    -- | Unlifted 'M.modifyMVar_'.
    --
    -- @since 0.1.0.0
    modifyMVar_ :: MonadUnliftIO m => MVar a -> (a -> m a) -> m ()
    modifyMVar_ var f = withRunInIO $ \run -> M.modifyMVar_ var (run . f)

    -- | Unlifted 'M.modifyMVar'.
    --
    -- @since 0.1.0.0
    modifyMVar :: MonadUnliftIO m => MVar a -> (a -> m (a, b)) -> m b
    modifyMVar var f = withRunInIO $ \run -> M.modifyMVar var (run . f)

    -- | Unlifted 'M.modifyMVarMasked_'.
    --
    -- @since 0.1.0.0
    modifyMVarMasked_ :: MonadUnliftIO m => MVar a -> (a -> m a) -> m ()
    modifyMVarMasked_ var f = withRunInIO $ \run -> M.modifyMVarMasked_ var (run . f)

    -- | Unlifted 'M.modifyMVarMasked'.
    --
    -- @since 0.1.0.0
    modifyMVarMasked :: MonadUnliftIO m => MVar a -> (a -> m (a, b)) -> m b
    modifyMVarMasked var f = withRunInIO $ \run -> M.modifyMVarMasked var (run . f)

    -- | Unlifted 'M.mkWeakMVar'.
    --
    -- @since 0.1.0.0
    mkWeakMVar :: MonadUnliftIO m => MVar a -> m () -> m (Weak (MVar a))
    mkWeakMVar var f = withRunInIO $ \run -> M.mkWeakMVar var (run f)