packages feed

keera-hails-reactive-polling-0.8.0: src/Hails/Polling.hs

-- |
--
-- Copyright   : (C) Keera Studios Ltd, 2015
-- License     : BSD3
-- Maintainer  : support@keera.co.uk
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

  -- RV fields
  let getter   = readCBMVar mvar
      notifier = installCallbackCBMVar mvar

  return $ ReactiveFieldRead getter notifier