2 {-# OPTIONS -fno-implicit-prelude #-}
8 data STRef s a = STRef (MutVar# s a)
10 newSTRef :: a -> ST s (STRef s a)
11 newSTRef init = ST $ \s1# ->
12 case newMutVar# init s1# of { (# s2#, var# #) ->
13 (# s2#, STRef var# #) }
15 readSTRef :: STRef s a -> ST s a
16 readSTRef (STRef var#) = ST $ \s1# -> readMutVar# var# s1#
18 writeSTRef :: STRef s a -> a -> ST s ()
19 writeSTRef (STRef var#) val = ST $ \s1# ->
20 case writeMutVar# var# val s1# of { s2# ->
23 modifySTRef :: STRef s a -> (a -> a) -> ST s ()
24 modifySTRef ref f = readSTRef ref >>= writeSTRef ref . f
26 -- Just pointer equality on mutable references:
27 instance Eq (STRef s a) where
28 STRef v1# == STRef v2# = sameMutVar# v1# v2#