cf9cea5efe45277475a50fe74ef40fb320f21640
[ghc-base.git] / GHC / STRef.lhs
1 \begin{code}
2 {-# OPTIONS -fno-implicit-prelude #-}
3 module GHC.STRef where
4
5 import GHC.ST
6 import GHC.Prim
7 import GHC.Base
8
9 data STRef s a = STRef (MutVar# s a)
10
11 newSTRef :: a -> ST s (STRef s a)
12 newSTRef init = ST $ \s1# ->
13     case newMutVar# init s1#            of { (# s2#, var# #) ->
14     (# s2#, STRef var# #) }
15
16 readSTRef :: STRef s a -> ST s a
17 readSTRef (STRef var#) = ST $ \s1# -> readMutVar# var# s1#
18
19 writeSTRef :: STRef s a -> a -> ST s ()
20 writeSTRef (STRef var#) val = ST $ \s1# ->
21     case writeMutVar# var# val s1#      of { s2# ->
22     (# s2#, () #) }
23
24 modifySTRef :: STRef s a -> (a -> a) -> ST s ()
25 modifySTRef ref f = readSTRef ref >>= writeSTRef ref . f
26
27 -- Just pointer equality on mutable references:
28 instance Eq (STRef s a) where
29     STRef v1# == STRef v2# = sameMutVar# v1# v2#
30 \end{code}