packages feed

HaskellTorrent-0.0: src/Process/Timer.hs

-- | The timer module is responsible for timing in the project. With
--   the timer system, we can register timers in the future and then
--   we can get a tick triggered at the point in time where we need to
--   act. This allows us to postpone events into the future at a
--   designated time.
--
module Process.Timer (register)

where

import Control.Concurrent
import Control.Concurrent.CML
import Control.Monad.Trans

-- | Registers a timer tick on a channel in a number of seconds with
--   an annotated version.
registerL :: Integer -> a -> Channel a -> IO ()
registerL secs v tickChan = do spawn timerProcess
                               return ()
  where timerProcess = do threadDelay $ fromInteger $ secs * 1000000
                          sync $ transmit tickChan v


register :: MonadIO m => Integer -> a -> Channel a -> m ()
register secs v c = liftIO $ registerL secs v c