postgresql-simple提供用于流式查询的功能,例如,
fold :: (Fromrow row,ToRow params) => Connection -> Query -> params -> a -> (a -> row -> IO a) -> IO a
我想创建一个充分利用流媒体的管道源.
mySource :: (Fromrow row,Monad m) => Source m row
不幸的是,因为IO在折叠中出现在逆向位置(我认为?),所以我真的很难对付这些类型.以下类型检查,但在产生值之前折叠整个流.
getConduit :: Connection -> IO (C.ConduitM () Event IO ()) getConduit conn = fold_ conn queryEventRecord CL.sourceNull foo where foo :: C.ConduitM () Event IO () -> Event -> IO (C.ConduitM () Event IO ()) foo cond evt = pure (cond >> C.yield evt)
关于如何实现这一点的任何指针将不胜感激!谢谢!
解决方法
一个(不太好)的方式来解决这个问题
>创建一个新的TMChan
来接收行
>将foreach_
设置为仅将行转储到此通道中
>最后使用stm-conduit
从频道中制作出来源
我没有办法对此进行测试,但以下情况应该有效
import Conduit import Database.Postgresql.Simple (foreach_) import Data.Conduit.TMChan (sourceTMChan) import Control.Concurrent.STM.TMChan (newTMChanIO,writeTMChan,atomically) mySource :: (Fromrow row,Monadio m) => Connection -> Query -> IO (Source m row) mySource connection query = do chan <- newTMChanIO forEach_ connection query (atomically . writeTMChan chan) pure (sourceTMChan chan)
如果我们只有forEach_ ::(Monadio m,Fromrow r)=>连接 – >查询 – > (r – > m()) – > m()这可能更容易……
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。