
Lyndon Maydwell
I'm trying to implement a program that accumulates a list of items through many IO actions, then use these in another part of the program as a list.
I've found Control.Concurrent.Chan which seems to provide a nice abstraction with getChanContents :: Chan a -> IO [a], but there doesn't seem to be a way for the source to close the channel.
You don't close channels, but just read exactly as many items as you write.
Are channels the right abstraction for something like this? Should look in to (itter|enumer)at(or|ee)s instead... They seem to encompass this model, but look quite involved.
Iteratees are an abstraction /around/ a construct like Chan. They allow you to split the input processing (in this case from the channel) into three separate problems: Fetching, transforming and using the data. In particular, they solve the problems of lazy IO. To answer your question: MVar, Chan and STM would all solve your problem, but in different ways. In general I try to avoid Chan, because if your reading end is slower than your writing end, you may run into resource problems. Greets, Ertugrul -- nightmare = unsafePerformIO (getWrongWife >>= sex) http://ertes.de/