Concurrency demos/Simple producer and consumer
A simple example of a producer thread, performing IO events, and passing them over a Chan, to a consumer thread, which processes the events as they arrive (in a pure manner).
The interesting point to note is that Chans abstract over unsafeInterleaveIO, and allow for pure processing of streams of external events.
import Data.Char
import Control.Concurrent
import Control.Concurrent.Chan
main = do
c <- newChan
cs <- getChanContents c -- a lazy stream of events from eventReader
forkIO (producer c) -- char producer
consumer cs
where
-- thread one: the event producer
producer c = forever $ do
key <- getChar
writeChan c key
-- thread two: the lazy consumer
consumer = mapM_ print . map shift
where shift c | isAlpha c = chr (ord c + 1)
| otherwise = c
forever a = a >> forever a
And running it:
$ ghc -O -threaded A.hs -o a $ ./a a 'b' '\n' b 'c' '\n' d 'e' '\n'