2 % (c) The AQUA Project, Glasgow University, 1998
5 \section[Weak]{Module @Weak@}
10 -- instance Eq (Weak v)
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)
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 ()
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 #)
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 #) ->
41 mkWeakPair :: k -> v -> IO () -> IO (Weak (k,v))
42 mkWeakPair key val finaliser = mkWeak key (key,val) finaliser
44 finalise :: Weak v -> IO ()
45 finalise (Weak w) = IO $ \s ->
46 case finaliseWeak# w s of s1 -> (# s1, () #)