module Data.Enumerator.Util where import Data.Enumerator import Control.Monad.IO.Class (MonadIO, liftIO) import qualified Control.Exception as E tryStep :: MonadIO m => IO t -> (t -> m (Step a m b)) -> m (Step a m b) tryStep get io = do tried <- liftIO (E.try get) case tried of Right t -> io t Left err -> return $ Error err {-# INLINE tryStep #-} mapEither :: (a -> Either e b) -> [a] -> Either e [b] mapEither f = loop [] where loop acc [] = Right (reverse acc) loop acc (a:as) = case f a of Left err -> Left err Right b -> loop (b:acc) as {-# INLINE mapEither #-}