Update base for new Safe Haskell design
[ghc.git] / libraries / base / GHC / STRef.lhs
1 \begin{code}
2 {-# LANGUAGE Unsafe #-}
3 {-# LANGUAGE NoImplicitPrelude, MagicHash, UnboxedTuples #-}
4 {-# OPTIONS_HADDOCK hide #-}
5
6 -----------------------------------------------------------------------------
7 -- |
8 -- Module      :  GHC.STRef
9 -- Copyright   :  (c) The University of Glasgow, 1994-2002
10 -- License     :  see libraries/base/LICENSE
11 --
12 -- Maintainer  :  cvs-ghc@haskell.org
13 -- Stability   :  internal
14 -- Portability :  non-portable (GHC Extensions)
15 --
16 -- References in the 'ST' monad.
17 --
18 -----------------------------------------------------------------------------
19
20 -- #hide
21 module GHC.STRef (
22         STRef(..),
23         newSTRef, readSTRef, writeSTRef
24     ) where
25
26 import GHC.ST
27 import GHC.Base
28
29 data STRef s a = STRef (MutVar# s a)
30 -- ^ a value of type @STRef s a@ is a mutable variable in state thread @s@,
31 -- containing a value of type @a@
32
33 -- |Build a new 'STRef' in the current state thread
34 newSTRef :: a -> ST s (STRef s a)
35 newSTRef init = ST $ \s1# ->
36     case newMutVar# init s1#            of { (# s2#, var# #) ->
37     (# s2#, STRef var# #) }
38
39 -- |Read the value of an 'STRef'
40 readSTRef :: STRef s a -> ST s a
41 readSTRef (STRef var#) = ST $ \s1# -> readMutVar# var# s1#
42
43 -- |Write a new value into an 'STRef'
44 writeSTRef :: STRef s a -> a -> ST s ()
45 writeSTRef (STRef var#) val = ST $ \s1# ->
46     case writeMutVar# var# val s1#      of { s2# ->
47     (# s2#, () #) }
48
49 -- Just pointer equality on mutable references:
50 instance Eq (STRef s a) where
51     STRef v1# == STRef v2# = sameMutVar# v1# v2#
52
53 \end{code}