Skip to content

Commit 28f3487

Browse files
committed
Use helper constructor for (Commutative)Monoid instances
1 parent 7a32f48 commit 28f3487

File tree

18 files changed

+71
-181
lines changed

18 files changed

+71
-181
lines changed

algebra-core/src/main/scala/algebra/ring/Multiplicative.scala

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,8 @@ trait MultiplicativeCommutativeSemigroup[@sp(Int, Long, Float, Double) A] extend
6161
}
6262

6363
trait MultiplicativeMonoid[@sp(Int, Long, Float, Double) A] extends Any with MultiplicativeSemigroup[A] {
64-
override def multiplicative: Monoid[A] = new Monoid[A] {
65-
def empty = one
66-
def combine(x: A, y: A): A = times(x, y)
67-
}
64+
override def multiplicative: Monoid[A] =
65+
Monoid.instance(one, times)
6866

6967
def one: A
7068

@@ -94,10 +92,8 @@ trait MultiplicativeCommutativeMonoid[@sp(Int, Long, Float, Double) A]
9492
extends Any
9593
with MultiplicativeMonoid[A]
9694
with MultiplicativeCommutativeSemigroup[A] {
97-
override def multiplicative: CommutativeMonoid[A] = new CommutativeMonoid[A] {
98-
def empty = one
99-
def combine(x: A, y: A): A = times(x, y)
100-
}
95+
override def multiplicative: CommutativeMonoid[A] =
96+
CommutativeMonoid.instance(one, times)
10197
}
10298

10399
trait MultiplicativeGroup[@sp(Int, Long, Float, Double) A] extends Any with MultiplicativeMonoid[A] {

algebra-core/src/test/scala/algebra/Instances.scala

Lines changed: 0 additions & 47 deletions
This file was deleted.

core/src/main/scala/cats/CommutativeApplicative.scala

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,11 @@ import cats.kernel.CommutativeMonoid
3535
trait CommutativeApplicative[F[_]] extends Applicative[F] with CommutativeApply[F]
3636

3737
object CommutativeApplicative {
38-
def commutativeMonoidFor[F[_]: CommutativeApplicative, A: CommutativeMonoid]: CommutativeMonoid[F[A]] =
39-
new CommutativeMonoid[F[A]] {
40-
override def empty: F[A] =
41-
CommutativeApplicative[F]
42-
.pure(CommutativeMonoid[A].empty)
43-
44-
override def combine(x: F[A], y: F[A]): F[A] =
45-
CommutativeApplicative[F]
46-
.map2(x, y)(CommutativeMonoid[A].combine)
47-
}
38+
def commutativeMonoidFor[F[_]: CommutativeApplicative, A: CommutativeMonoid]: CommutativeMonoid[F[A]] = {
39+
val F = CommutativeApplicative[F]
40+
val A = CommutativeMonoid[A]
41+
CommutativeMonoid.instance(F.pure(A.empty), F.map2(_, _)(A.combine))
42+
}
4843

4944
/**
5045
* Summon an instance of [[CommutativeApplicative]] for `F`.

core/src/main/scala/cats/MonoidK.scala

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ trait MonoidK[F[_]] extends SemigroupK[F] { self =>
7373
ev.eqv(a, empty)
7474

7575
/**
76-
* Given a type A, create a concrete Monoid[F[A]].
76+
* Given a type A, create a concrete `Monoid[F[A]]`.
7777
*
7878
* Example:
7979
* {{{
@@ -83,10 +83,7 @@ trait MonoidK[F[_]] extends SemigroupK[F] { self =>
8383
* }}}
8484
*/
8585
override def algebra[A]: Monoid[F[A]] =
86-
new Monoid[F[A]] {
87-
def empty: F[A] = self.empty
88-
def combine(x: F[A], y: F[A]): F[A] = self.combineK(x, y)
89-
}
86+
Monoid.instance(empty, combineK)
9087

9188
/**
9289
* Given a kind G, create an "composed" MonoidK[F[G[_]]

core/src/main/scala/cats/UnorderedFoldable.scala

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -102,25 +102,25 @@ object UnorderedFoldable
102102
extends ScalaVersionSpecificTraverseInstances
103103
with cats.instances.NTupleUnorderedFoldableInstances {
104104

105-
private val orEvalMonoid: CommutativeMonoid[Eval[Boolean]] = new CommutativeMonoid[Eval[Boolean]] {
106-
val empty: Eval[Boolean] = Eval.False
107-
108-
def combine(lx: Eval[Boolean], ly: Eval[Boolean]): Eval[Boolean] =
109-
lx.flatMap {
110-
case true => Eval.True
111-
case false => ly
112-
}
113-
}
114-
115-
private val andEvalMonoid: CommutativeMonoid[Eval[Boolean]] = new CommutativeMonoid[Eval[Boolean]] {
116-
val empty: Eval[Boolean] = Eval.True
117-
118-
def combine(lx: Eval[Boolean], ly: Eval[Boolean]): Eval[Boolean] =
119-
lx.flatMap {
120-
case true => ly
121-
case false => Eval.False
122-
}
123-
}
105+
private val orEvalMonoid: CommutativeMonoid[Eval[Boolean]] =
106+
CommutativeMonoid.instance(
107+
Eval.False,
108+
(lx, ly) =>
109+
lx.flatMap {
110+
case true => Eval.True
111+
case false => ly
112+
}
113+
)
114+
115+
private val andEvalMonoid: CommutativeMonoid[Eval[Boolean]] =
116+
CommutativeMonoid.instance(
117+
Eval.True,
118+
(lx, ly) =>
119+
lx.flatMap {
120+
case true => ly
121+
case false => Eval.False
122+
}
123+
)
124124

125125
implicit def catsNonEmptyTraverseForId: NonEmptyTraverse[Id] = catsInstancesForId
126126
implicit def catsTraverseForOption: Traverse[Option] = cats.instances.option.catsStdInstancesForOption

core/src/main/scala/cats/arrow/Category.scala

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,7 @@ trait Category[F[_, _]] extends Compose[F] { self =>
3636
}
3737

3838
override def algebra[A]: Monoid[F[A, A]] =
39-
new Monoid[F[A, A]] {
40-
def empty: F[A, A] = id
41-
def combine(f1: F[A, A], f2: F[A, A]): F[A, A] = self.compose(f1, f2)
42-
}
39+
Monoid.instance(id, compose)
4340
}
4441

4542
object Category {

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1198,10 +1198,7 @@ object Chain extends ChainInstances with ChainCompanionCompat {
11981198

11991199
sealed abstract private[data] class ChainInstances extends ChainInstances1 {
12001200
implicit def catsDataMonoidForChain[A]: Monoid[Chain[A]] =
1201-
new Monoid[Chain[A]] {
1202-
def empty: Chain[A] = Chain.nil
1203-
def combine(c: Chain[A], c2: Chain[A]): Chain[A] = Chain.concat(c, c2)
1204-
}
1201+
Monoid.instance(Chain.nil, Chain.concat)
12051202

12061203
implicit val catsDataInstancesForChain
12071204
: Traverse[Chain] with Alternative[Chain] with Monad[Chain] with CoflatMap[Chain] with Align[Chain] =

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

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -145,13 +145,7 @@ sealed abstract private[data] class ConstInstances extends ConstInstances0 {
145145
}
146146

147147
implicit def catsDataMonoidForConst[A: Monoid, B]: Monoid[Const[A, B]] =
148-
new Monoid[Const[A, B]] {
149-
def empty: Const[A, B] =
150-
Const.empty
151-
152-
def combine(x: Const[A, B], y: Const[A, B]): Const[A, B] =
153-
x.combine(y)
154-
}
148+
Monoid.instance(Const.empty, _ combine _)
155149

156150
implicit val catsDataBifoldableForConst: Bifoldable[Const] =
157151
new Bifoldable[Const] {

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -915,10 +915,7 @@ sealed abstract private[data] class ValidatedInstances extends ValidatedInstance
915915
}
916916

917917
implicit def catsDataMonoidForValidated[A, B](implicit A: Semigroup[A], B: Monoid[B]): Monoid[Validated[A, B]] =
918-
new Monoid[Validated[A, B]] {
919-
def empty: Validated[A, B] = Valid(B.empty)
920-
def combine(x: Validated[A, B], y: Validated[A, B]): Validated[A, B] = x.combine(y)
921-
}
918+
Monoid.instance(Valid(B.empty), _ combine _)
922919

923920
implicit def catsDataOrderForValidated[A: Order, B: Order]: Order[Validated[A, B]] =
924921
new Order[Validated[A, B]] {

core/src/main/scala/cats/instances/invariant.scala

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,10 @@ trait InvariantMonoidalInstances {
3030
implicit def catsSemigroupalForMonoid: InvariantSemigroupal[Monoid] =
3131
new InvariantSemigroupal[Monoid] {
3232
def product[A, B](fa: Monoid[A], fb: Monoid[B]): Monoid[(A, B)] =
33-
new Monoid[(A, B)] {
34-
val empty = fa.empty -> fb.empty
35-
def combine(x: (A, B), y: (A, B)): (A, B) = fa.combine(x._1, y._1) -> fb.combine(x._2, y._2)
36-
}
33+
Monoid.instance((fa.empty, fb.empty), (x, y) => fa.combine(x._1, y._1) -> fb.combine(x._2, y._2))
3734

3835
def imap[A, B](fa: Monoid[A])(f: A => B)(g: B => A): Monoid[B] =
39-
new Monoid[B] {
40-
def empty: B = f(fa.empty)
41-
42-
def combine(x: B, y: B): B = f(fa.combine(g(x), g(y)))
43-
}
36+
Monoid.instance(f(fa.empty), (x, y) => f(fa.combine(g(x), g(y))))
4437
}
4538

4639
implicit val catsInvariantMonoidalSemigroup: InvariantMonoidal[Semigroup] = new InvariantMonoidal[Semigroup] {

0 commit comments

Comments
 (0)