All Downloads are FREE. Search and download functionalities are using the official Maven repository.

alleycats.Zero.scala Maven / Gradle / Ivy

The newest version!
package alleycats

import algebra.ring.{AdditiveMonoid, AdditiveSemigroup}
import cats.{Eq, Monoid}
import cats.syntax.eq._
import simulacrum.typeclass
import scala.collection.generic.CanBuildFrom

@typeclass trait Zero[A] {
  def zero: A

  def isZero(a: A)(implicit ev: Eq[A]): Boolean =
    zero === a

  def nonZero(a: A)(implicit ev: Eq[A]): Boolean =
    zero =!= a
}

object Zero {
  def apply[A](a: => A): Zero[A] =
    new Zero[A] { lazy val zero: A = a }

  implicit def additiveMonoidIsZero[A](implicit ev: AdditiveMonoid[A]): Zero[A] =
    Zero(ev.zero)

  implicit def zeroWithSemigroupIsMonoid[A](implicit z: Zero[A], s: AdditiveSemigroup[A]): AdditiveMonoid[A] =
    new AdditiveMonoid[A] {
      def zero: A = z.zero
      def plus(x: A, y: A): A = s.plus(x, y)
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy