2012-08-16 6 views
2

J'ai une fonction f :: ByteString -> String, et j'ai besoin d'un Sink ByteString (ResourceT IO). Comment l'obtenir?Soulever une fonction vers un évier de conduit

Malheureusement, les documents ne sont pas très utiles ...

+0

Que voulez-vous que l'évier fasse? – dave4420

+0

Et 'Sink ByteString (ResourceT IO)' n'est pas un type. Voulez-vous dire 'Sink ByteString (ResourceT IO) String'? – dave4420

+0

Oui, désolé.Sink ByteString (ResourceT IO) String' était nécessaire. Le récepteur était supposé prendre le résultat de fileSource dans un téléchargement de fichier Yesod, et calculer son hachage md5 (en utilisant 'Yesod.Static.base64md5'). – mrueg

Répondre

1

Je ne sais pas pourquoi vous avez besoin de quelque chose à voir avec resourceT dans ce conduit. Pour retourner le tout dans une grande chaîne composée de toutes les petites bytestrings, vous devrez accumuler des pièces pendant un certain temps, puis le retourner à la fin.

fSink :: Monad m => Sink ByteString m String 
fSink = go [] 
    where 
    go accum = do 
     x <- await 
     case x of 
     Nothing -> return . f . B.concat . reverse $ accum 
     Just x' -> go (x':accum) 
+0

Merci pour votre réponse. L'exigence pour ResourceT est juste due à la façon dont Yesod gère les téléchargements de fichiers depuis la version 1.1. Vous obtenez un 'Source (ResourceT IO) ByteString' au lieu d'un' ByteString' tel qu'il était dans Yesod 1.0. – mrueg

3

Voici une solution générale au problème: nous allons prendre toute fonction i -> r, où i est un Monoid, et la transformer en un évier en pliant tous les await s avec mappend.

import Data.Conduit 
import Data.Conduit.List as CL 
import Data.Monoid 

monoidFold :: (Monoid i, Monad m) => (i -> r) -> Sink i m r 
monoidFold f = f `fmap` CL.fold mappend mempty 

Depuis ByteString est un Monoid, votre fonction du type ByteString -> String peut être utilisé comme argument de monoidFold.

myMD5 :: ByteString -> String 
monoidFold myMD5 :: Monad m => Sink ByteString m String 
+0

très instructif, merci – fp4me

Questions connexes