Объединение двух разных типов или работа с будущим и тем и другим? - PullRequest
0 голосов
/ 28 апреля 2020

В настоящее время у меня есть следующие методы:


/** EXISTING METHOD **/
 def getExcelFile(id: String) : EitherT[Future, AppError, File] = {

    // Returns EitherT[Future, AppError, Bank]
    val bank = findBank(id)

    // Returns EitherT[Future, AppError, List[Services]]
    val services = EitherT(client.services(id))

    // Returns EitherT[Future, AppError, List[AggregatedInformation]]
    val aggregateInfoFromSourceA = fromSourceA(id)

    (for {
      bankInfo <- bank 
      servicesList <- services
      result <- EitherT.right(exportService.source(bankInfo, servicesList, aggregateInfoFromSourceA))
    } yield {
      result
    }) 
 }


Теперь у меня есть этот новый метод, который я хотел бы добавить к существующим for-comprehension.


 def fromSourceB(accounts: List[Account], clients: List[Client]) : Future[List[AggregatedInformation]] = 
 {
     // Implementation here   
 }

Параметры accounts и clients происходят от двух EitherT:


     // Returns EitherT[Future, AppError, Account]
    val accounts = findAccounts(id)

    // Returns EitherT[Future, AppError, Client]
    val clients = findClients(id)

Я пытаюсь реализовать что-то вроде:


 def getExcelFile(id: String) : EitherT[Future, AppError, File] = {

    // Returns EitherT[Future, AppError, Bank]
    val bank = findBank(id)

    // Returns EitherT[Future, AppError, List[Services]]
    val services = EitherT(client.services(id))

    // Returns EitherT[Future, AppError, List[AggregatedInformation]]
    val aggregateInfoFromSourceA = fromSourceA(id)

     // Returns EitherT[Future, AppError, Account]
    val accounts = findAccounts(id)

    // Returns EitherT[Future, AppError, Client]
    val clients = findClients(id)

    // TODO 
    val aggregateInfoFromSourceB = aggregateInfo( ???, ???)

    (for {
      bankInfo <- bank 
      servicesList <- services
      sourceA <- aggregateInfoFromSourceA 
      sourceB <- aggregateInfoFromSourceB 
      result <- EitherT.right(exportService.source(bankInfo, servicesList, sourceA ::: sourceB))
    } yield {
      result
    }) 
 }

Что я сделал пока нужно изменить метод aggregateInfo следующим образом:


 def fromSourceB(accounts: List[Account], clients: List[Client]) : EitherT[Future, Nothing, List[AggregatedInformation]] = 
 {
     // Implementation here   
 }

и for-comprehension следующим образом


 def getExcelFile(id: String) : EitherT[Future, AppError, File] = {

    // Returns EitherT[Future, AppError, Bank]
    val bank = findBank(id)

    // Returns EitherT[Future, AppError, List[Services]]
    val services = EitherT(client.services(id))

    // Returns EitherT[Future, AppError, List[AggregatedInformation]]
    val aggregateInfoFromSourceA = fromSourceA(id)

     // Returns EitherT[Future, AppError, Account]
    val accounts = findAccounts(id)

    // Returns EitherT[Future, AppError, Client]
    val clients = findClients(id)

    (for {
      bankInfo <- bank 
      servicesList <- services
      sourceA <- aggregateInfoFromSourceA 
      clientList <- clients
      accountList <- accounts
      sourceB <- aggregateInfoFromSourceB(clientList, accountList)
      result <- EitherT.right(exportService.source(bankInfo, servicesList, sourceA ::: sourceB))
    } yield {
      result
    }) 
 }

Но я не думаю, что это решение действительно чистое. Есть ли способ улучшить это?

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...