    ------------------------------------------------------------------------------
    -- | Wrapper for Control.Monad.Except from the mtl library (>= 2.2.1)
    ------------------------------------------------------------------------------

    module Agda.Utils.Except
      ( Error(noMsg, strMsg)
      , ExceptT
      , mapExceptT
      , mkExceptT
      , MonadError(catchError, throwError)
      , runExceptT
      ) where

    import Control.Monad.Except

    ------------------------------------------------------------------------

    -- | We cannot define data constructors synonymous, so we define the
    -- @mkExceptT@ function to be used instead of the data constructor
    -- @ExceptT@.
    mkExceptT :: m (Either e a) -> ExceptT e m a
    mkExceptT = ExceptT

    -- | Error class for backward compatibility (from
    -- Control.Monad.Trans.Error in transformers 0.3.0.0).

    class Error a where
      noMsg  :: a
      strMsg :: String -> a

      noMsg    = strMsg ""
      strMsg _ = noMsg

    -- | A string can be thrown as an error.
    instance Error String where
      strMsg = id