module MonadVar.Instances.IORef where

import           MonadVar.Prelude
import           MonadVar.Classes
import           MonadVar.Default
import           Data.IORef

instance MonadIO m => MonadNew   m IORef where
  new = liftIO . newIORef
  {-# INLINE new #-}

instance MonadIO m => MonadRead  m IORef where
  read = liftIO . readIORef
  {-# INLINE read #-}

instance MonadIO m => MonadWrite m IORef where
  write = liftIO .* writeIORef
  {-# INLINE write #-}

instance MonadIO m => MonadSwap  m IORef where
  swap = liftIO .* defaultReadWriteSwap
  {-# INLINE swap #-}

instance MonadIO m => MonadMutate_ m IORef where
  mutate_ = liftIO .* defaultReadWriteMutate_
  {-# INLINE mutate_ #-}

instance MonadIO m => MonadMutate  m IORef where
  mutate = liftIO .* defaultReadWriteMutate
  {-# INLINE mutate #-}

instance IO ~ io => MonadMutateM_ io IO IORef where
  mutateM_ = defaultReadWriteMutateM_
  {-# INLINE mutateM_ #-}

instance IO ~ io => MonadMutateM  io IO IORef where
  mutateM = defaultReadWriteMutateM
  {-# INLINE mutateM #-}