Skip to content

Commit 3ffab12

Browse files
committed
implement methods for Validated and Ior
1 parent 22b66cf commit 3ffab12

File tree

2 files changed

+86
-0
lines changed

2 files changed

+86
-0
lines changed

core/src/main/scala/cats/data/Ior.scala

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -985,6 +985,55 @@ sealed abstract private[data] class IorInstances0 {
985985

986986
override def map[B, C](fa: A Ior B)(f: B => C): A Ior C =
987987
fa.map(f)
988+
989+
override def as[B, C](fa: A Ior B, c: C): A Ior C =
990+
fa match {
991+
case Ior.Left(_) => fa.asInstanceOf[A Ior C]
992+
case Ior.Right(_) => Ior.Right(c)
993+
case Ior.Both(a, _) => Ior.Both(a, c)
994+
}
995+
996+
override def tupleLeft[B, C](fa: A Ior B, c: C): A Ior (C, B) =
997+
fa match {
998+
case Ior.Left(_) => fa.asInstanceOf[A Ior (C, B)]
999+
case Ior.Right(b) => Ior.Right((c, b))
1000+
case Ior.Both(a, b) => Ior.Both(a, (c, b))
1001+
}
1002+
1003+
override def tupleRight[B, C](fa: A Ior B, c: C): A Ior (B, C) =
1004+
fa match {
1005+
case Ior.Left(_) => fa.asInstanceOf[A Ior (B, C)]
1006+
case Ior.Right(b) => Ior.Right((b, c))
1007+
case Ior.Both(a, b) => Ior.Both(a, (b, c))
1008+
}
1009+
1010+
override def fproduct[B, C](fa: A Ior B)(f: B => C): A Ior (B, C) =
1011+
fa match {
1012+
case Ior.Left(_) => fa.asInstanceOf[A Ior (B, C)]
1013+
case Ior.Right(b) => Ior.Right((b, f(b)))
1014+
case Ior.Both(a, b) => Ior.Both(a, (b, f(b)))
1015+
}
1016+
1017+
override def fproductLeft[B, C](fa: A Ior B)(f: B => C): A Ior (C, B) =
1018+
fa match {
1019+
case Ior.Left(_) => fa.asInstanceOf[A Ior (C, B)]
1020+
case Ior.Right(b) => Ior.Right((f(b), b))
1021+
case Ior.Both(a, b) => Ior.Both(a, (f(b), b))
1022+
}
1023+
1024+
override def unzip[B, C](fab: A Ior (B, C)): (A Ior B, A Ior C) =
1025+
fab match {
1026+
case Ior.Left(a) => (Ior.Left(a), Ior.Left(a))
1027+
case Ior.Right((b, c)) => (Ior.Right(b), Ior.Right(c))
1028+
case Ior.Both(a, (b, c)) => (Ior.Both(a, b), Ior.Both(a, c))
1029+
}
1030+
1031+
override def void[B](fa: A Ior B): A Ior Unit =
1032+
fa match {
1033+
case Ior.Left(_) => fa.asInstanceOf[A Ior Unit]
1034+
case Ior.Right(_) => Ior.Right(())
1035+
case Ior.Both(a, _) => Ior.Both(a, ())
1036+
}
9881037
}
9891038

9901039
implicit def catsDataEqForIor[A: Eq, B: Eq]: Eq[A Ior B] = _ === _

core/src/main/scala/cats/data/Validated.scala

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,6 +1008,36 @@ sealed abstract private[data] class ValidatedInstances2 {
10081008
override def map[A, B](fa: Validated[E, A])(f: (A) => B): Validated[E, B] =
10091009
fa.map(f)
10101010

1011+
override def as[A, B](fa: Validated[E, A], b: B): Validated[E, B] =
1012+
fa match {
1013+
case Valid(_) => Valid(b)
1014+
case i @ Invalid(_) => i.asInstanceOf[Validated[E, B]]
1015+
}
1016+
1017+
override def tupleLeft[A, B](fa: Validated[E, A], b: B): Validated[E, (B, A)] =
1018+
fa match {
1019+
case Valid(a) => Valid((b, a))
1020+
case i @ Invalid(_) => i.asInstanceOf[Validated[E, (B, A)]]
1021+
}
1022+
1023+
override def tupleRight[A, B](fa: Validated[E, A], b: B): Validated[E, (A, B)] =
1024+
fa match {
1025+
case Valid(a) => Valid((a, b))
1026+
case i @ Invalid(_) => i.asInstanceOf[Validated[E, (A, B)]]
1027+
}
1028+
1029+
override def fproduct[A, B](fa: Validated[E, A])(f: A => B): Validated[E, (A, B)] =
1030+
fa match {
1031+
case Valid(a) => Valid((a, f(a)))
1032+
case i @ Invalid(_) => i.asInstanceOf[Validated[E, (A, B)]]
1033+
}
1034+
1035+
override def fproductLeft[A, B](fa: Validated[E, A])(f: A => B): Validated[E, (B, A)] =
1036+
fa match {
1037+
case Valid(a) => Valid((f(a), a))
1038+
case i @ Invalid(_) => i.asInstanceOf[Validated[E, (B, A)]]
1039+
}
1040+
10111041
override def reduceLeftToOption[A, B](fa: Validated[E, A])(f: A => B)(g: (B, A) => B): Option[B] =
10121042
fa.map(f).toOption
10131043

@@ -1052,6 +1082,13 @@ sealed abstract private[data] class ValidatedInstances2 {
10521082
case _ => Nil
10531083
}
10541084

1085+
override def unzip[A, B](fab: Validated[E, (A, B)]): (Validated[E, A], Validated[E, B]) =
1086+
fab match {
1087+
case Valid((a, b)) => (Valid(a), Valid(b))
1088+
case i @ Invalid(_) =>
1089+
(i.asInstanceOf[Validated[E, A]], i.asInstanceOf[Validated[E, B]])
1090+
}
1091+
10551092
override def isEmpty[A](fa: Validated[E, A]): Boolean = fa.isInvalid
10561093

10571094
override def void[A](fa: Validated[E, A]): Validated[E, Unit] =

0 commit comments

Comments
 (0)