module Data.Alternative.IO.Lifted where
import Control.Exception (Exception, SomeException)
import Control.Exception.Lifted (catch, throwIO)
import Control.Monad.Base (MonadBase)
import Control.Monad.IO.Class
import Control.Monad.Trans.Control (MonadBaseControl)
import Data.Typeable
import Prelude hiding (catch)
(<||>) :: MonadBaseControl IO m => m a -> m a -> m a
x <||> y = x `catch` (\(_ :: SomeException) -> y)
goNext :: (MonadIO m, MonadBase IO m) => m a
goNext = throwIO AltIOLiftedGoNext
runAnyOne :: (MonadIO m, MonadBaseControl IO m) => [m a] -> m a
runAnyOne = foldr (<||>) goNext
data AltIOLiftedGoNext = AltIOLiftedGoNext deriving (Show, Typeable)
instance Exception AltIOLiftedGoNext