This module supports monads that can throw extensible exceptions. The
exceptions are the very same from
Control.Exception, and the
operations offered very similar, but here they are not limited to
IO.
This code is in the style of both transformers and mtl, and is
compatible with them, though doesn't mimic the module structure or
offer the complete range of features in those packages.
This is very similar to
ExceptT and
MonadError, but
based on features of
Control.Exception. In particular, it
handles the complex case of asynchronous exceptions by including
mask in the typeclass. Note that the extensible exceptions
feature relies on the RankNTypes language extension.