
I'm a bit curious
* be reliable in the presence of async exceptions (solved by conduit, pipes-safe),
* hold on to resources only as long as necessary (solved by conduit and to some degree by pipes-safe),
Are you aware of http://okmij.org/ftp/Streams.html#regions which describes both resource deallocation and async signals. Could you tell what you think is deficient in that code?
* ideally also allow upstream communication (solved by pipes and to some degree by conduit).
Are you aware (of, admittedly) old message whose title was specifically ``Sending messages up-and-down the iteratee-enumerator chain'' http://www.haskell.org/pipermail/haskell-cafe/2011-May/091870.html (there were several messages in that thread). Here is the code for those messages http://okmij.org/ftp/Haskell/Iteratee/UpDown.hs