simple-0.10.0.3: src/Web/Simple/Controller/Exception.hs
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 act handler = control $ \runInM -> do
runInM act `E.onException` runInM handler
finally :: Controller s a -> Controller s b -> Controller s a
finally act next = control $ \runInM -> E.mask $ \restore -> do
r <- restore (runInM act) `E.onException` (runInM next)
_ <- runInM next
return r
bracket :: Controller s a -> (a -> Controller s b)
-> (a -> Controller s c) -> Controller s c
bracket aquire release act = control $ \runInM -> E.mask $ \restore -> do
let release' a = runInM $ restoreM a >>= release
a <- runInM aquire
r <- (restore $ runInM $ restoreM a >>= act) `E.onException` release' a
_ <- release' a
return r
handle :: E.Exception e => (e -> Controller s a) -> Controller s a
-> Controller s a
handle handler act = control $ \runInM -> do
E.handle (runInM . handler) $ runInM act