Hello folks,

Newbie question: how can I do something like the following? mixing IO and STM.  


module Test where

import System.Random
import Control.Concurrent
import Control.Concurrent.STM

test_Cubby =
  do
    tv <- newTVar 0
    forkIO (producer tv) >> (consumer tv)
  where
    producer tv = do r <- randomRIO (1,10)
                     atomically (do { v <- readTVar tv
                                    ; writeTVar tv (v+r)
                                    })
                     print ("insert " ++ show r)
                     producer tv
                     return ()
    consumer tv = do r <- randomRIO (1,10)
                     atomically (do { v <- readTVar tv
                                    ; if (v < r) then retry
                                      else writeTVar tv (v-r)
                                    })
                     print ("consume " ++ show r)
                     consumer tv
                     return ()


Thanks.