{-# LANGUAGE CPP, NoMonomorphismRestriction #-}

-- | Wrapper module around Control.Monad.Error, in order to be backwards compatible as far as UHC is concerned.

module UHC.Util.Error
  (
# if __GLASGOW_HASKELL__ >= 710
    module Control.Monad.Except
  -- , module Control.Monad.Error.Class
  , Error(..)
  , ErrorT
  
  , runErrorT 
  , withErrorT
  , mapErrorT 

  , runError  
  , withError 
  , mapError  
# else
    module Control.Monad.Error
# endif
  )
  where

#if __GLASGOW_HASKELL__ >= 710
import Control.Monad.Except
-- import Control.Monad.Error.Class (Error(..))
#else
import Control.Monad.Error
#endif

#if __GLASGOW_HASKELL__ >= 710
type ErrorT = ExceptT

runErrorT  = runExceptT
withErrorT = withExceptT
mapErrorT  = mapExceptT

runError  = runExcept
withError = withExcept
mapError  = mapExcept

-- | Copied/old/deprecated functionality from Control.Monad.Error.Class
class Error a where
    -- | Creates an exception without a message.
    -- The default implementation is @'strMsg' \"\"@.
    noMsg  :: a
    -- | Creates an exception with a message.
    -- The default implementation of @'strMsg' s@ is 'noMsg'.
    strMsg :: String -> a

    noMsg    = strMsg ""
    strMsg _ = noMsg

#else
#endif