1-- | Unlifted "Data.IORef".
2--
3-- @since 0.1.0.0
4module UnliftIO.IORef
5  ( IORef
6  , newIORef
7  , readIORef
8  , writeIORef
9  , modifyIORef
10  , modifyIORef'
11  , atomicModifyIORef
12  , atomicModifyIORef'
13  , atomicWriteIORef
14  , mkWeakIORef
15  ) where
16
17import Data.IORef (IORef)
18import qualified Data.IORef as I
19import Control.Monad.IO.Unlift
20import System.Mem.Weak (Weak)
21
22-- | Lifted 'I.newIORef'.
23--
24-- @since 0.1.0.0
25newIORef :: MonadIO m => a -> m (IORef a)
26newIORef = liftIO . I.newIORef
27
28-- | Lifted 'I.readIORef'.
29--
30-- @since 0.1.0.0
31readIORef :: MonadIO m => IORef a -> m a
32readIORef = liftIO . I.readIORef
33
34-- | Lifted 'I.writeIORef'.
35--
36-- @since 0.1.0.0
37writeIORef :: MonadIO m => IORef a -> a -> m ()
38writeIORef ref = liftIO . I.writeIORef ref
39
40-- | Lifted 'I.modifyIORef'.
41--
42-- @since 0.1.0.0
43modifyIORef :: MonadIO m => IORef a -> (a -> a) -> m ()
44modifyIORef ref = liftIO . I.modifyIORef ref
45
46-- | Lifted 'I.modifyIORef''.
47--
48-- @since 0.1.0.0
49modifyIORef' :: MonadIO m => IORef a -> (a -> a) -> m ()
50modifyIORef' ref = liftIO . I.modifyIORef' ref
51
52-- | Lifted 'I.atomicModifyIORef'.
53--
54-- @since 0.1.0.0
55atomicModifyIORef :: MonadIO m => IORef a -> (a -> (a, b)) -> m b
56atomicModifyIORef ref = liftIO . I.atomicModifyIORef ref
57
58-- | Lifted 'I.atomicModifyIORef''.
59--
60-- @since 0.1.0.0
61atomicModifyIORef' :: MonadIO m => IORef a -> (a -> (a, b)) -> m b
62atomicModifyIORef' ref = liftIO . I.atomicModifyIORef' ref
63
64-- | Lifted 'I.atomicWriteIORef'.
65--
66-- @since 0.1.0.0
67atomicWriteIORef :: MonadIO m => IORef a -> a -> m ()
68atomicWriteIORef ref = liftIO . I.atomicWriteIORef ref
69
70-- | Unlifted 'I.mkWeakIORef'.
71--
72-- @since 0.1.0.0
73mkWeakIORef :: MonadUnliftIO m => IORef a -> m () -> m (Weak (IORef a))
74mkWeakIORef ref final = withRunInIO $ \run -> I.mkWeakIORef ref (run final)
75