reactive-thread-0.3.1.0: Control/Concurrent/STM/TEventVar.hs
module Control.Concurrent.STM.TEventVar
( TEventVar
, newTEventVar
, readTEventVar
, writeTEventVar
) where
import Control.Applicative
import Control.Concurrent.STM
import Control.Concurrent.STM.TEvent
-- | A var which fires an event when modified.
newtype TEventVar a = TEventVar (TVar (a, TEvent))
deriving (Eq)
-- | Creates a new 'TEventVar' with an initial value.
newTEventVar :: a -> STM (TEventVar a)
newTEventVar x = do
event <- newTEvent
TEventVar <$> newTVar (x, event)
-- | Reads the value of a 'TEventVar', yielding an event
-- which fires when the 'TEventVar' is modified.
readTEventVar :: TEventVar a -> STM (a, TEvent)
readTEventVar (TEventVar var) = readTVar var
-- | Writes the value of a 'TEventVar', notifying readers
-- that the var has been modified.
writeTEventVar :: TEventVar a -> a -> STM TEvent
writeTEventVar (TEventVar var) x = do
event <- newTEvent
(_old, oldEvent) <- swapTVar var (x, event)
fireTEvent oldEvent
return event