加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

haskell – 用postgresql-simple创建一个流媒体管道源

发布时间:2020-12-13 15:58:53 所属栏目:百科 来源:网络整理
导读: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 不幸的是,因为
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()这可能更容易……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读