module Control.Exception.IOChoice.Lifted where
import Control.Exception (IOException)
import Control.Exception.Lifted (catch, throwIO)
import Control.Monad.Base (MonadBase)
import Control.Monad.IO.Class
import Control.Monad.Trans.Control (MonadBaseControl)
import Prelude hiding (catch)
(||>) :: MonadBaseControl IO m => m a -> m a -> m a
x ||> y = x `catch` (\(_ :: IOException) -> y)
infixl 3 ||>
goNext :: (MonadIO m, MonadBase IO m) => m a
goNext = throwIO $ userError "goNext for lifted IO"
runAnyOne :: (MonadIO m, MonadBaseControl IO m) => [m a] -> m a
runAnyOne = foldr (||>) goNext