{-# 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