It would be nice to be able to have an instance of HStream that allows to stream without using lazy I/O; in particular, an instance that would allow us to close the connection when we no longer want the rest of the response body.
However, in order to define a custom type with a corresponding HStream instance one needs to provide, amongst other things, implementations of
openStream :: String -> Int -> IO (HandleStream bufType)
close :: HandleStream bufType -> IO ()
For the implementation of openStream we can use
openTCPConnection :: BufferType ty => String -> Int -> IO (HandleStream ty)
However, for the implementation of close we are stuck; there is no function analogous to openTCPConnection that allows us to close a HandleStream.
Although we have
hstreamToConnection :: HandleStream String -> Connection
and there is a Stream instance for Connection, hstreamToConnection works only for HandleStream String, so that doesn't help either.
Finally, the HandleStream type is completely opaque (it does not even satisfy Functor) so we cannot define a HStream instance for one bufType in terms of the HStream instance for another. If we had some way of defining new instances in terms of old instances (for instance, reuse the instance for lazy bytestrings, but somehow retain a handle to the corresponding HandleStream so that we can close it explicitly) that would be great.
It would be nice to be able to have an instance of
HStreamthat allows to stream without using lazy I/O; in particular, an instance that would allow us to close the connection when we no longer want the rest of the response body.However, in order to define a custom type with a corresponding
HStreaminstance one needs to provide, amongst other things, implementations ofFor the implementation of
openStreamwe can useHowever, for the implementation of
closewe are stuck; there is no function analogous toopenTCPConnectionthat allows us to close aHandleStream.Although we have
and there is a
Streaminstance forConnection,hstreamToConnectionworks only forHandleStream String, so that doesn't help either.Finally, the
HandleStreamtype is completely opaque (it does not even satisfyFunctor) so we cannot define aHStreaminstance for onebufTypein terms of theHStreaminstance for another. If we had some way of defining new instances in terms of old instances (for instance, reuse the instance for lazy bytestrings, but somehow retain a handle to the correspondingHandleStreamso that we can close it explicitly) that would be great.