[Haskell-cafe] Re: Streams: the extensible I/O library
simonmarhaskell at gmail.com
Wed Feb 8 06:58:30 EST 2006
Bulat Ziganshin wrote:
> I have developed a new I/O library that IMHO is so sharp that it can
> eventually replace the current I/O facilities based on using Handles.
> The main advantage of the new library is its strong modular design
> using typeclasses.
I've taken a brief look, and I must say it's nice (but you knew that
My initial thoughts:
I would prefer to see more type structure, rather than putting
everything in the Stream class. You have classes ByteStream,
BlockStream etc, but these are just renamings of the Stream class. There
are many compositions that are illegal, but we don't find out until
runtime; it would make a lot more sense to me to expose this structure
in the type system.
My view is that the most basic level of stream is a byte stream,
supporting only two operations: read an array of bytes and write an
array of bytes, i.e. vGetBuf/vPutBuf. This makes implementing a stream,
or transformer, much easier and shorter. Also I'd like to see separate
input/output streams for even more type safety, and I believe
simplicity, but this is less important than separating byte streams from
text streams. I believe certain other operations would benefit from
being moved into separate classes: eg. vSeek into a Seekable class,
vSetBuffering into a Buffered class, and so on. This will improve
performance too - your Stream class has dictionaries with 20+ elements.
I see that buffering works on vPutChar/vGetChar, and yet you seem to be
buffering bytes - which is it? Are you supposed to buffer before or
after doing character encoding? It seems before, because otherwise
buffering will strip out all but the low 8 bits of each character.
Using a more explicit type structure would help a lot here.
Incedentally, I'm suprised that you can use list-based character
encoding/decoding and still get good performance, I expected to need to
do encoding directly between buffers.
Still, as I said, I think the general approach is excellent, and is
definitely heading in the right direction.
Oh, and some of the code is GPL'd, which is a problem for incorporation
in standard libraries. This is just something to bear in mind if the
aim is for this to be a candidate for a/the standard IO library.
More information about the Haskell-Cafe