
I was wondering if it was possible to implement synchronous channels within STM. In particular, I'd like to have CSP-like send and recv primitives on a channel that each block until the other side arrives to complete the transaction.
Assuming that retry blocks until something changes, you could associate a channel with a thread that encapsulates the transaction. Somewhat like this? import Control.Concurrent.STM import Control.Concurrent sender write confirm = do atomically $ putTMVar write "hi" atomically $ takeTMVar confirm putStrLn "sender done" receiver read = do r <- atomically $ takeTMVar read putStrLn $ "receiver done: "++r channel read write confirm = atomically $ do w <- takeTMVar write putTMVar read w putTMVar confirm () main = do (read,write,confirm) <- atomically $ do read <- newEmptyTMVar write <- newEmptyTMVar confirm <- newEmptyTMVar return (read,write,confirm) forkIO (channel read write confirm) forkIO (threadDelay 3000000 >> receiver read) threadDelay 5000000 >> sender write confirm You might also be interested in http://hackage.haskell.org/cgi-bin/hackage-scripts/package/chp Claus