From 6d3a54e01b04e21df85f2b7bb5f83c348c33bd9e Mon Sep 17 00:00:00 2001 From: Thanh Le Date: Thu, 29 Jun 2023 22:37:33 +0200 Subject: [PATCH] Add Zero, Monoid, Functor for ByColor --- src/main/scala/ByColor.scala | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/scala/ByColor.scala b/src/main/scala/ByColor.scala index d956accf8..947affa6a 100644 --- a/src/main/scala/ByColor.scala +++ b/src/main/scala/ByColor.scala @@ -1,8 +1,9 @@ package chess -import cats.{ Applicative, Eq } +import cats.{ Applicative, Eq, Functor, Monoid } import cats.syntax.all.* import scala.annotation.targetName +import alleycats.Zero case class ByColor[A](white: A, black: A): @@ -85,6 +86,17 @@ object ByColor: def eqv(x: ByColor[A], y: ByColor[A]) = x.white === y.white && x.black === y.black + given [A: Zero]: Zero[ByColor[A]] with + def zero = ByColor(Zero[A].zero) + + given [A: Monoid]: Monoid[ByColor[A]] with + def empty = ByColor(Monoid[A].empty) + def combine(x: ByColor[A], y: ByColor[A]) = + ByColor(Monoid[A].combine(x.white, y.white), Monoid[A].combine(x.black, y.black)) + + given Functor[ByColor] with + def map[A, B](fa: ByColor[A])(f: A => B): ByColor[B] = fa.map(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)