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
instance MonadIO m => MonadLock m MVar where
hold = liftIO . takeMVar
fill = liftIO .* putMVar
tryHold = liftIO . tryTakeMVar
tryFill = liftIO .* tryPutMVar
tryRead = liftIO . tryReadMVar
newEmpty = liftIO newEmptyMVar
isEmpty = liftIO . isEmptyMVar
instance MonadIO m => MonadRead m MVar where
read = liftIO . readMVar
instance MonadIO m => MonadWrite m MVar where
write = liftIO .* mask_ .* defaultLockUnsafeWrite
instance MonadIO m => MonadSwap m MVar where
swap = liftIO .* mask_ .* defaultLockUnsafeSwap
instance MonadIO m => MonadMutate_ m MVar where
mutate_ v f = liftIO . mutateM_ v $ return . f
instance MonadIO m => MonadMutate m MVar where
mutate v f = liftIO . mutateM v $ return . f
instance IO ~ io => MonadMutateM_ io IO MVar where
mutateM_ = defaultLockIOMutateM_
instance IO ~ io => MonadMutateM io IO MVar where
mutateM = defaultLockIOMutateM