{-| Utilities related to concurrency. -} module Data.Number.ER.MiscSTM where import Control.Concurrent as Concurrent import Control.Concurrent.STM as STM modifyTVar tv update = do value <- readTVar tv writeTVar tv $ update value modifyTVarGetOldVal tv update = do value <- readTVar tv writeTVar tv $ update value return value modifyTVarHasChanged tv update = do value <- readTVar tv let newValue = update value if value == newValue then return False else do writeTVar tv $ update value return True