packages feed

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)