2015-08-29 1 views
2

Je veux calculer hachage du corps post http et l'analyser en même temps lors de la réception, donc je besoin d'une fonction comme ceci:fonction fourchus pour Conduit

unionSinks :: Monad m => Consumer a m r1 -> Consumer a m r2 -> Consumer a m (r1, r2) 
unionSinks = ... 

sinkBody :: Monad m => FromJSON v => Consumer ByteString m (Digest SHA1, v) 
sinkBody = sinkHash `unionSinks` sinkParser json 

Lorsque j'ai développé L'ajout d'image je passthroughSink dans la même manière . Mais je n'ai pas besoin du résultat du conduit, qui enregistre l'image dans un fichier, dans ce cas.

Généralement, je sais comment implémenter une fourche en utilisant des choses ressemblant à MVar, mais je ne suis pas sûr que ce soit une solution optimale.

+0

Je ne suis pas sûr que je comprends complètement la question, mais avez-vous vérifié « ZipConduit » et plus particulièrement « ZipSink » (en données. Conduit)? – creichert

+0

J'ai besoin des mêmes données d'entrée pour les deux consommateurs. De plus, j'ai besoin de valeurs, qui sont revenues des deux. – Kayo

+0

Hmm, il semble que ce soit ce dont j'ai besoin. Je n'ai pas lu attentivement les documents. Merci. – Kayo

Répondre

3

En effet vous avez besoin ZipSink (ou plus général ZipConduit):

import Control.Applicative 
import Data.Conduit 

unionSinks :: (Monad m) => Sink a m r1 -> Sink a m r2 -> Sink a m (r1, r2) 
unionSinks s1 s2 = getZipSink ((,) <$> ZipSink s1 <*> ZipSink s2) 
+0

Bien. Je vous remercie. – Kayo