Поднимите функцию в Conduit Sink

У меня есть функция f :: ByteString -> String, и мне нужен Sink ByteString (ResourceT IO). Как мне это получить?

К сожалению, документы не очень помогли...


person mrueg    schedule 16.08.2012    source источник
comment
Что вы хотите, чтобы мойка делала?   -  person dave4420    schedule 16.08.2012
comment
И Sink ByteString (ResourceT IO) не тип. Вы имеете в виду Sink ByteString (ResourceT IO) String?   -  person dave4420    schedule 16.08.2012
comment
Да, извините.Sink ByteString (ResourceT IO) String был нужен. Приемник должен был получить результат fileSource при загрузке файла Yesod и вычислить его хэш md5 (используя Yesod.Static.base64md5).   -  person mrueg    schedule 16.08.2012


Ответы (2)


Я не уверен, зачем вам нужно что-то делать с resourceT в этом канале.

Чтобы вернуть все это в одну большую строку, составленную из всех маленьких цепочек байтов, вам придется некоторое время накапливать кусочки, а затем возвращать их в конце.

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)
person David McHealy    schedule 16.08.2012
comment
Спасибо за ваш ответ. Требование к ResourceT связано с тем, как Yesod обрабатывает загрузку файлов, начиная с версии 1.1. Вы получаете Source (ResourceT IO) ByteString вместо ByteString, как это было в Yesod 1.0. - person mrueg; 16.08.2012

Вот общее решение проблемы: давайте возьмем любую функцию i -> r, где i — это Monoid, и превратим ее в сток, сложив все await с 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

Поскольку ByteString является Monoid, ваша функция типа ByteString -> String может использоваться в качестве аргумента monoidFold.

myMD5 :: ByteString -> String
monoidFold myMD5 :: Monad m => Sink ByteString m String
person Dan Burton    schedule 16.08.2012