Either i mapowanie left - Vavr

0

Cześć, problem następujący:

sendRequest(request) //Try<Success>
            .mapTry(request -> doSomething()) //zwraca request; Try<Either<Failure, Success>>
            .toEither() //Either<Throwable, Either<Failure, Success>>
            .mapLeft(throwable -> Failure.createFromThrowable(throwable, request.getId)) //Either<Failure, Either<Failure, Success>>
            .flatMap(it -> it) //Either<Failure, Success>

Chciałbym jakoś do metody createFromThrowable(...) przepchać lewą projekcję prawej projekcji (xD). mapLeftem tego nie ogarnę, jest jakiś sposób na coś takiego?

0

W linijce 4 operuję na obiekcie typu Either<Throwable, Either<Failure,Success>> i chciałbym utworzyć nowy obiekt typu Failure za pomocą metody createFromBlabla do której przesłałbym throwable, id oraz Failure z tego eithera. Mam nadzieję, że teraz trochę lepiej to objaśniłem :D

2

Możesz zrobić z tego fold po prostu, ale moim zdaniem trzeba było od razu robić flat żeby nie mieć zagnieżdżonych eitherów/try. Czemu nie masz tam flatMapTry?

Dla mnie mindfuck jest w miejscu gdzie masz w ręce Success i zwracasz Try<Either<Failure,Success>> a potem cudujesz. Czemu nie mapujesz tego od razu na Either<Failure,Success> i doSomething() niech się martwi o ogarnięcie tego. Niemniej wygląda to dziwnie że masz 2 możliwości faila tam (w sensie masz Try czyli wyjątek, ale masz też Either, czyli błąd ale bez wyjątku).

W sumie jak tak patrze, to czemu nie:

sendRequest()
                .toEither()
                .mapLeft(throwable -> Failure.createFromThrowable(throwable))
                .flatMap(request -> doSomething())

?
Czyli od razu zamieniasz Try<Success> na Either<Failure,Success> a potem robisz normalne flatMap. Oczywiście czytelniej będzie jakby sendRequest samo zrobiło to toEither i mapLeft i zwracało samo z siebie Either<Failure,Success>.

1 użytkowników online, w tym zalogowanych: 0, gości: 1