901a3857265e8fa084fa83a871ff13396c131851
[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 PrelIOBase
15 import PrelForeign
16
17 data Weak v = Weak (Weak# v)
18
19 mkWeak  :: k                            -- key
20         -> v                            -- value
21         -> IO ()                        -- finaliser
22         -> IO (Weak v)                  -- weak pointer
23
24 mkWeak key val finaliser = IO $ \s ->
25    case mkWeak# key val finaliser s of { (# s1, w #) ->
26    (# s1, Weak w #) }
27
28 mkWeakPtr :: k -> IO () -> IO (Weak k)
29 mkWeakPtr key finaliser = mkWeak key key finaliser
30
31 addFinaliser :: key -> IO () -> IO ()
32 addFinaliser key finaliser = do
33    mkWeakPtr key finaliser              -- throw it away
34    return ()
35
36 addForeignFinaliser :: ForeignObj -> IO () -> IO ()
37 addForeignFinaliser (ForeignObj fo) finaliser = addFinaliser fo finaliser
38
39 {-
40 instance Eq (Weak v) where
41   (Weak w1) == (Weak w2) = w1 `sameWeak#` w2
42 -}
43
44 \end{code}