{-|
    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