[project @ 1999-10-29 13:53:37 by sof]
[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 -> Maybe (IO ()) -> IO (Weak v)
13         deRefWeak,              -- :: Weak v -> IO (Maybe v)
14         finalize,               -- :: Weak v -> IO ()
15         -- replaceFinaliser     -- :: Weak v -> IO () -> IO ()
16
17         mkWeakPtr,              -- :: k -> Maybe (IO ()) -> IO (Weak k)
18         mkWeakPair,             -- :: k -> v -> Maybe (IO ()) -> IO (Weak (k,v))
19         addFinalizer,           -- :: key -> IO () -> IO ()
20         addForeignFinalizer     -- :: ForeignObj -> IO () -> IO ()
21    ) where
22
23 import PrelBase
24 import PrelIOBase
25 import PrelWeak
26 import Foreign
27
28 deRefWeak :: Weak v -> IO (Maybe v)
29 deRefWeak (Weak w) = IO $ \s ->
30    case deRefWeak# w s of
31         (# s1, flag, p #) -> case flag of
32                                 0# -> (# s1, Nothing #)
33                                 _  -> (# s1, Just p #)
34
35 mkWeakPair :: k -> v -> Maybe (IO ()) -> IO (Weak (k,v))
36 mkWeakPair key val finalizer = mkWeak key (key,val) finalizer
37
38 finalize :: Weak v -> IO ()
39 finalize (Weak w) = IO $ \s ->
40    case finalizeWeak# w s of 
41         (# s1, 0#, _ #) -> (# s1, () #) -- already dead, or no finaliser
42         (# s1, _,  f #) -> f s1
43 \end{code}