% (c) The AQUA Project, Glasgow University, 1998
%
-\section[Weak]{Module @PrelWeak@}
+\section[Weak]{Module @Weak@}
\begin{code}
-{-# OPTIONS -fno-implicit-prelude #-}
-
module Weak (
Weak, -- abstract
-- instance Eq (Weak v)
mkWeak, -- :: k -> v -> IO () -> IO (Weak v)
deRefWeak, -- :: Weak v -> IO (Maybe v)
- -- finalise -- :: Weak v -> IO ()
+ finalise, -- :: Weak v -> IO ()
-- replaceFinaliser -- :: Weak v -> IO () -> IO ()
mkWeakNoFinaliser, -- :: k -> v -> IO (Weak v)
addForeignFinaliser -- :: ForeignObj -> IO () -> IO ()
) where
+import PrelBase
+import PrelIOBase
import PrelWeak
import Foreign
+
+deRefWeak :: Weak v -> IO (Maybe v)
+deRefWeak (Weak w) = IO $ \s ->
+ case deRefWeak# w s of
+ (# s1, flag, p #) -> case flag of
+ 0# -> (# s1, Nothing #)
+ _ -> (# s1, Just p #)
+
+mkWeakNoFinaliser key val = IO $ \s ->
+ -- zero is a valid finaliser argument to mkWeak#, and means "no finaliser"
+ case mkWeak# key val (unsafeCoerce# 0#) s of { (# s1, w #) ->
+ (# s1, Weak w #) }
+
+mkWeakPair :: k -> v -> IO () -> IO (Weak (k,v))
+mkWeakPair key val finaliser = mkWeak key (key,val) finaliser
+
+finalise :: Weak v -> IO ()
+finalise (Weak w) = IO $ \s ->
+ case finaliseWeak# w s of s1 -> (# s1, () #)
+
\end{code}
module PrelWeak where
import PrelGHC
-import PrelMaybe
import PrelBase
import PrelIOBase
import PrelForeign
case mkWeak# key val finaliser s of { (# s1, w #) ->
(# s1, Weak w #) }
-mkWeakNoFinaliser key val = IO $ \s ->
- -- zero is a valid finaliser argument to mkWeak#, and means "no finaliser"
- case mkWeak# key val (unsafeCoerce# 0#) s of { (# s1, w #) ->
- (# s1, Weak w #) }
-
-deRefWeak :: Weak v -> IO (Maybe v)
-deRefWeak (Weak w) = IO $ \s ->
- case deRefWeak# w s of
- (# s1, flag, p #) -> case flag of
- 0# -> (# s1, Nothing #)
- _ -> (# s1, Just p #)
-
mkWeakPtr :: k -> IO () -> IO (Weak k)
mkWeakPtr key finaliser = mkWeak key key finaliser
-mkWeakPair :: k -> v -> IO () -> IO (Weak (k,v))
-mkWeakPair key val finaliser = mkWeak key (key,val) finaliser
-
addFinaliser :: key -> IO () -> IO ()
addFinaliser key finaliser = do
mkWeakPtr key finaliser -- throw it away
addForeignFinaliser (ForeignObj fo) finaliser = addFinaliser fo finaliser
{-
-finalise :: Weak v -> IO ()
-finalise (Weak w) = finaliseWeak# w
-
instance Eq (Weak v) where
(Weak w1) == (Weak w2) = w1 `sameWeak#` w2
-}