content: {-# LANGUAGE Safe #-}
  
  -- | Lifted reexports from 'Data.IORef' module.
  
  module Universum.Lifted.IORef
         ( IORef
         , atomicModifyIORef
         , atomicModifyIORef'
         , atomicWriteIORef
         , modifyIORef
         , modifyIORef'
         , newIORef
         , readIORef
         , writeIORef
         ) where
  
  import Control.Monad.Trans (MonadIO, liftIO)
  import Data.Function (($), (.))
  import Data.IORef (IORef)
  
  import qualified Data.IORef as Ref (atomicModifyIORef, atomicModifyIORef', atomicWriteIORef,
                                      modifyIORef, modifyIORef', newIORef, readIORef, writeIORef)
  
  -- | Lifted version of 'Ref.newIORef'.
  newIORef :: MonadIO m => a -> m (IORef a)
  newIORef = liftIO . Ref.newIORef
  {-# INLINE newIORef #-}
  
  -- | Lifted version of 'Ref.readIORef'.
  readIORef :: MonadIO m => IORef a -> m a
  readIORef = liftIO . Ref.readIORef
  {-# INLINE readIORef #-}
  
  -- | Lifted version of 'Ref.writeIORef'.
  writeIORef :: MonadIO m => IORef a -> a -> m ()
  writeIORef ref what = liftIO $ Ref.writeIORef ref what
  {-# INLINE writeIORef #-}
  
  -- | Lifted version of 'Ref.modifyIORef'.
  modifyIORef :: MonadIO m => IORef a -> (a -> a) -> m ()
  modifyIORef ref how = liftIO $ Ref.modifyIORef ref how
  {-# INLINE modifyIORef #-}
  
  -- | Lifted version of 'Ref.modifyIORef''.
  modifyIORef' :: MonadIO m => IORef a -> (a -> a) -> m ()
  modifyIORef' ref how = liftIO $ Ref.modifyIORef' ref how
  {-# INLINE modifyIORef' #-}
  
  -- | Lifted version of 'Ref.atomicModifyIORef'.
  atomicModifyIORef :: MonadIO m => IORef a -> (a -> (a, b)) -> m b
  atomicModifyIORef ref how = liftIO $ Ref.atomicModifyIORef ref how
  {-# INLINE atomicModifyIORef #-}
  
  -- | Lifted version of 'Ref.atomicModifyIORef''.
  atomicModifyIORef' :: MonadIO m => IORef a -> (a -> (a, b)) -> m b
  atomicModifyIORef' ref how = liftIO $ Ref.atomicModifyIORef' ref how
  {-# INLINE atomicModifyIORef' #-}
  
  -- | Lifted version of 'Ref.atomicWriteIORef'.
  atomicWriteIORef :: MonadIO m => IORef a -> a -> m ()
  atomicWriteIORef ref what = liftIO $ Ref.atomicWriteIORef ref what
  {-# INLINE atomicWriteIORef #-}
  