module Data.Ref.Unboxed where
import Control.Monad.ST (ST)
import Data.Typeable
#include "Typeable.h"
import Control.Monad.STorIO
import Data.Unboxed
newtype IOURef a = IOURef (IOSpecific2 MUVec a)
INSTANCE_TYPEABLE1(IOURef,ioURefTc,"IOURef")
newIOURef :: (Unboxed a) => a -> IO (IOURef a)
newIOURef initial = do var <- allocUnboxed (1::Int)
writeUnboxed var (0::Int) initial
return (IOURef var)
readIOURef :: (Unboxed a) => IOURef a -> IO a
readIOURef (IOURef ref) = readUnboxed ref (0::Int)
writeIOURef :: (Unboxed a) => IOURef a -> a -> IO ()
writeIOURef (IOURef ref) = writeUnboxed ref (0::Int)
modifyIOURef :: (Unboxed a) => IOURef a -> (a -> a) -> IO ()
modifyIOURef ref f = readIOURef ref >>= writeIOURef ref . f
newtype STURef s a = STURef (MUVec s a)
INSTANCE_TYPEABLE2(STURef,stURefTc,"STURef")
newSTURef :: (Unboxed a) => a -> ST s (STURef s a)
newSTURef initial = do var <- allocUnboxed (1::Int)
writeUnboxed var (0::Int) initial
return (STURef var)
readSTURef :: (Unboxed a) => STURef s a -> ST s a
readSTURef (STURef ref) = readUnboxed ref (0::Int)
writeSTURef :: (Unboxed a) => STURef s a -> a -> ST s ()
writeSTURef (STURef ref) = writeUnboxed ref (0::Int)
modifySTURef :: (Unboxed a) => STURef s a -> (a -> a) -> ST s ()
modifySTURef ref f = readSTURef ref >>= writeSTURef ref . f