Custom instances of HStream impossible to write
- Lenguaje dominante
- Haskell
- Estrellas
- 186
- Forks
- 59
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Descripción
It would be nice to be able to have an instance of [`HStream`](http://hackage.haskell.org/package/HTTP-4000.2.19/docs/Network-TCP.html#t: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
``` haskell
openStream :: String -> Int -> IO (HandleStream bufType)
close :: HandleStream bufType -> IO ()
```
For the implementation of `openStream` we can use
``` haskell
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
``` haskell
hstreamToConnection :: HandleStream String -> Connection
```
and there is a [`Stream`](http://hackage.haskell.org/package/HTTP-4000.2.19/docs/Network-Stream.html#t:Stream) instance for [`Connection`](http://hackage.haskell.org/package/HTTP-4000.2.19/docs/Network-TCP.html#t:Connection), `hstreamToConnection` works _only_ for `HandleStream String`, so that doesn't help either.
Finally, the [`HandleStream`](http://hackage.haskell.org/package/HTTP-4000.2.19/docs/Network-TCP.html#t: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.
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Línea de trabajo
Empieza por HStream, HandleStream, openStream, close y openTCPConnection en Network.TCP; después inspecciona hstreamToConnection y Connection en Network.Stream. Determina una API que permita a las instancias personalizadas de HStream cerrar su HandleStream sin I/O diferida ni depender de la conversión específica de String. Se considera completado cuando un tipo de búfer personalizado puede definir una limpieza explícita de la conexión.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- haskell
- Área
- networking
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 25/100