40 lines
1.2 KiB
Haskell
40 lines
1.2 KiB
Haskell
|
{-# LANGUAGE TypeFamilies, ScopedTypeVariables #-}
|
||
|
module Language.Haskell.GhcMod.Error (
|
||
|
GhcModError(..)
|
||
|
, modifyError
|
||
|
, modifyError'
|
||
|
, tryFix
|
||
|
, module Control.Monad.Error
|
||
|
, module Exception
|
||
|
) where
|
||
|
|
||
|
import Control.Monad.Error (MonadError(..), Error(..))
|
||
|
import Exception
|
||
|
|
||
|
data GhcModError = GMENoMsg
|
||
|
-- ^ Unknown error
|
||
|
| GMEString String
|
||
|
-- ^ Some Error with a message. These are produced mostly by
|
||
|
-- 'fail' calls on GhcModT.
|
||
|
| GMECabalConfigure GhcModError
|
||
|
-- ^ Configuring a cabal project failed.
|
||
|
| GMEProcess [String] GhcModError
|
||
|
-- ^ Launching an operating system process failed. The first
|
||
|
-- field is the command.
|
||
|
deriving (Eq,Show)
|
||
|
|
||
|
instance Error GhcModError where
|
||
|
noMsg = GMENoMsg
|
||
|
strMsg = GMEString
|
||
|
|
||
|
modifyError :: MonadError e m => (e -> e) -> m a -> m a
|
||
|
modifyError f action = action `catchError` \e -> throwError $ f e
|
||
|
|
||
|
infixr 0 `modifyError'`
|
||
|
modifyError' :: MonadError e m => m a -> (e -> e) -> m a
|
||
|
modifyError' = flip modifyError
|
||
|
|
||
|
tryFix :: MonadError e m => m a -> (e -> m ()) -> m a
|
||
|
tryFix action fix = do
|
||
|
action `catchError` \e -> fix e >> action
|