{-# LANGUAGE CPP #-} #if __GLASGOW_HASKELL__ >= 701 {-# LANGUAGE Trustworthy #-} #endif ----------------------------------------------------------------------------- -- | -- Module : Control.Concurrent.STM.TVar -- Copyright : (c) The University of Glasgow 2004 -- License : BSD-style (see the file libraries/base/LICENSE) -- -- Maintainer : libraries@haskell.org -- Stability : experimental -- Portability : non-portable (requires STM) -- -- TVar: Transactional variables -- ----------------------------------------------------------------------------- module Control.Concurrent.STM.TVar ( -- * TVars TVar, newTVar, newTVarIO, readTVar, readTVarIO, writeTVar, modifyTVar, modifyTVar', swapTVar, #ifdef __GLASGOW_HASKELL__ registerDelay #endif ) where #ifdef __GLASGOW_HASKELL__ import GHC.Conc #else import Control.Sequential.STM #endif #if ! (MIN_VERSION_base(4,2,0)) readTVarIO = atomically . readTVar #endif -- Like 'modifyIORef' but for 'TVar'. -- | Mutate the contents of a 'TVar'. /N.B./, this version is -- non-strict. modifyTVar :: TVar a -> (a -> a) -> STM () modifyTVar var f = do x <- readTVar var writeTVar var (f x) {-# INLINE modifyTVar #-} -- | Strict version of 'modifyTVar'. modifyTVar' :: TVar a -> (a -> a) -> STM () modifyTVar' var f = do x <- readTVar var writeTVar var $! f x {-# INLINE modifyTVar' #-} -- Like 'swapTMVar' but for 'TVar'. -- | Swap the contents of a 'TVar' for a new value. swapTVar :: TVar a -> a -> STM a swapTVar var new = do old <- readTVar var writeTVar var new return old {-# INLINE swapTVar #-}