Skip to content

Commit dd10d51

Browse files
committed
Merge pull request #998 from aaronlevin/validated-semigroupk-instance
Add SemigroupK instance for Validated + tests
2 parents bcb0553 + fcfb5ca commit dd10d51

2 files changed

Lines changed: 18 additions & 1 deletion

File tree

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,9 +210,19 @@ object Validated extends ValidatedInstances with ValidatedFunctions{
210210
final case class Invalid[+E](e: E) extends Validated[E, Nothing]
211211
}
212212

213-
214213
private[data] sealed abstract class ValidatedInstances extends ValidatedInstances1 {
215214

215+
implicit def validatedSemigroupK[A](implicit A: Semigroup[A]): SemigroupK[Validated[A,?]] =
216+
new SemigroupK[Validated[A,?]] {
217+
def combineK[B](x: Validated[A,B], y: Validated[A,B]): Validated[A,B] = x match {
218+
case v @ Valid(_) => v
219+
case Invalid(ix) => y match {
220+
case Invalid(iy) => Invalid(A.combine(ix,iy))
221+
case v @ Valid(_) => v
222+
}
223+
}
224+
}
225+
216226
implicit def validatedMonoid[A, B](implicit A: Semigroup[A], B: Monoid[B]): Monoid[Validated[A, B]] = new Monoid[Validated[A, B]] {
217227
def empty: Validated[A, B] = Valid(B.empty)
218228
def combine(x: Validated[A, B], y: Validated[A, B]): Validated[A, B] = x combine y

tests/src/test/scala/cats/tests/ValidatedTests.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import cats.data.{NonEmptyList, Validated, ValidatedNel, Xor, XorT}
55
import cats.data.Validated.{Valid, Invalid}
66
import cats.laws.discipline.{BifunctorTests, TraverseTests, ApplicativeErrorTests, SerializableTests, CartesianTests}
77
import org.scalacheck.Arbitrary._
8+
import cats.laws.discipline.{SemigroupKTests}
89
import cats.laws.discipline.arbitrary._
910
import algebra.laws.{OrderLaws, GroupLaws}
1011

@@ -32,6 +33,12 @@ class ValidatedTests extends CatsSuite {
3233

3334
checkAll("Validated[String, NonEmptyList[Int]]", GroupLaws[Validated[String, NonEmptyList[Int]]].semigroup)
3435

36+
{
37+
implicit val L = ListWrapper.semigroup[String]
38+
checkAll("Validated[ListWrapper[String], ?]", SemigroupKTests[Validated[ListWrapper[String], ?]].semigroupK[Int])
39+
checkAll("SemigroupK[Validated[ListWrapper[String], ?]]", SerializableTests.serializable(SemigroupK[Validated[ListWrapper[String], ?]]))
40+
}
41+
3542
{
3643
implicit val S = ListWrapper.partialOrder[String]
3744
implicit val I = ListWrapper.partialOrder[Int]

0 commit comments

Comments
 (0)