packages feed

minesweeper-0.4: Delay.hs

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 ()