module Control.Monad.Except.Util (
assert
, deny
, tryIO
) where
import Control.Exception (IOException, try)
import Control.Monad (unless, when)
import Control.Monad.Except (MonadError, MonadIO, liftIO, throwError)
import Data.String (IsString(..))
tryIO :: (IsString e, MonadError e m, MonadIO m) => IO a -> m a
tryIO = (>>= either (\e -> throwError . fromString $ show (e :: IOException)) return) . liftIO . try
assert :: (IsString e, MonadError e m) => e -> Bool -> m ()
assert = flip unless . throwError
deny :: (IsString e, MonadError e m) => e -> Bool -> m ()
deny = flip when . throwError