From 9906480d3bc1b3d13bc16dc3958aea57debd0460 Mon Sep 17 00:00:00 2001 From: Thanh Le Date: Sun, 9 Jul 2023 10:48:16 +0200 Subject: [PATCH] Implement Traverse for ByColor --- src/main/scala/ByColor.scala | 13 +++++++++++++ src/test/scala/ByColorLawsTests.scala | 11 +++++++++++ 2 files changed, 24 insertions(+) create mode 100644 src/test/scala/ByColorLawsTests.scala diff --git a/src/main/scala/ByColor.scala b/src/main/scala/ByColor.scala index 7f04271a2..e9626776d 100644 --- a/src/main/scala/ByColor.scala +++ b/src/main/scala/ByColor.scala @@ -4,6 +4,8 @@ import cats.{ Applicative, Eq, Functor, Monoid } import cats.syntax.all.* import scala.annotation.targetName import alleycats.Zero +import cats.Traverse +import cats.Eval case class ByColor[A](white: A, black: A): @@ -104,6 +106,17 @@ object ByColor: given Functor[ByColor] with def map[A, B](fa: ByColor[A])(f: A => B): ByColor[B] = fa.map(f) + given Traverse[ByColor] with + + override def foldLeft[A, B](fa: ByColor[A], b: B)(f: (B, A) => B): B = + fa.fold(b)(f) + + override def foldRight[A, B](fa: ByColor[A], lb: Eval[B])(f: (A, Eval[B]) => Eval[B]): Eval[B] = + Eval.defer(f(fa.white, Eval.defer(f(fa.black, lb)))) + + def traverse[G[_]: Applicative, A, B](fa: ByColor[A])(f: A => G[B]): G[ByColor[B]] = + fa.traverse(f) + extension [A](bc: ByColor[IterableOnce[A]]) def flatten: List[A] = bc.all.flatten extension [A](p: (A, A)) def asByColor: ByColor[A] = ByColor(p._1, p._2) diff --git a/src/test/scala/ByColorLawsTests.scala b/src/test/scala/ByColorLawsTests.scala new file mode 100644 index 000000000..15382287c --- /dev/null +++ b/src/test/scala/ByColorLawsTests.scala @@ -0,0 +1,11 @@ +package chess + +import cats.laws.discipline.FunctorTests +import munit.DisciplineSuite +import org.scalacheck.* +import Arbitraries.given +import cats.laws.discipline.TraverseTests + +class ByColorLawsTest extends DisciplineSuite: + checkAll("ByColor.FunctorLaws", FunctorTests[ByColor].functor[Int, Int, String]) + checkAll("ByColor.TraverseLaws", TraverseTests[ByColor].traverse[Int, Int, Int, Int, Option, Option])