Как превратить монады в трубопроводе?
Я пытаюсь скопировать файл с диска в файл в 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