{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-} module Language.CMonad.MonadRef where import Data.IORef import Data.STRef import Control.Monad.ST(ST) class (Monad m) => MonadRef m r | m -> r, r -> m where newRef :: a -> m (r a) readRef :: r a -> m a writeRef :: r a -> a -> m () instance MonadRef IO IORef where {-# INLINE newRef #-} newRef = newIORef {-# INLINE readRef #-} readRef = readIORef {-# INLINE writeRef #-} writeRef = writeIORef instance MonadRef (ST s) (STRef s) where {-# INLINE newRef #-} newRef = newSTRef {-# INLINE readRef #-} readRef = readSTRef {-# INLINE writeRef #-} writeRef = writeSTRef