module Hasql.Conduit (
  conduitQuery,
) where

-- transformers
import Control.Monad.Trans.Class

-- conduit
import Data.Conduit
import Data.Conduit.List

-- hasql
import Hasql.Statement

-- hasql-transaction-io
import Hasql.CursorTransactionIO

-- hasql-streams-core
import Hasql.Streams

-- | Run a `Statement` using a cursor to return a `Conduit` instead of a list
conduitQuery :: Statement params [a] -> params ->
  ConduitT () a (CursorTransactionIO s) ()
conduitQuery :: Statement params [a]
-> params -> ConduitT () a (CursorTransactionIO s) ()
conduitQuery Statement params [a]
stmt params
params = Statement params [a]
-> params
-> CursorStreamFold s a (ConduitT () a (CursorTransactionIO s) ())
-> ConduitT () a (CursorTransactionIO s) ()
forall params s a r.
Statement params [a] -> params -> CursorStreamFold s a r -> r
cursorStreamQuery Statement params [a]
stmt params
params CursorStreamFold s a (ConduitT () a (CursorTransactionIO s) ())
forall s a.
CursorStreamFold s a (ConduitT () a (CursorTransactionIO s) ())
foldConduitStream

foldConduitStream :: CursorStreamFold s a (ConduitT () a (CursorTransactionIO s) ())
foldConduitStream :: (x -> CursorTransactionIO s (Maybe (a, x)))
-> CursorTransactionIO s x
-> ConduitT () a (CursorTransactionIO s) ()
foldConduitStream x -> CursorTransactionIO s (Maybe (a, x))
step CursorTransactionIO s x
init = CursorTransactionIO s x -> ConduitT () a (CursorTransactionIO s) x
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift CursorTransactionIO s x
init ConduitT () a (CursorTransactionIO s) x
-> (x -> ConduitT () a (CursorTransactionIO s) ())
-> ConduitT () a (CursorTransactionIO s) ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (x -> CursorTransactionIO s (Maybe (a, x)))
-> x -> ConduitT () a (CursorTransactionIO s) ()
forall (m :: * -> *) b a i.
Monad m =>
(b -> m (Maybe (a, b))) -> b -> ConduitT i a m ()
unfoldM x -> CursorTransactionIO s (Maybe (a, x))
step