У меня есть следующий сценарий:
case class MyString(str: String)
val val1: ValidatedNel[String, MyString] = MyString("valid1").validNel
val val2: ValidatedNel[String, MyString] = MyString("valid2").validNel
val val3: ValidatedNel[String, MyString] = "invalid".invalidNel
val vals = Seq(val1, val2, val3)
//vals: Seq[cats.data.Validated[cats.data.NonEmptyList[String],MyString]] = List(Valid(MyString(valid)), Invalid(NonEmptyList(invalid)))
В конце я хотел бы иметь возможность сделать match
для результата и получить все ошибки или все допустимые значения в виде последовательности.
Мой вопрос: как преобразовать Seq[Validated[NonEmptyList[String],MyString]]
в Validated[NonEmptyList[String],Seq[MyString]]]
Итак, мой первый проход состоял в том, чтобы реализовать Semigroup
для Seq[MyString]
:
implicit val myStringsAdditionSemigroup: Semigroup[Seq[MyString]] = new Semigroup[Seq[MyString]] {
def combine(x: Seq[MyString], y: Seq[MyString]): Seq[MyString] = x ++ y
}
... который работает:
Seq(val1, val2).map(_.map(Seq(_))).reduce(_ |+| _)
//res0: cats.data.Validated[cats.data.NonEmptyList[String],Seq[MyString]] = Valid(List(MyString(valid1), MyString(valid2)))
но мне нужно подготовить свои данные, заключив все допустимые значения в Seq
... что кажется странным. Итак, может быть, есть лучший способ сделать это?