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 unawaitpara 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.

Respuestas a la pregunta(2)

Su respuesta a la pregunta