
Hi Beginners. 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. 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.

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/

On 12 May 2011 12:20, Lyndon Maydwell
Hi Beginners.
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.
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.
For what it's worth you can implement this abstraction ontop of channels. module Control.Concurrent.Chan.Closeable where import Control.Concurrent.Chan (Chan) import qualified Control.Concurrent.Chan as C import Data.Maybe getChanWhileJust :: Chan (Maybe a) -> IO [a] getChanWhileJust ch = fmap (catMaybes . takeWhile isJust) (C.getChanContents ch) -- λ> chan <- newChan :: IO (Chan (Maybe Integer)) -- λ> writeList2Chan chan (map Just [1..10] ++ [Nothing]) -- λ> getChanWhileJust chan -- [1,2,3,4,5,6,7,8,9,10]

Ah yes of course. I was just wondering if there was a way to do it
without the overhead of using Maybe. I guess it makes sense that there
isn't.
On Fri, May 13, 2011 at 4:03 PM, Christopher Done
On 12 May 2011 12:20, Lyndon Maydwell
wrote: Hi Beginners.
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.
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.
For what it's worth you can implement this abstraction ontop of channels. module Control.Concurrent.Chan.Closeable where import Control.Concurrent.Chan (Chan) import qualified Control.Concurrent.Chan as C import Data.Maybe getChanWhileJust :: Chan (Maybe a) -> IO [a] getChanWhileJust ch = fmap (catMaybes . takeWhile isJust) (C.getChanContents ch) -- λ> chan <- newChan :: IO (Chan (Maybe Integer)) -- λ> writeList2Chan chan (map Just [1..10] ++ [Nothing]) -- λ> getChanWhileJust chan -- [1,2,3,4,5,6,7,8,9,10]
participants (3)
-
Christopher Done
-
Ertugrul Soeylemez
-
Lyndon Maydwell