Идиоматическая стрела - PullRequest
2 голосов
/ 16 мая 2019

У меня есть следующий метод:

internal typealias MaybeError<T> = Either<GenericError, T>

override fun createCompany(companyDomain: CompanyDomain): MaybeError<CompanyDomain> =
    checkCompany(companyDomain).map { it.toEntity() }.fold({ Either.left(it) }) { company ->
        with (companyRepository) {
            isCompanyExists(company).fold({ Either.left(it) }) { isExists ->
                if (isExists) return@with Either.left(CompanyNameExists(companyDomain))
                createCompany(company).fold({ Either.right(companyDomain) }) { Either.left(it) }
            }
        }
    }

Есть ли лучший / более идиоматический способ написать это с помощью стрелки?

1 Ответ

1 голос
/ 17 мая 2019

Трудно провести рефакторинг, потому что я могу только предполагать, какие используемые методы должны возвращаться.Но я думаю, что методы возвращают MaybeError.В этом случае мы можем опустить fold({ Either.left(it) }) и использовать map или flatMap.

internal typealias MaybeError<T> = Either<GenericError, T>

override fun createCompany(companyDomain: CompanyDomain): MaybeError<CompanyDomain> =
    checkCompany(companyDomain)
        .map { it.toEntity() }
        .flatMap { company ->
            companyRepository.isCompanyExists(company)
                .flatMap { isExists ->
                    if (isExists) {
                        MaybeError.left(CompanyNameExists(companyDomain))
                    } else {
                        companyRepository.createCompany(company)
                    }
                }
        }
...