Lista eitherów - to zmapować

0

Hej, @jarekr000000 i inni pro funkcyjni.

Jak mamy sobie listę obiektów T, które mapujemy metodą T -> Either<Error, T> i i chcemy zwrócić z metody Either<Error, R> gdzie R to wrapper na List<T> to jak to w sumie zrobić?
Chciałbym żeby finalny error to był ten pierwszy znaleziony.

Teoretycznie mogę kombinować isLeftem :D
Jest cuś lepszego?

1

foldem to zrobisz. Zaczynasz od Either.Right(emptyList) i potem flatMap.
Ogólnie operacja której szukasz nazywa się mapM (albo sequence) i ze względu na bieda system typów w Kotlinie trzeba ją sobie ręcznie pisać dla każdej kombinacji monad (to na szczęśćie raz na miesiąc).

0

@jarekr000000: Dla javy to tego mapM nawet nie chce znaleźć w google o.O

0

Mogę sie mylić, ale wydaje mi się że jednak 100 razy czytelniej będzie tam wrzucić jednego biednego ifa i tyle, szczególnie jeśli chcesz wyciągnąć tylko pierwszy error z listy.

0

Dobra, jako, że mam javę w projekcie to sobie po prostu napisałem utilsa i tam jest ten brzydki kod :/

public static <T> Either<AppError, Traversable<T>> findFirstError(final Traversable<Either<AppError, T>> traversable) {
        for (var it : traversable.iterator()) {
            if (it.isLeft()) {
                return Either.left(it.getLeft());
            }
        }

        return Either.right(traversable.flatMap(it -> it));
    }

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