{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, KindSignatures #-} module Language.CMonad.MonadRef where import Control.Monad.ST import Data.IORef import Data.STRef import Data.Array.ST import Data.Array.IO 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 class TheArray (m :: * -> *) (arr :: * -> * -> *) | m -> arr instance TheArray IO IOArray instance TheArray (ST s) (STArray s)