Мы можем нанести на карту HashMap
, как и любую другую коллекцию, например List
m.flatMap({ case (key, values) => values.map(f(_, key)) })
, где m: Map[A, Seq[B]]
и f: (B, A) => Future[Unit]
. Это возвращает Iterable[Future[Unit]]
, поэтому мы можем использовать Future.sequence
для инвертирования в Future[Iterable[Unit]]
m
.flatMap({ case (key, values) => values.map(f(_, key)) })
.pipe(Future.sequence(_))
Фьючерсы внутренне представляют успех / неудачу, используя Try
, который мы можем преобразовать в Either
используя transform
и toEither
примерно так
m // : Map[A, Seq[B]]
.flatMap({ case (key, values) => values.map(f(_, key)) }) // : Iterable[Future[Unit]]
.pipe(Future.sequence(_)) // : Future[Iterable[Unit]]
.map(_ => ()) // : Future[Unit]
.transform(tryResult => Success(tryResult.toEither)) // : Future[Either[Throwable, Unit]]
, что возвращает требуемый тип Future[Either[Error, Unit]]
. Метод pipe
исходит из import util.chaining._
Лично преобразование из Map[A, Seq[B]]
в Future[Either[Error, Unit]]
выглядит немного подозрительным.