module Data.Reference
(
Reference(..),
)
where
import Control.Concurrent.MVar
import Control.Concurrent.STM
import Control.Monad.ST
import Data.IORef
import Data.STRef
class Monad m => Reference r m where
newRef :: a
-> m (r a)
readRef :: r a
-> m a
writeRef :: r a
-> a
-> m ()
modifyRef :: r a
-> (a -> m (a, b))
-> m b
modifyRef r f = readRef r >>= f >>= \(a, b) -> writeRef r a >> return b
instance Reference IORef IO where
newRef = newIORef
readRef = readIORef
writeRef = writeIORef
instance Reference (STRef s) (ST s) where
newRef = newSTRef
readRef = readSTRef
writeRef = writeSTRef
instance Reference MVar IO where
newRef = newMVar
readRef = readMVar
writeRef = putMVar
modifyRef = modifyMVar
instance Reference TVar STM where
newRef = newTVar
readRef = readTVar
writeRef = writeTVar