Как сохранить файл с помощью Conduit?

Как сохранить файл с помощью библиотеки conduit? Я просмотрел учебник по кабелепроводу, но ничего не нашел, вот мой вариант использования:

main :: IO ()
main = do
  xxs  <- lines <$> (readFile filePath)
  sourceList xxs =$ pipe $$ saveFile

pipe :: Monad m => Conduit String m String
pipe = undefined

Итак, здесь два вопроса:

  1. Имеет ли смысл использовать lines для преобразования строки в список строк, а затем передавать ее в sourceList?

  2. Как мне реализовать функцию saveFile, чтобы после полной обработки строк xxs я мог записать их на диск?


person xiaolingxiao    schedule 10.08.2016    source источник


Ответы (1)


Небольшой минимальный пример того, что вы пытаетесь сделать с помощью библиотеки conduit:

#!/usr/bin/env stack
{- stack
     --resolver lts-6.7
     --install-ghc
     runghc
     --package conduit-extra
     --package resourcet
     --package conduit
 -}

import Data.Conduit.Binary (sinkFile, sourceFile)
import Control.Monad.Trans.Resource
import Data.Conduit (($$), await, Conduit, (=$), yield)
import Data.Monoid ((<>))
import Control.Monad.IO.Class

myConduit = do
  str <- await
  case str of
    Just x -> do
              liftIO $ print "some processing"
              yield x
              myConduit
    Nothing -> return ()


saveFile :: FilePath -> FilePath -> IO ()
saveFile f1 f2 = runResourceT $ sourceFile f1 $$ myConduit =$ sinkFile f2

main :: IO ()                 
main = saveFile "test.txt" "atest.txt"

Как мне реализовать функцию saveFile, чтобы после полной обработки строк xxs я мог записать их на диск?

Вы реализуете это в своей функции myConduit. Обратите внимание, что в вашем примере вы используете вызов функции readFile, который будет лениво читать файл. Conduit предоставляет собственную абстракцию для чтения и записи файлов, вы должны использовать ее.

person Sibi    schedule 10.08.2016