import Control.Concurrent.STM
import Control.Monad
import Data.Vector
type VecInts = Vector (TVar Int)
newVecInts :: Int -> STM (VecInts)
newVecInts s = generateM s (\_ -> newTVar 0)
modifyVI :: VecInts -> Int -> Int -> STM ()
modifyVI vi pos val = do
writeTVar (vi ! pos) val
waitUntilEqual :: VecInts -> Int -> Int -> STM ()
waitUntilEqual vi p1 p2 = do
a <- readTVar (vi ! p1)
b <- readTVar (vi ! p2)
when (a /= b) retry