{-# LANGUAGE ScopedTypeVariables, FlexibleContexts #-}
module Control.Exception.IOChoice.Lifted where
import Control.Exception (IOException)
import qualified Control.Exception.Lifted as L (catch, throwIO)
import Control.Monad.Base (MonadBase)
import Control.Monad.IO.Class
import Control.Monad.Trans.Control (MonadBaseControl)
(||>) :: MonadBaseControl IO m => m a -> m a -> m a
x ||> y = x `L.catch` (\(_ :: IOException) -> y)
infixr 3 ||>
goNext :: (MonadIO m, MonadBase IO m) => m a
goNext = L.throwIO $ userError "goNext for lifted IO"
runAnyOne :: (MonadIO m, MonadBaseControl IO m) => [m a] -> m a
runAnyOne = foldr (||>) goNext