module Data.Ref(Ref(..), module Data.Ref.CAS )where
import qualified Data.IORef as IR
import qualified Data.STRef.Strict as SR
import Control.Monad.ST.Safe (ST)
import Data.Ref.CAS
import Control.Monad
class Ref ref where
type RefM ref :: * -> *
newRef :: a -> RefM ref (ref a)
newRef' :: a -> RefM ref (ref a)
readRef :: ref a -> RefM ref a
readRef' :: ref a -> RefM ref a
writeRef :: ref a -> a -> RefM ref ()
writeRef' :: ref a -> a -> RefM ref ()
modifyRef :: ref a -> (a-> a) -> RefM ref ()
modifyRef' :: ref a -> (a-> a) -> RefM ref ()
instance Ref IR.IORef where
type RefM IR.IORef = IO
newRef a = IR.newIORef a
newRef' !a = IR.newIORef $! a
readRef a = IR.readIORef a
readRef' !r = IR.readIORef $! r
writeRef r a = IR.writeIORef r a
writeRef' !r !a =IR.writeIORef r $! a
modifyRef r f = IR.modifyIORef r f
modifyRef' r f = IR.modifyIORef' r f
instance Ref (SR.STRef s) where
type RefM (SR.STRef s) = ST s
newRef a = SR.newSTRef a
newRef' !a = SR.newSTRef $! a
readRef a = SR.readSTRef a
readRef' !r = SR.readSTRef $! r
writeRef r a = SR.writeSTRef r a
writeRef' !r !a =SR.writeSTRef r $! a
modifyRef r f = SR.modifySTRef r f
modifyRef' r f = SR.modifySTRef' r f