@@ -8,7 +8,7 @@ module Servant.Server.Internal.RouteResult where
88
99import Control.Monad (ap )
1010import Control.Monad.Base (MonadBase (.. ))
11- import Control.Monad.Catch (MonadThrow (.. ))
11+ import Control.Monad.Catch (ExitCase ( .. ), MonadCatch ( .. ), MonadMask ( .. ), MonadThrow (.. ))
1212import Control.Monad.Trans (MonadIO (.. ), MonadTrans (.. ))
1313import Control.Monad.Trans.Control
1414 ( ComposeSt
@@ -75,3 +75,43 @@ instance MonadTransControl RouteResultT where
7575
7676instance MonadThrow m => MonadThrow (RouteResultT m ) where
7777 throwM = lift . throwM
78+
79+ instance MonadCatch m => MonadCatch (RouteResultT m ) where
80+ catch (RouteResultT m) f = RouteResultT $ catch m (runRouteResultT . f)
81+
82+ instance MonadMask m => MonadMask (RouteResultT m ) where
83+ mask f = RouteResultT $ mask $ \ u -> runRouteResultT $ f (q u)
84+ where
85+ q
86+ :: (m (RouteResult a ) -> m (RouteResult a ))
87+ -> RouteResultT m a
88+ -> RouteResultT m a
89+ q u (RouteResultT b) = RouteResultT (u b)
90+ uninterruptibleMask f = RouteResultT $ uninterruptibleMask $ \ u -> runRouteResultT $ f (q u)
91+ where
92+ q
93+ :: (m (RouteResult a ) -> m (RouteResult a ))
94+ -> RouteResultT m a
95+ -> RouteResultT m a
96+ q u (RouteResultT b) = RouteResultT (u b)
97+
98+ generalBracket acquire release use = RouteResultT $ do
99+ (eb, ec) <-
100+ generalBracket
101+ (runRouteResultT acquire)
102+ ( \ resourceRoute exitCase -> case resourceRoute of
103+ Fail e -> pure $ Fail e -- nothing to release, acquire didn't succeed
104+ FailFatal e -> pure $ FailFatal e
105+ Route resource -> case exitCase of
106+ ExitCaseSuccess (Route b) -> runRouteResultT (release resource (ExitCaseSuccess b))
107+ ExitCaseException e -> runRouteResultT (release resource (ExitCaseException e))
108+ _ -> runRouteResultT (release resource ExitCaseAbort )
109+ )
110+ ( \ case
111+ Fail e -> pure $ Fail e -- nothing to release, acquire didn't succeed
112+ FailFatal e -> pure $ FailFatal e
113+ Route resource -> runRouteResultT (use resource)
114+ )
115+ -- The order in which we perform those two effects doesn't matter,
116+ -- since the error message is the same regardless.
117+ pure ((,) <$> eb <*> ec)
0 commit comments