Haskell RIO monad inside persistent with pool

156 views Asked by At

Similar question: Haskell / Persistent-Sqlite: "No instance for (Control.Monad.Trans.Resource.MonadResource IO)"

I'm trying the use the selectSource from persistent to read the database in streaming mode and log the values in the console using logInfo.

The following snippets are executed in a RIO project template.

The following code contains the parts that work and don't work.

{-# LANGUAGE DerivingStrategies         #-}
{-# LANGUAGE EmptyDataDecls             #-}
{-# LANGUAGE FlexibleContexts           #-}
{-# LANGUAGE GADTs                      #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses      #-}
{-# LANGUAGE OverloadedStrings          #-}
{-# LANGUAGE QuasiQuotes                #-}
{-# LANGUAGE StandaloneDeriving         #-}
{-# LANGUAGE TemplateHaskell            #-}
{-# LANGUAGE TypeFamilies               #-}
{-# LANGUAGE UndecidableInstances       #-}
module Disambiguate.People where

import           Data.Conduit
import qualified Data.Conduit.List       as CL
import           Database.Persist
import           Database.Persist.Sqlite
import           Database.Persist.TH
import           Import                  hiding (on, (^.))
import           Prelude                 (print)

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Person
    name String
    age Int
    deriving Show
|]

disambiguatePeople :: RIO App ()
disambiguatePeople = do
  -- WORKS!
  runSqlite ":memory:" insertAndRead

  -- DOES NOT COMPILE!
  withSqlitePool ":memory:" 1 $ \pool -> do
    liftSqlPersistMPool insertAndRead pool

 where
  insertAndRead = do
    runMigration migrateAll

    insert_ $ Person "John Doe" 35
    insert_ $ Person "Jane Doe" 50

    runConduit $ selectSource [PersonAge >. 5] [] .| CL.mapM_
      (lift . logInfo . displayShow)

I get the following error:

src/Run.hs:37:25: error:
    • Couldn't match type ‘RIO App’ with ‘IO’
      Expected type: ReaderT
                       SqlBackend
                       (monad-logger-0.3.35:Control.Monad.Logger.NoLoggingT
                          (Control.Monad.Trans.Resource.Internal.ResourceT IO))
                       ()
        Actual type: ReaderT
                       SqlBackend
                       (monad-logger-0.3.35:Control.Monad.Logger.NoLoggingT
                          (Control.Monad.Trans.Resource.Internal.ResourceT (RIO App)))
                       ()
    • In the first argument of ‘liftSqlPersistMPool’, namely
        ‘insertAndRead’
      In a stmt of a 'do' block: liftSqlPersistMPool insertAndRead pool
      In the expression: do liftSqlPersistMPool insertAndRead pool
   |
37 |     liftSqlPersistMPool insertAndRead pool
   |                         ^^^^^^^^^^^^^

I understand the error since the function liftSqlPersistMPool hardcoded the IO type.

How can I solve this to use it with the RIO type ?

0

There are 0 answers