[project @ 1999-02-02 14:19:02 by simonm]
[ghc-hetmet.git] / ghc / lib / exts / Weak.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1998
3 %
4
5 \section[Weak]{Module @Weak@}
6
7 \begin{code}
8 module Weak (
9         Weak,                   -- abstract
10         -- instance Eq (Weak v)  
11
12         mkWeak,                 -- :: k -> v -> IO () -> IO (Weak v)
13         deRefWeak,              -- :: Weak v -> IO (Maybe v)
14         finalise,               -- :: Weak v -> IO ()
15         -- replaceFinaliser     -- :: Weak v -> IO () -> IO ()
16         mkWeakNoFinaliser,      -- :: k -> v -> IO (Weak v)
17
18         mkWeakPtr,              -- :: k -> IO () -> IO (Weak k)
19         mkWeakPair,             -- :: k -> v -> IO () -> IO (Weak (k,v))
20         addFinaliser,           -- :: key -> IO () -> IO ()
21         addForeignFinaliser     -- :: ForeignObj -> IO () -> IO ()
22    ) where
23
24 import PrelBase
25 import PrelIOBase
26 import PrelWeak
27 import Foreign
28
29 deRefWeak :: Weak v -> IO (Maybe v)
30 deRefWeak (Weak w) = IO $ \s ->
31    case deRefWeak# w s of
32         (# s1, flag, p #) -> case flag of
33                                 0# -> (# s1, Nothing #)
34                                 _  -> (# s1, Just p #)
35
36 mkWeakNoFinaliser key val = IO $ \s ->
37    -- zero is a valid finaliser argument to mkWeak#, and means "no finaliser"
38    case mkWeak# key val (unsafeCoerce# 0#) s of { (# s1, w #) ->
39    (# s1, Weak w #) }
40
41 mkWeakPair :: k -> v -> IO () -> IO (Weak (k,v))
42 mkWeakPair key val finaliser = mkWeak key (key,val) finaliser
43
44 finalise :: Weak v -> IO ()
45 finalise (Weak w) = IO $ \s ->
46    case finaliseWeak# w s of s1 -> (# s1, () #)
47
48 \end{code}