packages feed

statethread-0.1: src/Data/STRef/Strict.hs

module Data.STRef.Strict (
   STRef,
   newSTRef,
   readSTRef,
   writeSTRef,
   modifySTRef,
   ) where

import Control.Monad.ST.Strict (ST, )
import qualified Control.Monad.ST.Strict as Strict
import qualified Data.IORef as IORef


newtype STRef s a = STRef {unSTRef :: IORef.IORef a}


newSTRef :: a -> ST s (STRef s a)
newSTRef a =
   Strict.unsafeIOToST (fmap STRef (IORef.newIORef a))

readSTRef :: STRef s a -> ST s a
readSTRef ref =
   Strict.unsafeIOToST (IORef.readIORef (unSTRef ref))

writeSTRef :: STRef s a -> a -> ST s ()
writeSTRef ref a =
   Strict.unsafeIOToST (IORef.writeIORef (unSTRef ref) a)

modifySTRef :: STRef s a -> (a -> a) -> ST s ()
modifySTRef ref f =
   Strict.unsafeIOToST (IORef.modifyIORef (unSTRef ref) f)