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
出现在 fold
中的逆变位置(我认为?) ,我真的很纠结这些类型。以下类型检查,但在产生值之前折叠整个流。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_
将行转储到此 channel stm-conduit
从 channel 中制作源我没有办法立即测试这个,但以下应该有效
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) => Connection -> Query -> (r -> m ()) -> m ()
这可能更容易...
关于haskell - 使用 postgresql-simple 创建流式管道源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41643485/