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