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 #-}