module Control.Concurrent.MVar.Class where

import Control.Monad.IO.Unlift
import qualified UnliftIO.MVar as MVar

class MVarWrite var where
    putMVar :: MonadIO m => var a -> a -> m ()
    tryPutMVar :: MonadIO m => var a -> a -> m Bool

instance MVarWrite MVar.MVar where
    putMVar = MVar.putMVar
    {-# INLINE putMVar #-}

    tryPutMVar = MVar.tryPutMVar
    {-# INLINE tryPutMVar #-}

class MVarRead var where
    takeMVar :: MonadIO m => var a -> m a
    readMVar :: MonadIO m => var a -> m a
    tryReadMVar :: MonadIO m => var a -> m (Maybe a)
    tryTakeMVar :: MonadIO m => var a -> m (Maybe a)
    withMVar :: MonadUnliftIO m => var a -> (a -> m b) -> m b

instance MVarRead MVar.MVar where
    takeMVar = MVar.takeMVar
    {-# INLINE takeMVar #-}

    readMVar = MVar.readMVar
    {-# INLINE readMVar #-}

    tryReadMVar = MVar.tryReadMVar
    {-# INLINE tryReadMVar #-}

    tryTakeMVar = MVar.tryTakeMVar
    {-# INLINE tryTakeMVar #-}

    withMVar = MVar.withMVar
    {-# INLINE withMVar #-}