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