module Control.Reactive.Var (
Var(..),
dupVar,
newVar,
readVar,
writeVar,
) where
import Data.Monoid
import Data.Maybe
import Control.Monad
import Control.Applicative
import Control.Concurrent (forkIO, forkOS, threadDelay)
import Control.Monad.STM (atomically)
import Control.Concurrent.STM.TChan
import Control.Concurrent.STM.TVar
import System.IO.Unsafe
newtype Var a = Var { getVar :: TVar a }
newVar :: a -> Var a
newVar = Var . unsafePerformIO . newTVarIO
dupVar :: Var a -> IO (Var a)
dupVar v = atomically $ readTVar (getVar v) >>= newTVar >>= return . Var
readVar :: Var a -> IO a
readVar = atomically . readTVar . getVar
writeVar :: Var a -> a -> IO ()
writeVar (Var !v) x = atomically $ swapTVar v x >> return ()