content: -- |
  -- Copyright   : (C) Keera Studios Ltd, 2013
  -- License     : BSD3
  -- Maintainer  : support@keera.co.uk
  --
  -- MVars as Reactive Values.
  --
  -- CBMVars are MVars enriched with a notion of callbacks that are
  -- executed when the value in the MVar is altered.
  --
  -- This module wraps CBMVars into reactive values, making it easy
  -- to use them as models of reactive applications.
  module Data.CBMVar.Reactive where
  
  import Data.CBMVar        (CBMVar, installCallbackCBMVar, readCBMVar,
                             writeCBMVar)
  import Data.ReactiveValue (ReactiveFieldRead(..), ReactiveFieldReadWrite(..))
  
  -- | Return a read-only reactive value wrapping a CBMVar.
  cbmvarReactiveRO :: CBMVar a -> ReactiveFieldRead IO a
  cbmvarReactiveRO mvar = ReactiveFieldRead getter notifier
    where
      getter     = readCBMVar mvar
      notifier n = installCallbackCBMVar mvar n
  
  -- | Return a read-write reactive value wrapping a CBMVar.
  cbmvarReactiveRW :: CBMVar a -> ReactiveFieldReadWrite IO a
  cbmvarReactiveRW mvar = ReactiveFieldReadWrite setter getter notifier
    where
      setter     = writeCBMVar mvar
      getter     = readCBMVar mvar
      notifier n = installCallbackCBMVar mvar n
  