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)