Как превратить монады в трубопроводе?

Я пытаюсь скопировать файл с диска в файл в MongoDB GridFS с пакетами Database.MongoDB.

main :: IO ()
main = do
  pipe <- MDB.connect (host "127.0.0.1")
  _ <- access pipe master "baseball" run
  close pipe

run :: MDB.Action IO GFS.File
run = do
  uploadImage "sandbox/bat.jpg"

uploadImage :: Text -> MDB.Action IO GFS.File
uploadImage src = do
  bucket <- GFS.openDefaultBucket
  runConduitRes $ sourceFileBS (unpack src) .| (hole $ GFS.sinkFile  bucket src)

Это не работает, потому что sourceFileBS ожидает в качестве Resource в базовой монаде, а GFS.sinkFile хочет MongoDB Action (специализированный Reader).

Что такое элегантный способ соединить эти части трубопровода вместе?

1 ответ

Решение

Без всех доступных типов и функций немного сложно сказать вам лучший способ сделать это. Однако один способ, который должен работать, выглядит примерно так:

withBinaryFile (unpack src) ReadMode $ \h -> runMongo $ runConduit $
  sourceHandle h .| GFS.sinkFile bucket src
Другие вопросы по тегам