Tubos Haskell: obtenga el valor de retorno del último proxy en la tubería
Digamos que tengo dosProxy
en tuberías de Haskell. Representan procesos del sistema externo.
produce :: MonadIO m => Producer ByteString m ExitCode
consume :: MonadIO m => Consumer ByteString m ExitCode
Entonces los engancho en unEffect
, Me gusta esto:
effect :: Effect m ExitCode
effect = produce >-> consume
EstaEffect
me va a dar elExitCode
desde el principioProxy
eso termina Ordinariamente este será elproduce
, no laconsume
. ¿Cuál es la forma idiomática de Tuberías para obtener el valor de retorno de laconsume
incluso si no termina primero?
Hasta ahora, creo que esto no es posible sin hacer algún tipo de señalización en banda desagradable, por lo queconsume
sabe que la transmisión está hecha. La única forma en que el último Proxy sabe cerrar es obteniendo algo de unawait
para poder enviarle un mensaje vacíoByteString
para indicar que se ha completado la transmisión. Sin embargo, eso no se siente bien. Lo que tengo ahora es un MVar separado que puede proporcionar el valor de salida, pero creo que tiene que haber una forma más idiomática de hacer esto.