stm-chans-2.1.0: src/Control/Concurrent/STM/TVar/Compat.hs
{-# OPTIONS_GHC -Wall -fwarn-tabs #-}
{-# LANGUAGE CPP #-}
#if __GLASGOW_HASKELL__ >= 701
{-# LANGUAGE Trustworthy #-}
#endif
----------------------------------------------------------------
-- 2012.05.29
-- |
-- Module : Control.Concurrent.STM.TVar.Compat
-- Copyright : Copyright (c) 2011--2013 wren ng thornton
-- License : BSD
-- Maintainer : wren@community.haskell.org
-- Stability : provisional
-- Portability : non-portable (STM, CPP)
--
-- Compatibility layer for older versions of the @stm@ library.
-- Namely, we define 'readTVarIO' which @stm < 2.1.2@ lacks; and we
-- define 'modifyTVar', 'modifyTVar'', and 'swapTVar' which @stm < 2.3.0@
-- lacks. This module uses Cabal-style CPP macros in order to use
-- the package versions when available.
--
-- /Deprecated: 2.1.0 (will be removed in 3.0)/
----------------------------------------------------------------
module Control.Concurrent.STM.TVar.Compat
{-# DEPRECATED "stm-chans >= 2.1 requires stm >= 2.4; so this module no longer does anything useful." #-}
(
-- * The TVar type
TVar()
-- ** Creating TVars
, newTVar -- :: a -> STM (TVar a)
, newTVarIO -- :: a -> IO (TVar a)
-- ** Reading from TVars
, readTVar -- :: TVar a -> STM a
, readTVarIO -- :: TVar a -> IO a
-- ** Writing to TVars
, writeTVar -- :: TVar a -> a -> STM ()
, modifyTVar -- :: TVar a -> (a -> a) -> STM ()
, modifyTVar' -- :: TVar a -> (a -> a) -> STM ()
, swapTVar -- :: TVar a -> a -> STM a
-- ** Other capabilities
, registerDelay -- :: Int -> IO (TVar Bool)
) where
import Control.Concurrent.STM.TVar
#if ! (MIN_VERSION_stm(2,1,2))
import Control.Concurrent.STM (atomically)
#endif
#if ! (MIN_VERSION_stm(2,3,0))
import Control.Concurrent.STM (STM)
#endif
----------------------------------------------------------------
#if ! (MIN_VERSION_stm(2,1,2))
-- | Return the current value stored in a TVar. This is equivalent to
--
-- > readTVarIO = atomically . readTVar
--
-- but works much faster (on @stm >= 2.1.2@), because it doesn't
-- perform a complete transaction, it just reads the current value
-- of the TVar.
readTVarIO :: TVar a -> IO a
readTVarIO = atomically . readTVar
{-# INLINE readTVarIO #-}
#endif
#if ! (MIN_VERSION_stm(2,3,0))
-- 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 #-}
#endif
----------------------------------------------------------------
----------------------------------------------------------- fin.