2 % (c) The AQUA Project, Glasgow University, 1998
5 \section[Weak]{Module @Weak@}
10 -- instance Eq (Weak v)
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 ()
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 ()
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 #)
35 mkWeakPair :: k -> v -> Maybe (IO ()) -> IO (Weak (k,v))
36 mkWeakPair key val finalizer = mkWeak key (key,val) finalizer
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