module Delay
( doLater
, cancelAction
, newCancelVar
, CancelVar
) where
import Control.Concurrent
import Control.Concurrent.MVar
--------------------
newtype CancelVar = C (MVar (Maybe ThreadId))
newCancelVar :: IO CancelVar
newCancelVar = fmap C $ newMVar Nothing
cancelAction :: CancelVar -> IO ()
cancelAction (C v) = do
swapMVar v Nothing
return ()
doLater :: RealFrac t => CancelVar -> t -> IO () -> IO ()
doLater (C v) t action = do
tid <- forkIO $ do
threadDelay $ round $ 1000000 * t
mytid <- myThreadId
b <- readMVar v
case b of
Just tid | tid == mytid -> action
_ -> return ()
swapMVar v (Just tid)
return ()