From 6d29f7b79405afc6510a65349c362859bc0fea1f Mon Sep 17 00:00:00 2001 From: Morgen Peschke Date: Mon, 1 Jul 2019 07:37:45 -0700 Subject: [PATCH] Add missing factories similar to existing factories (#2889) Fixes #2887 --- kernel/src/main/scala/cats/kernel/Band.scala | 7 +++++++ .../src/main/scala/cats/kernel/BoundedSemilattice.scala | 9 +++++++++ .../src/main/scala/cats/kernel/CommutativeMonoid.scala | 9 +++++++++ .../main/scala/cats/kernel/CommutativeSemigroup.scala | 7 +++++++ kernel/src/main/scala/cats/kernel/Monoid.scala | 9 +++++++++ kernel/src/main/scala/cats/kernel/Semilattice.scala | 7 +++++++ 6 files changed, 48 insertions(+) diff --git a/kernel/src/main/scala/cats/kernel/Band.scala b/kernel/src/main/scala/cats/kernel/Band.scala index 9c46c63338..48249e9cd1 100644 --- a/kernel/src/main/scala/cats/kernel/Band.scala +++ b/kernel/src/main/scala/cats/kernel/Band.scala @@ -14,4 +14,11 @@ object Band extends SemigroupFunctions[Band] { * Access an implicit `Band[A]`. */ @inline final def apply[@sp(Int, Long, Float, Double) A](implicit ev: Band[A]): Band[A] = ev + + /** + * Create a `Band` instance from the given function. + */ + @inline def instance[A](cmb: (A, A) => A): Band[A] = new Band[A] { + override def combine(x: A, y: A): A = cmb(x, y) + } } diff --git a/kernel/src/main/scala/cats/kernel/BoundedSemilattice.scala b/kernel/src/main/scala/cats/kernel/BoundedSemilattice.scala index 77ae533e9e..400ec9f765 100644 --- a/kernel/src/main/scala/cats/kernel/BoundedSemilattice.scala +++ b/kernel/src/main/scala/cats/kernel/BoundedSemilattice.scala @@ -11,4 +11,13 @@ object BoundedSemilattice extends SemilatticeFunctions[BoundedSemilattice] { */ @inline final def apply[@sp(Int, Long, Float, Double) A](implicit ev: BoundedSemilattice[A]): BoundedSemilattice[A] = ev + + /** + * Create a `BoundedSemilattice` instance from the given function and empty value. + */ + @inline def instance[A](emptyValue: A, cmb: (A, A) => A): BoundedSemilattice[A] = new BoundedSemilattice[A] { + override val empty: A = emptyValue + + override def combine(x: A, y: A): A = cmb(x, y) + } } diff --git a/kernel/src/main/scala/cats/kernel/CommutativeMonoid.scala b/kernel/src/main/scala/cats/kernel/CommutativeMonoid.scala index a539f9efe1..eaf71b0ed4 100644 --- a/kernel/src/main/scala/cats/kernel/CommutativeMonoid.scala +++ b/kernel/src/main/scala/cats/kernel/CommutativeMonoid.scala @@ -15,4 +15,13 @@ object CommutativeMonoid extends MonoidFunctions[CommutativeMonoid] { * Access an implicit `CommutativeMonoid[A]`. */ @inline final def apply[A](implicit ev: CommutativeMonoid[A]): CommutativeMonoid[A] = ev + + /** + * Create a `CommutativeMonoid` instance from the given function and empty value. + */ + @inline def instance[A](emptyValue: A, cmb: (A, A) => A): CommutativeMonoid[A] = new CommutativeMonoid[A] { + override val empty: A = emptyValue + + override def combine(x: A, y: A): A = cmb(x, y) + } } diff --git a/kernel/src/main/scala/cats/kernel/CommutativeSemigroup.scala b/kernel/src/main/scala/cats/kernel/CommutativeSemigroup.scala index a4f2c13a8d..3151c65f40 100644 --- a/kernel/src/main/scala/cats/kernel/CommutativeSemigroup.scala +++ b/kernel/src/main/scala/cats/kernel/CommutativeSemigroup.scala @@ -15,4 +15,11 @@ object CommutativeSemigroup extends SemigroupFunctions[CommutativeSemigroup] { * Access an implicit `CommutativeSemigroup[A]`. */ @inline final def apply[A](implicit ev: CommutativeSemigroup[A]): CommutativeSemigroup[A] = ev + + /** + * Create a `CommutativeSemigroup` instance from the given function. + */ + @inline def instance[A](cmb: (A, A) => A): CommutativeSemigroup[A] = new CommutativeSemigroup[A] { + override def combine(x: A, y: A): A = cmb(x, y) + } } diff --git a/kernel/src/main/scala/cats/kernel/Monoid.scala b/kernel/src/main/scala/cats/kernel/Monoid.scala index b89aa37400..07c1514883 100644 --- a/kernel/src/main/scala/cats/kernel/Monoid.scala +++ b/kernel/src/main/scala/cats/kernel/Monoid.scala @@ -103,4 +103,13 @@ object Monoid extends MonoidFunctions[Monoid] { * Access an implicit `Monoid[A]`. */ @inline final def apply[A](implicit ev: Monoid[A]): Monoid[A] = ev + + /** + * Create a `Monoid` instance from the given function and empty value. + */ + @inline def instance[A](emptyValue: A, cmb: (A, A) => A): Monoid[A] = new Monoid[A] { + override val empty: A = emptyValue + + override def combine(x: A, y: A): A = cmb(x, y) + } } diff --git a/kernel/src/main/scala/cats/kernel/Semilattice.scala b/kernel/src/main/scala/cats/kernel/Semilattice.scala index ca1646aa7d..55facb8ade 100644 --- a/kernel/src/main/scala/cats/kernel/Semilattice.scala +++ b/kernel/src/main/scala/cats/kernel/Semilattice.scala @@ -66,4 +66,11 @@ object Semilattice extends SemilatticeFunctions[Semilattice] { * Access an implicit `Semilattice[A]`. */ @inline final def apply[@sp(Int, Long, Float, Double) A](implicit ev: Semilattice[A]): Semilattice[A] = ev + + /** + * Create a `Semilattice` instance from the given function. + */ + @inline def instance[A](cmb: (A, A) => A): Semilattice[A] = new Semilattice[A] { + override def combine(x: A, y: A): A = cmb(x, y) + } }