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 :: a -> m (IORef a)
new = IO (IORef a) -> m (IORef a)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (IORef a) -> m (IORef a))
-> (a -> IO (IORef a)) -> a -> m (IORef a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> IO (IORef a)
forall a. a -> IO (IORef a)
newIORef
  {-# INLINE new #-}

instance MonadIO m => MonadRead  m IORef where
  read :: IORef a -> m a
read = IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO a -> m a) -> (IORef a -> IO a) -> IORef a -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IORef a -> IO a
forall a. IORef a -> IO a
readIORef
  {-# INLINE read #-}

instance MonadIO m => MonadWrite m IORef where
  write :: IORef a -> a -> m ()
write = IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> (IORef a -> a -> IO ()) -> IORef a -> a -> m ()
forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
.* IORef a -> a -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef
  {-# INLINE write #-}

instance MonadIO m => MonadSwap  m IORef where
  swap :: IORef a -> a -> m a
swap = IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO a -> m a) -> (IORef a -> a -> IO a) -> IORef a -> a -> m a
forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
.* IORef a -> a -> IO a
forall (m :: * -> *) (v :: * -> *) a.
(MonadRead m v, MonadWrite m v) =>
v a -> a -> m a
defaultReadWriteSwap
  {-# INLINE swap #-}

instance MonadIO m => MonadMutate_ m IORef where
  mutate_ :: IORef a -> (a -> a) -> m ()
mutate_ = IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ())
-> (IORef a -> (a -> a) -> IO ()) -> IORef a -> (a -> a) -> m ()
forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
.* IORef a -> (a -> a) -> IO ()
forall (m :: * -> *) (v :: * -> *) a.
(MonadRead m v, MonadWrite m v) =>
v a -> (a -> a) -> m ()
defaultReadWriteMutate_
  {-# INLINE mutate_ #-}

instance MonadIO m => MonadMutate  m IORef where
  mutate :: IORef a -> (a -> (a, b)) -> m b
mutate = IO b -> m b
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO b -> m b)
-> (IORef a -> (a -> (a, b)) -> IO b)
-> IORef a
-> (a -> (a, b))
-> m b
forall c d a b. (c -> d) -> (a -> b -> c) -> a -> b -> d
.* IORef a -> (a -> (a, b)) -> IO b
forall (m :: * -> *) (v :: * -> *) a b.
(MonadRead m v, MonadWrite m v) =>
v a -> (a -> (a, b)) -> m b
defaultReadWriteMutate
  {-# INLINE mutate #-}

instance IO ~ io => MonadMutateM_ io IO IORef where
  mutateM_ :: IORef a -> (a -> io a) -> IO ()
mutateM_ = IORef a -> (a -> io a) -> IO ()
forall (m :: * -> *) (v :: * -> *) a.
(MonadRead m v, MonadWrite m v) =>
v a -> (a -> m a) -> m ()
defaultReadWriteMutateM_
  {-# INLINE mutateM_ #-}

instance IO ~ io => MonadMutateM  io IO IORef where
  mutateM :: IORef a -> (a -> io (a, b)) -> IO b
mutateM = IORef a -> (a -> io (a, b)) -> IO b
forall (m :: * -> *) (v :: * -> *) a b.
(MonadRead m v, MonadWrite m v) =>
v a -> (a -> m (a, b)) -> m b
defaultReadWriteMutateM
  {-# INLINE mutateM #-}