module Hails.Polling where
import Control.Concurrent (forkIO, threadDelay)
import Control.Monad (forever, void)
import Data.CBMVar
import Data.ReactiveValue
pollingReactive :: IO a
-> Maybe Int
-> IO (ReactiveFieldRead IO a)
pollingReactive sensor delay = do
initialV <- sensor
mvar <- newCBMVar initialV
forkIO $ forever $ do v <- sensor
writeCBMVar mvar v
maybe (return ()) (void . threadDelay) delay
let getter = readCBMVar mvar
notifier = installCallbackCBMVar mvar
return $ ReactiveFieldRead getter notifier