module PrelWeak where
import PrelGHC
-import PrelMaybe
import PrelBase
+import PrelMaybe
import PrelIOBase
import PrelForeign
mkWeak :: k -- key
-> v -- value
- -> IO () -- finaliser
+ -> Maybe (IO ()) -- finalizer
-> IO (Weak v) -- weak pointer
-mkWeak key val finaliser = IO $ \s ->
- 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 #) }
+mkWeak key val (Just finalizer) = IO $ \s ->
+ case mkWeak# key val finalizer s of { (# s1, w #) -> (# s1, Weak w #) }
+mkWeak key val Nothing = IO $ \s ->
+ 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 -> Maybe (IO ()) -> IO (Weak k)
+mkWeakPtr key finalizer = mkWeak key key finalizer
-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
+addFinalizer :: key -> IO () -> IO ()
+addFinalizer key finalizer = do
+ mkWeakPtr key (Just finalizer) -- throw it away
return ()
-addForeignFinaliser :: ForeignObj -> IO () -> IO ()
-addForeignFinaliser (ForeignObj fo) finaliser = addFinaliser fo finaliser
+addForeignFinalizer :: ForeignObj -> IO () -> IO ()
+addForeignFinalizer (ForeignObj fo) finalizer = addFinalizer fo finalizer
{-
-finalise :: Weak v -> IO ()
-finalise (Weak w) = finaliseWeak# w
-
instance Eq (Weak v) where
(Weak w1) == (Weak w2) = w1 `sameWeak#` w2
-}