Fusionando conductos con múltiples entradas.

Estoy tratando de crear un conducto que pueda consumir múltiples flujos de entrada. Necesito poder esperar en uno u otro de los flujos de entrada sin ningún orden en particular (por ejemplo, sin alternar) haciendo inútil el zip. Aquí no hay nada paralelo o no determinista: espero en una u otra secuencia. Quiero poder escribir código similar al siguiente (dondeawaitA yawaitB aguarda en el primer o segundo flujo de entrada respectivamente):

do
  _ <- awaitA
  x <- awaitA
  y <- awaitB
  yield (x,y)
  _ <- awaitB
  _ <- awaitB
  y' <- awaitB
  yield (x,y')

La mejor solución que tengo es hacer que la mónada interna sea otro conducto, por ejemplo.

foo :: Sink i1 (ConduitM i2 o m) ()

Lo que entonces permite

awaitA = await
awaitB = lift await

Y esto funciona principalmente. Desafortunadamente, esto parece dificultar la fusión del conducto interno antes de que el conducto externo esté completamente conectado. Lo primero que probé fue:

fuseInner :: Monad m =>
                Conduit i2' m i2 -> 
                Sink i1 (ConduitM i2 o m) () -> 
                Sink i1 (ConduitM i2' o m) ()
fuseInner x = transPipe (x =$=)

Pero esto no funciona, al menos cuandox&nbsp;es un estado desde(x =$=)&nbsp;Se ejecuta varias veces, reiniciando efectivamentex&nbsp;cada vez.

¿Hay alguna forma de escribir fuseInner, sin romper el interior del conducto (que parece que sería bastante desordenado)? ¿Hay alguna mejor manera de manejar múltiples flujos de entrada? ¿Estoy lejos de lo que el conducto fue diseñado?

¡Gracias!