
Hi, First of all, I will export Network.HPACK (and Network.HTTP2) only when the specs of HTTP/2.0 are fixed. Other modules are exported for debugging/discussion purpose only at this moment. I'm explaining, for instance, how to implement huffman encoding to other guys using this unnecessary exported documents.
A lot of the API uses the IO monad for no apparent reason. For example, the functions clearRefSets, removeRef, newEntry all seem to use IO unnecessarily, when they could be pure functions. That strikes me as bad style.
From peformance point of view, an mutable array is necessary to implement HPACK. Since this array is never shared and one-way update only, I first tried to implement HPACK purely with Array (and STArray) using unsafeFreeze and unsafeThaw. Unfortunately, this implementation is unstable (i.e. compiled code with -O causes infinite loop) and I gave up this approach. So, I decided to use IOArray.
Due to IOArray, some manipulation functions for Context is IO. I decided to make all manipulation functions having IO at this moment even if it is not necessary. This simplified the code of Network.HPACK.To and Network.HPACK.From. But I agree that Network.HPACK.Context should be cleaned up.
I'm also a bit dubious about HeaderSet being a type alias for [Header], since you're not hiding it but have a very long alias for (:) later in the same module.
You are right. I will fix this.
I don't like to see the print* functions scattered around in the public API, they look like debugging aids for your development purposes.
Please see above.
I don't understand why HeaderSet is a type alias but ReferenceSet is a new type (and should be using newtype instead of data). The ReferenceSet functions look likely to be inefficient.
http-types defines: type RequestHeaders = [Header] type ResponseHeaders = [Header] I would like to have the same type, but RequestHeaders and ResponseHeaders is not good because this is used both in HTTP request and HTTP response. I will use newtype for ReferenceSet. Thank you for pointing this out. --Kazu