cmonad-0.1.1.0: src/Language/CMonad/MonadRef.hs
{-# 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)