Как типизировать безопасно уменьшить коллекцию «либо до правого» - PullRequest
5 голосов
/ 13 марта 2019

Возможно глупый вопрос, но я просто не понимаю.

У меня есть Set<Either<Failure, Success>> и я хочу вывести Set<Success> с помощью Arrow-kt.

1 Ответ

6 голосов
/ 13 марта 2019

Вы можете отобразить набор следующим образом:

val successes = originalSet.mapNotNull { it.orNull() }.toSet()

или, если вы хотите левые:

val failures = originalSet.mapNotNull { it.swap().orNull() }.toSet()

Финальный toSet() является необязательным, если вы хотите сохранить его как Set, так как mapNotNull является функцией расширения для Iterable и всегда возвращает List

PS: глупых вопросов нет:)

Обновление: Это можно сделать, избегая nullables:

val successes = originalSet
  .map { it.toOption() }
  .filter { it is Some }
  .toSet()

Мы могли бы потенциально добавить функции Iterable<Option<A>>.filterSome и Iterable<Either<A, B>.mapAsOptions.

Обновление 2:

Последний пример возвращает Set<Option<Success>>. Если вы хотите развернуть результаты без использования null, то вы можете попробовать сложить Set:

val successes = originalSet
  .fold(emptySet<Success>()) { acc, item -> 
    item.fold({ acc }, { acc + it })
  }

Этот последний параметр (непреднамеренный каламбур) не требует использования Option.

...