
Hello, ----------------->>>>>>>>>><<<<<<<<<-------------------- runDB: need liftIOHandler ⁋For the impatient: stick liftIOHandler at the beginning of runDB like so: runDB db = liftIOHandler $ fmap connPool getYesod >>= Settings.runConnectionPool dbNo comments Add a commentName: ⁋For everyone else: WAI 0.2 contained the request body as an Enumerator in the Request datatype, and an Application was Request -> IO Response. In WAI 0.3, an Application is Request -> Iteratee ByteString IO Response. Long story short: all code in your Handler function now lives on top of an Iteratee monad so that it can access the request body.No comments Add a commentName: ⁋This works great most of the time. The only downside is when you need to deal with exceptions. It's impossible to define a MonadPeelIO instance for Iteratee. Therefore, in Yesod 0.7, we have a new datatype called GGHandler, which is just a generalization of GHandler to allow an arbitrary inner monad.No comments Add a commentName: ⁋GHandler defaults to having an Iteratee on the inside. But when you need a MonadPeelIO (like we do in Persistent), you need to have an IO on the inside. Eventually though, you'll need to convert your GGHandler IO to a GHandler. That's what liftIOHandler does.No comments ----------------->>>>>>>>>><<<<<<<<<-------------------- Could anyone please explain this better, and what it means to someone upgrading an application? Specifically, what happens to: -- | A useful synonym; most of the DB handler functions are of this type type DB = SqlPersist Handler ? Thanks :-), Aur

Well, regarding:
type DB = SqlPersist Handler
Assuming the definition of Handler is something like:
type Handler = GHandler MyApp My App
The definition of GHandler is:
type GHandler sub master = GGHandler sub master (Iteratee ByteString IO)
-- or something like that
So you've defined that a database action wraps around an Iteratee. As the
text below states, an Iteratee cannot have an instance of MonadPoolIO, and
therefore you can't perform Persistent actions against it. Therefore, you'll
never be able to do anything. So instead, we need the inner monad for DB to
be something with a MonadPoolIO instance, such as:
type DB = SqlPersist (GGHandler MyApp MyApp IO)
The only problem is that after running a DB action, you'll be left with a
GGHandler wrapping around IO, but Yesod expects a GGHandler wrapping around
Iteratee. Therefore, you need to call liftIOHandler, which has a type of
something like:
liftIOHandler :: MonadIO m => GGHandler sub master IO a -> GGHandler sub
master m a
HTH,
Michael
On Fri, Apr 8, 2011 at 2:53 PM, Aur Saraf
Hello,
----------------->>>>>>>>>><<<<<<<<<--------------------
runDB: need liftIOHandler
⁋For the impatient: stick liftIOHandler at the beginning of runDB like so: runDB db = liftIOHandler $ fmap connPool getYesod >>= Settings.runConnectionPool dbNo comments Add a commentName:
⁋For everyone else: WAI 0.2 contained the request body as an Enumerator in the Request datatype, and an Application was Request -> IO Response. In WAI 0.3, an Application is Request -> Iteratee ByteString IO Response. Long story short: all code in your Handler function now lives on top of an Iteratee monad so that it can access the request body.No comments Add a commentName:
⁋This works great most of the time. The only downside is when you need to deal with exceptions. It's impossible to define a MonadPeelIO instance for Iteratee. Therefore, in Yesod 0.7, we have a new datatype called GGHandler, which is just a generalization of GHandler to allow an arbitrary inner monad.No comments Add a commentName:
⁋GHandler defaults to having an Iteratee on the inside. But when you need a MonadPeelIO (like we do in Persistent), you need to have an IO on the inside. Eventually though, you'll need to convert your GGHandler IO to a GHandler. That's what liftIOHandler does.No comments
----------------->>>>>>>>>><<<<<<<<<--------------------
Could anyone please explain this better, and what it means to someone upgrading an application?
Specifically, what happens to:
-- | A useful synonym; most of the DB handler functions are of this type type DB = SqlPersist Handler
?
Thanks :-), Aur
_______________________________________________ web-devel mailing list web-devel@haskell.org http://www.haskell.org/mailman/listinfo/web-devel
participants (2)
-
Aur Saraf
-
Michael Snoyman