Scala cat map EitherT Futures с парами ключ-> значение

Я немного застрял, но, возможно, кто-то может мне помочь.

У меня есть список идентификаторов, я хочу сделать вызов API:

val ids:List[String] = List("id1","id2","id3", "id4")

И этот метод API, который возвращает EitherT[Future, CustomError, JValue]

def recordById(id: String)(implicit ec: ExecutionContext): EitherT[Future, CustomError, JValue]

Код ниже работает так, как я хочу: последовательность списка фьючерсов на одно будущее списка

val action:Future[List[Either[CustomError,JValue]]] = ids.map(
  id => api.recordById(id).value
).sequence

Но я действительно хочу сохранить идентификаторы с результатом, например:

val action2:Future[List[(String,Either[CustomError,JValue])]] = ids.map(
  id => (id, api.recordById(id).value)
).sequence

1 ответ

Решение

Как я печатал вопрос. Что-то сработало, и я действительно заставил это работать, используя traverse вместо sequence

val action2:Future[List[(String,Either[CustomError,JValue])]] = ids.map(
  id => (id, apiv4.recordById(id).value)
).traverse{
  case (id, etf) => etf.map(et => (id, et))
}

Кажется, это работает, как я хотел. Я открыт для улучшений / предложений

Редактировать:

Предложение Marth

ids.traverse(id => apiv4.recordById(id).value.map(id -> _))
Другие вопросы по тегам