Scala Cats EitherT и foreach - PullRequest
       24

Scala Cats EitherT и foreach

0 голосов
/ 05 ноября 2018

Я пытаюсь добиться чего-то вроде следующего кода

def getUsers: EitherT[Future, String, Response] = {
  for {
    users <- EitherT(userRepository.findAll) // this method would retrieve a Future[Either[String, Seq[User]]]
    user <- users
    friends <- EitherT(userRepository.findFriends(user.id))
  } yield new Response(user, friends)
}

Я понимаю, что это невозможно, потому что EitherT не управляет foreach.

case class User(id: Long, name: String, email: String)

case class Response(user: User, friends: Seq[User])

Какой хороший способ решить эту проблему?

1 Ответ

0 голосов
/ 06 ноября 2018

Поскольку вы находите всех пользователей, у вас будет несколько пользователей со своими соответствующими друзьями, поэтому я изменил ваше возвращаемое значение, чтобы вместо него возвращалось List из Response с. Тогда, возможно, вы хотите сделать что-то вроде этого:

import cats.data.EitherT
import cats.syntax.traverse._
import cats.instances.list._
import cats.instances.future._
import scala.concurrent.Future

def getUsers: EitherT[Future, String, List[Response]] = {
  EitherT(userRepository.findAll).flatMap { users =>
    users.toList.traverse(user => EitherT(userRepository.findFriends(user.id)).map(Response(user, _)))
  }
}

Убедитесь, что у вас есть неявная ExecutionContext область действия или импорт scala.concurrent.ExecutionContext.Implicits.global.

...