{-# LANGUAGE FlexibleContexts #-} module Control.Monad.CatchIO.Try ( tryIO , eitherIO {- , MonadCatchIO , MonadIO , liftIO , MonadError , Error , ErrorType , throwError , strMsg , ErrorT , runErrorT-} ) where import Control.Exception (IOException) import Control.Monad.CatchIO (MonadCatchIO,tryJust) import Control.Monad.Trans.Error (strMsg) import Control.Monad.Error (MonadError,Error,ErrorType,throwError,MonadIO,liftIO) tryIO :: (Error (ErrorType m),MonadError m,MonadCatchIO m,Functor m) => IO a -> m a tryIO = (=<<) (either (throwError . strMsg . show) return) . eitherIO . liftIO eitherIO :: (MonadCatchIO m,Functor m) => m a -> m (Either IOException a) eitherIO = tryJust (Just :: IOException -> Maybe IOException)