module Control.Monad.Except.Missing where import Control.Monad.Except (MonadError(catchError, throwError)) import Data.Functor (($>)) finally :: MonadError e m => m a -> m b -> m a finally action finalizer = do a <- action `catchError` \e -> finalizer >> throwError e finalizer $> a