-- prodcon-chan.hs
-- producer/consumer example in Concurrent Haskell using a channel to
-- communicate

import Control.Concurrent
import Control.Concurrent.Chan

producer :: Chan Int -> Int -> IO ()
producer chan 0 = return ()
producer chan n = writeChan chan n >> producer chan (n-1)

consumer :: Chan Int -> IO ()
consumer chan = readChan chan >>= print >> consumer chan

run n = do chan <- newChan
           forkIO (consumer chan)
           producer chan n
