module Control.Monad.Par.Meta.HotVar.IORef ( HotVar
                                           , modifyHotVar
                                           , modifyHotVar_
                                           , newHotVar
                                           , readHotVar
                                           , readHotVarRaw
                                           , writeHotVar
                                           , writeHotVarRaw
                                           ) where
import Data.IORef
newHotVar      :: a -> IO (HotVar a)
modifyHotVar   :: HotVar a -> (a -> (a,b)) -> IO b
modifyHotVar_  :: HotVar a -> (a -> a) -> IO ()
writeHotVar    :: HotVar a -> a -> IO ()
readHotVar     :: HotVar a -> IO a
type HotVar a = IORef a
newHotVar     = newIORef
modifyHotVar  = atomicModifyIORef
modifyHotVar_ v fn = atomicModifyIORef v (\a -> (fn a, ()))
readHotVar    = readIORef
writeHotVar   = writeIORef
instance Show (HotVar a) where 
  show _ = "<ioref>"
readHotVarRaw  :: HotVar a -> IO a
writeHotVarRaw :: HotVar a -> a -> IO ()
readHotVarRaw  = readHotVar
writeHotVarRaw = writeHotVar