Вот решение, которое использует partition
:
private def process(result: List[Either[Error, Files]]): Either[Error, List[Files]] =
result.partition(_.isLeft) match {
case (Left(error)::_, _) =>
Left(error)
case (_, r) =>
Right(r.collect{ case Right(r) => r })
}
Эта рекурсивная версия более эффективна, но, возможно, менее ясна:
private def process(result: List[Either[Error, Files]]): Either[Error, List[Files]] = {
@annotation.tailrec
def loop(rem: List[Either[Error, Files]], res: List[Files]): Either[Error, List[Files]] =
rem match {
case Left(error) :: _ =>
Left(error)
case Right(file) :: tail =>
loop(tail, file +: res)
case _ =>
Right(res.reverse)
}
loop(result, Nil)
}