[project @ 1999-12-20 10:34:27 by simonpj]
[ghc-hetmet.git] / ghc / lib / std / PrelWeak.lhs
1 %
2 % (c) The AQUA Project, Glasgow University, 1998
3 %
4
5 \section[PrelWeak]{Module @PrelWeak@}
6
7 \begin{code}
8 {-# OPTIONS -fno-implicit-prelude #-}
9
10 module PrelWeak where
11
12 import PrelGHC
13 import PrelBase
14 import PrelMaybe
15 import PrelIOBase
16 import PrelForeign
17
18 data Weak v = Weak (Weak# v)
19
20 mkWeak  :: k                            -- key
21         -> v                            -- value
22         -> Maybe (IO ())                -- finalizer
23         -> IO (Weak v)                  -- weak pointer
24
25 mkWeak key val (Just finalizer) = IO $ \s ->
26    case mkWeak# key val finalizer s of { (# s1, w #) -> (# s1, Weak w #) }
27 mkWeak key val Nothing = IO $ \s ->
28    case mkWeak# key val (unsafeCoerce# 0#) s of { (# s1, w #) -> (# s1, Weak w #) }
29
30 mkWeakPtr :: k -> Maybe (IO ()) -> IO (Weak k)
31 mkWeakPtr key finalizer = mkWeak key key finalizer
32
33 addFinalizer :: key -> IO () -> IO ()
34 addFinalizer key finalizer = do
35    mkWeakPtr key (Just finalizer)       -- throw it away
36    return ()
37
38 addForeignFinalizer :: ForeignObj -> IO () -> IO ()
39 addForeignFinalizer (ForeignObj fo) finalizer = addFinalizer fo finalizer
40
41 {-
42 instance Eq (Weak v) where
43   (Weak w1) == (Weak w2) = w1 `sameWeak#` w2
44 -}
45
46 \end{code}