Снятие монада IO в ConduitT на ResourceT - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь использовать функцию MergeSources в stm -роводит , которая имеет следующую подпись:

mergeSources :: (MonadResource mi, MonadIO mo, MonadUnliftIO mi)
             => [ConduitT () a mi ()] -- ^ The sources to merge.
             -> Int -- ^ The bound of the intermediate channel.
             -> mo (ConduitT () a mi ())    

У меня есть источники, основанные на IO напрямую, и я незнаю, как двигаться по этой ми Монаде, которую я считаю ResourceT:

, поэтому у меня есть источники со следующей подписью:

ConduitT () (Connection,WorkspaceId) IO ()

, и я хотел бы вместо этой подписи:

ConduitT () (Connection,WorkspaceId) (ResourceT IO) ()

несмотря на то, что у меня нет ресурсов для обработки этих действий (у меня есть соединение, но оно глобальное, вот что они рекомендуют ...), я приведу пример функции, которую я хочу использовать

streamAllWorkspaceAlreadyCreated :: Connection -> ConduitT () (Connection,WorkspaceId) IO ()
streamAllWorkspaceAlreadyCreated  eventStoreConnection = do
    yield eventStoreConnection
    .| WorkspaceStream.streamAll
    .| WorkspaceStream.discardCorruptedStreams
    .| mapC (\workSpaceId -> (eventStoreConnection,workSpaceId))

1 Ответ

0 голосов
/ 11 октября 2018

Как насчет transPipe: https://hackage.haskell.org/package/conduit-1.3.1/docs/Data-Conduit.html#v:transPipe

transPipe :: Monad m => (forall a. m a -> n a) -> ConduitT i o m r -> ConduitT i o n r

transPipe liftIO :: ConduitT i o IO r -> ConduitT i o (ResourceT IO) r
...