В настоящее время у меня есть следующие методы:
/** 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
})
}
Но я не думаю, что это решение действительно чистое. Есть ли способ улучшить это?
Спасибо.