@@ -8,7 +8,7 @@ module Servant.Server.Internal.RouteResult where
8
8
9
9
import Control.Monad (ap )
10
10
import Control.Monad.Base (MonadBase (.. ))
11
- import Control.Monad.Catch (MonadThrow (.. ))
11
+ import Control.Monad.Catch (ExitCase ( .. ), MonadCatch ( .. ), MonadMask ( .. ), MonadThrow (.. ))
12
12
import Control.Monad.Trans (MonadIO (.. ), MonadTrans (.. ))
13
13
import Control.Monad.Trans.Control
14
14
( ComposeSt
@@ -75,3 +75,43 @@ instance MonadTransControl RouteResultT where
75
75
76
76
instance MonadThrow m => MonadThrow (RouteResultT m ) where
77
77
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