module MonadVar.Instances.MVar where

import           MonadVar.Prelude
import           MonadVar.Classes
import           MonadVar.Default
import           Control.Concurrent.MVar

instance MonadIO m => MonadNew   m MVar where
  new = liftIO . newMVar
  {-# INLINE new #-}

instance MonadIO m => MonadLock  m MVar where
  hold     = liftIO . takeMVar
  {-# INLINE hold #-}

  fill     = liftIO .* putMVar
  {-# INLINE fill #-}

  tryHold  = liftIO . tryTakeMVar
  {-# INLINE tryHold #-}

  tryFill  = liftIO .* tryPutMVar
  {-# INLINE tryFill #-}

  tryRead  = liftIO . tryReadMVar
  {-# INLINE tryRead #-}

  newEmpty = liftIO newEmptyMVar
  {-# INLINE newEmpty #-}

  isEmpty  = liftIO . isEmptyMVar
  {-# INLINE isEmpty #-}

instance MonadIO m => MonadRead  m MVar where
  read = liftIO . readMVar
  {-# INLINE read #-}

instance MonadIO m => MonadWrite m MVar where
  write = liftIO .* mask_ .* defaultLockUnsafeWrite
  {-# INLINE write #-}

instance MonadIO m => MonadSwap  m MVar where
  swap = liftIO .* mask_ .* defaultLockUnsafeSwap
  {-# INLINE swap #-}

instance MonadIO m => MonadMutate_ m MVar where
  mutate_ v f = liftIO . mutateM_ v $ return . f
  {-# INLINE mutate_ #-}

instance MonadIO m => MonadMutate  m MVar where
  mutate v f = liftIO . mutateM v $ return . f
  {-# INLINE mutate #-}

instance IO ~ io => MonadMutateM_ io IO MVar where
  mutateM_ = defaultLockIOMutateM_
  {-# INLINE mutateM_ #-}

instance IO ~ io => MonadMutateM  io IO MVar where
  mutateM = defaultLockIOMutateM
  {-# INLINE mutateM #-}