1{-# LANGUAGE CPP #-} 2{-# LANGUAGE NoImplicitPrelude #-} 3{-# LANGUAGE FlexibleContexts #-} 4 5#if __GLASGOW_HASKELL__ >= 704 6{-# LANGUAGE Safe #-} 7#endif 8 9{- | 10Module : Data.IORef 11Copyright : Liyang HU, Bas van Dijk 12License : BSD-style 13 14Maintainer : Bas van Dijk <v.dijk.bas@gmail.com> 15Stability : experimental 16 17This is a wrapped version of "Data.IORef" with types 18generalised from 'IO' to all monads in 'MonadBase'. 19-} 20 21module Data.IORef.Lifted 22 ( IORef 23 , newIORef 24 , readIORef 25 , writeIORef 26 , modifyIORef 27#if MIN_VERSION_base(4,6,0) 28 , modifyIORef' 29#endif 30 , atomicModifyIORef 31#if MIN_VERSION_base(4,6,0) 32 , atomicModifyIORef' 33 , atomicWriteIORef 34#endif 35 , mkWeakIORef 36 ) where 37 38-------------------------------------------------------------------------------- 39-- Imports 40-------------------------------------------------------------------------------- 41 42-- from base: 43import Data.IORef ( IORef ) 44import qualified Data.IORef as R 45import System.IO ( IO ) 46import System.Mem.Weak ( Weak ) 47import Prelude ( (.) ) 48 49-- from transformers-base: 50import Control.Monad.Base ( MonadBase, liftBase ) 51 52-- from monad-control: 53import Control.Monad.Trans.Control ( MonadBaseControl, liftBaseDiscard ) 54 55#include "inlinable.h" 56 57-------------------------------------------------------------------------------- 58-- * IORefs 59-------------------------------------------------------------------------------- 60 61-- | Generalized version of 'R.newIORef'. 62newIORef :: MonadBase IO m => a -> m (IORef a) 63newIORef = liftBase . R.newIORef 64{-# INLINABLE newIORef #-} 65 66-- | Generalized version of 'R.readIORef'. 67readIORef :: MonadBase IO m => IORef a -> m a 68readIORef = liftBase . R.readIORef 69{-# INLINABLE readIORef #-} 70 71-- | Generalized version of 'R.writeIORef'. 72writeIORef :: MonadBase IO m => IORef a -> a -> m () 73writeIORef r = liftBase . R.writeIORef r 74{-# INLINABLE writeIORef #-} 75 76-- | Generalized version of 'R.modifyIORef'. 77modifyIORef :: MonadBase IO m => IORef a -> (a -> a) -> m () 78modifyIORef r = liftBase . R.modifyIORef r 79{-# INLINABLE modifyIORef #-} 80 81-- | Generalized version of 'R.atomicModifyIORef'. 82atomicModifyIORef :: MonadBase IO m => IORef a -> (a -> (a, b)) -> m b 83atomicModifyIORef r = liftBase . R.atomicModifyIORef r 84{-# INLINABLE atomicModifyIORef #-} 85 86#if MIN_VERSION_base(4,6,0) 87-- | Generalized version of 'R.modifyIORef''. 88modifyIORef' :: MonadBase IO m => IORef a -> (a -> a) -> m () 89modifyIORef' r = liftBase . R.modifyIORef' r 90{-# INLINABLE modifyIORef' #-} 91 92-- | Generalized version of 'R.atomicModifyIORef''. 93atomicModifyIORef' :: MonadBase IO m => IORef a -> (a -> (a, b)) -> m b 94atomicModifyIORef' r = liftBase . R.atomicModifyIORef' r 95{-# INLINABLE atomicModifyIORef' #-} 96 97-- | Generalized version of 'R.atomicWriteIORef'. 98atomicWriteIORef :: MonadBase IO m => IORef a -> a -> m () 99atomicWriteIORef r = liftBase . R.atomicWriteIORef r 100#endif 101 102-- | Generalized version of 'R.mkWeakIORef'. 103-- 104-- Note any monadic side effects in @m@ of the \"finalizer\" computation 105-- are discarded. 106mkWeakIORef :: MonadBaseControl IO m => IORef a -> m () -> m (Weak (IORef a)) 107mkWeakIORef = liftBaseDiscard . R.mkWeakIORef 108{-# INLINABLE mkWeakIORef #-} 109