
Adam Langley wrote:
Also, if you want the above approach (read a bit, see if it's enough), see IncrementalGet in the binary-strict package which is a Get with a continuation monad that stops when it runs out of bytes and returns a continuation that you can give more data to in the future.
I've used this now, and it's really rather nice: exactly the sort of thing one needs if multiplexing streams, or reading incomplete chunks, and with a simple interface that doesn't force users to know or care about Cont. The one thing I found curious was the Result type: it's oriented towards returning a list of results. data Result a = Failed String | Finished B.ByteString [a] | Partial (B.ByteString -> Result a) [a] I'd have expected it to look more like this: data Result a = Failed String | Finished B.ByteString a | Partial (B.ByteString -> Result a) (The change here is from a list to a singleton.) I don't think I care much for the extra boxing and reversing this involves.