-------------------------------------------------------------------------- {- | Module : Data.IORef.MonadIO Copyright : (c) 2010 Galois, Inc. License : BSD-style (see the file libraries/base/LICENSE) Maintainer : John Launchbury, john@galois.com Stability : experimental Portability : IO Overloads the standard operations on IORefs, as defined in Data.IORef. This module is name-for-name swappable with Data.IORef unless ghc-specific operations like weak pointers are used. The standard operations on 'IORef' (such as 'newIORef', or 'modifyIORef') are overloaded over the 'MonadIO' class. A monad @m@ is declared an instance of 'MonadIO' by defining a function > liftIO :: IO a -> m a -} -------------------------------------------------------------------------- module Data.IORef.MonadIO ( MonadIO(..) , R.IORef , newIORef , readIORef , writeIORef , modifyIORef , atomicModifyIORef ) where import Control.Monad.Trans(MonadIO(..)) import qualified Data.IORef as R newIORef :: MonadIO io => a -> io (R.IORef a) newIORef x = liftIO $ R.newIORef x readIORef :: MonadIO io => R.IORef a -> io a readIORef r = liftIO $ R.readIORef r writeIORef :: MonadIO io => R.IORef a -> a -> io () writeIORef r x = liftIO $ R.writeIORef r x modifyIORef :: MonadIO io => R.IORef a -> (a -> a) -> io () modifyIORef r f = liftIO $ R.modifyIORef r f atomicModifyIORef :: MonadIO io => R.IORef a -> (a -> (a, b)) -> io b atomicModifyIORef r f = liftIO $ R.atomicModifyIORef r f