{-# OPTIONS_GHC -Wno-orphans #-} module UnliftIO.Except () where import Control.Monad ((<=<)) import Control.Monad.Except (ExceptT (..), runExceptT) import UnliftIO instance (MonadUnliftIO m, Exception e) => MonadUnliftIO (ExceptT e m) where withRunInIO :: forall b. ((forall a. ExceptT e m a -> IO a) -> IO b) -> ExceptT e m b withRunInIO (forall a. ExceptT e m a -> IO a) -> IO b exceptToIO = forall e (m :: * -> *) a. m (Either e a) -> ExceptT e m a ExceptT forall a b. (a -> b) -> a -> b $ forall (m :: * -> *) e a. (MonadUnliftIO m, Exception e) => m a -> m (Either e a) try forall a b. (a -> b) -> a -> b $ do forall (m :: * -> *) b. MonadUnliftIO m => ((forall a. m a -> IO a) -> IO b) -> m b withRunInIO forall a b. (a -> b) -> a -> b $ \forall a. m a -> IO a runInIO -> (forall a. ExceptT e m a -> IO a) -> IO b exceptToIO (forall a. m a -> IO a runInIO forall b c a. (b -> c) -> (a -> b) -> a -> c . (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c either forall (m :: * -> *) e a. (MonadIO m, Exception e) => e -> m a throwIO forall (f :: * -> *) a. Applicative f => a -> f a pure forall (m :: * -> *) b c a. Monad m => (b -> m c) -> (a -> m b) -> a -> m c <=< forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a) runExceptT))