实现一个简单的 Timer

使用 haskell 重新写 Periodic task system 时,我找不到一个合适的 timer 于是我就自己实现了一个。

data Timer = Timer { waiter :: MVar () }

newTimer :: IO Timer
newTimer = Timer <$> newEmptyMVar

Timer 初始化一个空的 waiter

initTimer :: Timer -> IO () -> IO ()
initTimer (Timer {..}) io = do 
  void $ forkIO $ forever $ do 
     takeMVar waiter 
     io

初始化 Timer 时使用 forever 让执行的 io 进入死循环,并用 MVar 的特性让 io 进行等待。

startTimer :: Timer -> Int -> IO ()
startTimer (Timer {..}) delay = do 
  void $ forkIO $ do 
    threadDelay delay 
    putMVar waiter ()

开始 TimerforkIO 出一个 thread, 利用 threadDelay 等待相应的时间后 解锁 waiter

这样子一个简单的 Timer 就出来了。

完整的代码见:Timer.hs

也欢迎读者们来 star Periodic task system

你可能感兴趣的:(实现一个简单的 Timer)