Ich versuche, einen Conduit zu erstellen, der mehrere Eingabeströme konsumieren kann. Ich muss in der Lage sein, auf den einen oder den anderen der Eingabeströme in keiner bestimmten Reihenfolge (z. B. nicht alternierend) zu warten, was zip unbrauchbar macht. Hier läuft nichts parallel oder nicht-deterministisch ab: Ich warte auf den einen oder den anderen Strom. Ich möchte in der Lage sein, den Code zu schreiben, wie die folgenden (wobei awaitA
und awaitB
auf dem ersten oder zweiten Eingangsstrom erwarten bzw.):Fusing-Conduits mit mehreren Eingängen
do
_ <- awaitA
x <- awaitA
y <- awaitB
yield (x,y)
_ <- awaitB
_ <- awaitB
y' <- awaitB
yield (x,y')
Die beste Lösung, die ich habe, ist den inneren monadisch einer andere Leitung zu machen, z.B.
foo :: Sink i1 (ConduitM i2 o m)()
die dann
awaitA = await
awaitB = lift await
erlaubt Und das funktioniert meistens. Unglücklicherweise scheint es sehr schwierig zu sein, mit der inneren Leitung zu verschmelzen, bevor die äußere Leitung vollständig verbunden ist. Das erste, was ich versuchte, war:
fuseInner :: Monad m =>
Conduit i2' m i2 ->
Sink i1 (ConduitM i2 o m)() ->
Sink i1 (ConduitM i2' o m)()
fuseInner x = transPipe (x =$=)
Aber das funktioniert nicht, zumindest wenn x
Stateful ist seit (x =$=)
mehrere Male ausgeführt wird, effektiv x
jedes Mal neu zu starten.
Gibt es eine Möglichkeit, fireInner zu schreiben, kurz vor dem Einbruch in das Innere von Conduit (was aussieht, als wäre es ziemlich chaotisch)? Gibt es eine bessere Möglichkeit, mehrere Eingabeströme zu verarbeiten? Bin ich weit darüber hinaus, wofür der Conduit gedacht war?
Danke!
Ich nehme an, dass Sie meinen, dass Sie Elemente erhalten möchten, wie sie aus den zwei 'IO' Eingangsströmen erzeugt werden. Verwenden Sie dazu 'stm-conduit'. –
Ich habe Ihre aktualisierte Frage gelesen. Ist [dies] (http://stackoverflow.com/questions/12496654/is-there-an-iteratee-like-concept-which-pulls-data-from-multiple-sources/12497593#12497593) näher an dem, was Sie hatten im Hinterkopf? Wenn ja, kann ich es in die äquivalente "Conduit" -Version ändern und sie als Antwort einreichen. –
Ich denke, dieser Link beschreibt genau das, was ich probiert habe ('foo' ist ein' Sink' über einer 'ConduitM' Monade). Das Problem ist, ich kann mit dieser Strategie nicht herausfinden, wie man mit dem inneren Kanal verschmelzen kann. – Benson