@@ -13,11 +13,11 @@ module Servant.Server.Internal.RoutingApplication where
13import Control.Monad (ap, liftM)
13import Control.Monad (ap, liftM)
14import Control.Monad.Base (MonadBase (..))
14import Control.Monad.Base (MonadBase (..))
15import Control.Monad.Catch (MonadThrow (..))
15import Control.Monad.Catch (MonadThrow (..))
16−import Control.Monad.Reader (MonadReader (..), ReaderT, runReaderT)
16+import Control.Monad.Reader (MonadReader (..), ReaderT (..), runReaderT)
17import Control.Monad.Trans (MonadIO (..), MonadTrans (..))
17import Control.Monad.Trans (MonadIO (..), MonadTrans (..))
18import Control.Monad.Trans.Control (ComposeSt, MonadBaseControl (..), MonadTransControl (..),
18import Control.Monad.Trans.Control (ComposeSt, MonadBaseControl (..), MonadTransControl (..),
19 defaultLiftBaseWith, defaultRestoreM)
19 defaultLiftBaseWith, defaultRestoreM)
20−import Control.Monad.Trans.Resource (MonadResource (..), ResourceT, runResourceT, transResourceT)
20+import Control.Monad.Trans.Resource (MonadResource (..), ResourceT, runResourceT, transResourceT, withInternalState, runInternalState)
21import Network.Wai (Application, Request, Response, ResponseReceived)
21import Network.Wai (Application, Request, Response, ResponseReceived)
22import Prelude ()
22import Prelude ()
23import Prelude.Compat
23import Prelude.Compat
@@ -84,7 +84,6 @@ instance MonadTransControl RouteResultT where
84instance MonadThrow m => MonadThrow (RouteResultT m) where
84instance MonadThrow m => MonadThrow (RouteResultT m) where
85 throwM = lift . throwM
85 throwM = lift . throwM
88toApplication :: RoutingApplication -> Application
87toApplication :: RoutingApplication -> Application
89toApplication ra request respond = ra request routingRespond
88toApplication ra request respond = ra request routingRespond
@@ -194,18 +193,27 @@ newtype DelayedIO a = DelayedIO { runDelayedIO' :: ReaderT Request (ResourceT (R
195 ( Functor, Applicative, Monad
194 ( Functor, Applicative, Monad
196 , MonadIO, MonadReader Request
195 , MonadIO, MonadReader Request
198 , MonadThrow
196 , MonadThrow
199 , MonadResource
197 , MonadResource
200+instance MonadBase IO DelayedIO where
202liftRouteResult :: RouteResult a -> DelayedIO a
203liftRouteResult :: RouteResult a -> DelayedIO a
203liftRouteResult x = DelayedIO $ lift . lift $ RouteResultT . return $ x
204liftRouteResult x = DelayedIO $ lift . lift $ RouteResultT . return $ x
205instance MonadBaseControl IO DelayedIO where
206instance MonadBaseControl IO DelayedIO where
206− type StM DelayedIO a = StM (ReaderT Request (ResourceT (RouteResultT IO))) a
207+ -- type StM DelayedIO a = StM (ReaderT Request (ResourceT (RouteResultT IO))) a
207− liftBaseWith f = DelayedIO $ liftBaseWith $ \g -> f (g . runDelayedIO')
208+ -- liftBaseWith f = DelayedIO $ liftBaseWith $ \g -> f (g . runDelayedIO')
208− restoreM = DelayedIO . restoreM
209+ -- restoreM = DelayedIO . restoreM
211+ type StM DelayedIO a = RouteResult a
212+ liftBaseWith f = DelayedIO $ ReaderT $ \req -> withInternalState $ \s ->
213+ liftBaseWith $ \runInBase -> f $ \x ->
214+ runInBase (runInternalState (runReaderT (runDelayedIO' x) req) s)
215+ restoreM = DelayedIO . lift . withInternalState . const . restoreM
210runDelayedIO :: DelayedIO a -> Request -> ResourceT IO (RouteResult a)
218runDelayedIO :: DelayedIO a -> Request -> ResourceT IO (RouteResult a)
211runDelayedIO m req = transResourceT runRouteResultT $ runReaderT (runDelayedIO' m) req
219runDelayedIO m req = transResourceT runRouteResultT $ runReaderT (runDelayedIO' m) req