[Persistent] PersistBackend and the ErrorT monad

Hi, I am trying to use an ErrorT monad inside some Persist code. I wrote the following instance: newtype OcrError = OE String ... instance PersistBackend m => PersistBackend (ErrorT OcrError m) where replace k v = lift $ replace k v update k l = lift $ update k l updateWhere f u = lift $ updateWhere f u delete = lift . delete insert = lift . insert deleteBy = lift . deleteBy deleteWhere = lift . deleteWhere get = lift . get getBy = lift . getBy count = lift . count selectKeys f = selectKeys f selectEnum f o lim off = selectEnum f o lim off It seems like there is a problem with selectEnum though. In GHCI, this: l :: [PersistKV OcrRefMap] <- rs $ selectEnum [] [] 0 0 works fine, while this: l :: Either OcrError [PersistKV OcrRefMap] <- rs $ runErrorT $ selectEnum [] [] 0 0 hangs. rs is a small function to run persist calls: rs :: (MonadControlIO m) => SqlPersist m a -> m a rs f = do let conn = DT.pack "user=hachicode password=password host=localhost port=5432 dbname=hachicode" withPostgresqlConn conn $ runSqlConn f and you need -XScopedTypeVariables for the ghci commands. Any advice? Thanks, Max

Is this on Persistent 0.5 or 0.6?
On Wed, Aug 24, 2011 at 12:33 PM, Max Cantor
Hi,
I am trying to use an ErrorT monad inside some Persist code.
I wrote the following instance:
newtype OcrError = OE String ... instance PersistBackend m => PersistBackend (ErrorT OcrError m) where replace k v = lift $ replace k v update k l = lift $ update k l updateWhere f u = lift $ updateWhere f u delete = lift . delete insert = lift . insert deleteBy = lift . deleteBy deleteWhere = lift . deleteWhere get = lift . get getBy = lift . getBy count = lift . count selectKeys f = selectKeys f selectEnum f o lim off = selectEnum f o lim off
It seems like there is a problem with selectEnum though.
In GHCI, this:
l :: [PersistKV OcrRefMap] <- rs $ selectEnum [] [] 0 0
works fine, while this:
l :: Either OcrError [PersistKV OcrRefMap] <- rs $ runErrorT $ selectEnum [] [] 0 0
hangs. rs is a small function to run persist calls: rs :: (MonadControlIO m) => SqlPersist m a -> m a rs f = do let conn = DT.pack "user=hachicode password=password host=localhost port=5432 dbname=hachicode" withPostgresqlConn conn $ runSqlConn f
and you need -XScopedTypeVariables for the ghci commands.
Any advice?
Thanks, Max

0.5.1. sorry for forgetting to mention. max On Aug 24, 2011, at 6:09 PM, Michael Snoyman wrote:
Is this on Persistent 0.5 or 0.6?
On Wed, Aug 24, 2011 at 12:33 PM, Max Cantor
wrote: Hi, I am trying to use an ErrorT monad inside some Persist code.
I wrote the following instance:
newtype OcrError = OE String ... instance PersistBackend m => PersistBackend (ErrorT OcrError m) where replace k v = lift $ replace k v update k l = lift $ update k l updateWhere f u = lift $ updateWhere f u delete = lift . delete insert = lift . insert deleteBy = lift . deleteBy deleteWhere = lift . deleteWhere get = lift . get getBy = lift . getBy count = lift . count selectKeys f = selectKeys f selectEnum f o lim off = selectEnum f o lim off
It seems like there is a problem with selectEnum though.
In GHCI, this:
l :: [PersistKV OcrRefMap] <- rs $ selectEnum [] [] 0 0
works fine, while this:
l :: Either OcrError [PersistKV OcrRefMap] <- rs $ runErrorT $ selectEnum [] [] 0 0
hangs. rs is a small function to run persist calls: rs :: (MonadControlIO m) => SqlPersist m a -> m a rs f = do let conn = DT.pack "user=hachicode password=password host=localhost port=5432 dbname=hachicode" withPostgresqlConn conn $ runSqlConn f
and you need -XScopedTypeVariables for the ghci commands.
Any advice?
Thanks, Max
participants (2)
-
Max Cantor
-
Michael Snoyman