module Web.Simple.Controller.Exception where import qualified Control.Exception as E import Control.Monad.Trans.Control import Web.Simple.Controller onException :: Controller s a -> Controller s b -> Controller s a onException :: forall s a b. Controller s a -> Controller s b -> Controller s a onException Controller s a act Controller s b handler = forall (b :: * -> *) (m :: * -> *) a. MonadBaseControl b m => (RunInBase m b -> b (StM m a)) -> m a control forall a b. (a -> b) -> a -> b $ \RunInBase (ControllerT s IO) IO runInM -> do RunInBase (ControllerT s IO) IO runInM Controller s a act forall a b. IO a -> IO b -> IO a `E.onException` RunInBase (ControllerT s IO) IO runInM Controller s b handler finally :: Controller s a -> Controller s b -> Controller s a finally :: forall s a b. Controller s a -> Controller s b -> Controller s a finally Controller s a act Controller s b next = forall (b :: * -> *) (m :: * -> *) a. MonadBaseControl b m => (RunInBase m b -> b (StM m a)) -> m a control forall a b. (a -> b) -> a -> b $ \RunInBase (ControllerT s IO) IO runInM -> forall b. ((forall a. IO a -> IO a) -> IO b) -> IO b E.mask forall a b. (a -> b) -> a -> b $ \forall a. IO a -> IO a restore -> do (Either Response a, s) r <- forall a. IO a -> IO a restore (RunInBase (ControllerT s IO) IO runInM Controller s a act) forall a b. IO a -> IO b -> IO a `E.onException` (RunInBase (ControllerT s IO) IO runInM Controller s b next) (Either Response b, s) _ <- RunInBase (ControllerT s IO) IO runInM Controller s b next forall (m :: * -> *) a. Monad m => a -> m a return (Either Response a, s) r bracket :: Controller s a -> (a -> Controller s b) -> (a -> Controller s c) -> Controller s c bracket :: forall s a b c. Controller s a -> (a -> Controller s b) -> (a -> Controller s c) -> Controller s c bracket Controller s a aquire a -> Controller s b release a -> Controller s c act = forall (b :: * -> *) (m :: * -> *) a. MonadBaseControl b m => (RunInBase m b -> b (StM m a)) -> m a control forall a b. (a -> b) -> a -> b $ \RunInBase (ControllerT s IO) IO runInM -> forall b. ((forall a. IO a -> IO a) -> IO b) -> IO b E.mask forall a b. (a -> b) -> a -> b $ \forall a. IO a -> IO a restore -> do let release' :: (Either Response a, s) -> IO (StM (ControllerT s IO) b) release' (Either Response a, s) a = RunInBase (ControllerT s IO) IO runInM forall a b. (a -> b) -> a -> b $ forall (b :: * -> *) (m :: * -> *) a. MonadBaseControl b m => StM m a -> m a restoreM (Either Response a, s) a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= a -> Controller s b release (Either Response a, s) a <- RunInBase (ControllerT s IO) IO runInM Controller s a aquire (Either Response c, s) r <- (forall a. IO a -> IO a restore forall a b. (a -> b) -> a -> b $ RunInBase (ControllerT s IO) IO runInM forall a b. (a -> b) -> a -> b $ forall (b :: * -> *) (m :: * -> *) a. MonadBaseControl b m => StM m a -> m a restoreM (Either Response a, s) a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= a -> Controller s c act) forall a b. IO a -> IO b -> IO a `E.onException` (Either Response a, s) -> IO (Either Response b, s) release' (Either Response a, s) a (Either Response b, s) _ <- (Either Response a, s) -> IO (Either Response b, s) release' (Either Response a, s) a forall (m :: * -> *) a. Monad m => a -> m a return (Either Response c, s) r handle :: E.Exception e => (e -> Controller s a) -> Controller s a -> Controller s a handle :: forall e s a. Exception e => (e -> Controller s a) -> Controller s a -> Controller s a handle e -> Controller s a handler Controller s a act = forall (b :: * -> *) (m :: * -> *) a. MonadBaseControl b m => (RunInBase m b -> b (StM m a)) -> m a control forall a b. (a -> b) -> a -> b $ \RunInBase (ControllerT s IO) IO runInM -> do forall e a. Exception e => (e -> IO a) -> IO a -> IO a E.handle (RunInBase (ControllerT s IO) IO runInM forall b c a. (b -> c) -> (a -> b) -> a -> c . e -> Controller s a handler) forall a b. (a -> b) -> a -> b $ RunInBase (ControllerT s IO) IO runInM Controller s a act