Skip to content

Commit 409ee7e

Browse files
authored
Merge pull request #4314 from TimWSpence/singleton-monoid-instances
Singleton monoid instances
2 parents aadce06 + 9e71472 commit 409ee7e

File tree

6 files changed

+60
-12
lines changed

6 files changed

+60
-12
lines changed

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

+7-5
Original file line numberDiff line numberDiff line change
@@ -1198,11 +1198,7 @@ object Chain extends ChainInstances with ChainCompanionCompat {
11981198
}
11991199

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

12071203
implicit val catsDataInstancesForChain
12081204
: Traverse[Chain] with Alternative[Chain] with Monad[Chain] with CoflatMap[Chain] with Align[Chain] =
@@ -1373,6 +1369,12 @@ sealed abstract private[data] class ChainInstances extends ChainInstances1 {
13731369

13741370
}
13751371

1372+
private[this] val theMonoid: Monoid[Chain[Any]] = new Monoid[Chain[Any]] {
1373+
def empty: Chain[Any] = Chain.nil
1374+
1375+
def combine(c: Chain[Any], c2: Chain[Any]): Chain[Any] = Chain.concat(c, c2)
1376+
}
1377+
13761378
}
13771379

13781380
sealed abstract private[data] class ChainInstances1 extends ChainInstances2 {

kernel/src/main/scala-2.13+/cats/kernel/instances/LazyListInstances.scala

+11-1
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,14 @@
2222
package cats.kernel
2323
package instances
2424

25+
import scala.annotation.nowarn
26+
2527
trait LazyListInstances extends LazyListInstances1 {
2628
implicit def catsKernelStdOrderForLazyList[A: Order]: Order[LazyList[A]] =
2729
new LazyListOrder[A]
30+
2831
implicit def catsKernelStdMonoidForLazyList[A]: Monoid[LazyList[A]] =
29-
new LazyListMonoid[A]
32+
LazyListMonoid[A]
3033
}
3134

3235
private[instances] trait LazyListInstances1 extends LazyListInstances2 {
@@ -64,6 +67,7 @@ class LazyListEq[A](implicit ev: Eq[A]) extends Eq[LazyList[A]] {
6467
else StaticMethods.iteratorEq(xs.iterator, ys.iterator)
6568
}
6669

70+
@deprecated("Use LazyListMonoid.apply, which does not allocate a new instance", "2.9.0")
6771
class LazyListMonoid[A] extends Monoid[LazyList[A]] {
6872
def empty: LazyList[A] = LazyList.empty
6973
def combine(x: LazyList[A], y: LazyList[A]): LazyList[A] = x ++ y
@@ -73,3 +77,9 @@ class LazyListMonoid[A] extends Monoid[LazyList[A]] {
7377
override def combineAll(xs: IterableOnce[LazyList[A]]): LazyList[A] =
7478
StaticMethods.combineAllIterable(LazyList.newBuilder[A], xs)
7579
}
80+
81+
object LazyListMonoid {
82+
@nowarn("msg=deprecated")
83+
private[this] val singleton: Monoid[LazyList[Any]] = new LazyListMonoid[Any]
84+
def apply[A]: Monoid[LazyList[A]] = singleton.asInstanceOf[Monoid[LazyList[A]]]
85+
}

kernel/src/main/scala/cats/kernel/instances/ListInstances.scala

+10-2
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,16 @@
2222
package cats.kernel
2323
package instances
2424

25-
import scala.annotation.tailrec
25+
import scala.annotation.{nowarn, tailrec}
2626
import compat.scalaVersionSpecific._
2727

2828
@suppressUnusedImportWarningForScalaVersionSpecific
2929
trait ListInstances extends ListInstances1 {
3030
implicit def catsKernelStdOrderForList[A: Order]: Order[List[A]] =
3131
new ListOrder[A]
32+
3233
implicit def catsKernelStdMonoidForList[A]: Monoid[List[A]] =
33-
new ListMonoid[A]
34+
ListMonoid[A]
3435
}
3536

3637
private[instances] trait ListInstances1 extends ListInstances2 {
@@ -104,6 +105,7 @@ class ListEq[A](implicit ev: Eq[A]) extends Eq[List[A]] {
104105
}
105106
}
106107

108+
@deprecated("Use ListMonoid.apply, which does not allocate a new instance", "2.9.0")
107109
class ListMonoid[A] extends Monoid[List[A]] { self =>
108110
def empty: List[A] = Nil
109111
def combine(x: List[A], y: List[A]): List[A] = x ::: y
@@ -127,3 +129,9 @@ class ListMonoid[A] extends Monoid[List[A]] { self =>
127129
override def reverse = self
128130
}
129131
}
132+
133+
object ListMonoid {
134+
@nowarn("msg=deprecated")
135+
private[this] val singleton: Monoid[List[Any]] = new ListMonoid[Any]
136+
def apply[A]: Monoid[List[A]] = singleton.asInstanceOf[Monoid[List[A]]]
137+
}

kernel/src/main/scala/cats/kernel/instances/QueueInstances.scala

+11-2
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,13 @@ package instances
2525
import scala.collection.immutable.Queue
2626
import compat.scalaVersionSpecific._
2727

28+
import scala.annotation.nowarn
29+
2830
@suppressUnusedImportWarningForScalaVersionSpecific
2931
trait QueueInstances extends QueueInstances1 {
3032
implicit def catsKernelStdOrderForQueue[A: Order]: Order[Queue[A]] =
3133
new QueueOrder[A]
32-
implicit def catsKernelStdMonoidForQueue[A]: Monoid[Queue[A]] =
33-
new QueueMonoid[A]
34+
implicit def catsKernelStdMonoidForQueue[A]: Monoid[Queue[A]] = QueueMonoid[A]
3435
}
3536

3637
private[instances] trait QueueInstances1 extends QueueInstances2 {
@@ -68,6 +69,7 @@ class QueueEq[A](implicit ev: Eq[A]) extends Eq[Queue[A]] {
6869
else StaticMethods.iteratorEq(xs.iterator, ys.iterator)
6970
}
7071

72+
@deprecated("Use QueueMonoid.apply, which does not allocate a new instance", "2.9.0")
7173
class QueueMonoid[A] extends Monoid[Queue[A]] {
7274
def empty: Queue[A] = Queue.empty[A]
7375
def combine(x: Queue[A], y: Queue[A]): Queue[A] = x ++ y
@@ -78,3 +80,10 @@ class QueueMonoid[A] extends Monoid[Queue[A]] {
7880
override def combineAll(xs: IterableOnce[Queue[A]]): Queue[A] =
7981
StaticMethods.combineAllIterable(Queue.newBuilder[A], xs)
8082
}
83+
84+
object QueueMonoid {
85+
@nowarn("msg=deprecated")
86+
private[this] val singleton: Monoid[Queue[Any]] = new QueueMonoid[Any]
87+
88+
def apply[A]: Monoid[Queue[A]] = singleton.asInstanceOf[Monoid[Queue[A]]]
89+
}

kernel/src/main/scala/cats/kernel/instances/SeqInstances.scala

+10-1
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,16 @@ package cats.kernel
2323
package instances
2424

2525
import compat.scalaVersionSpecific._
26+
27+
import scala.annotation.nowarn
2628
import scala.collection.immutable.Seq
2729

2830
@suppressUnusedImportWarningForScalaVersionSpecific
2931
trait SeqInstances extends SeqInstances1 {
3032
implicit def catsKernelStdOrderForSeq[A: Order]: Order[Seq[A]] =
3133
new SeqOrder[A]
3234
implicit def catsKernelStdMonoidForSeq[A]: Monoid[Seq[A]] =
33-
new SeqMonoid[A]
35+
SeqMonoid[A]
3436
}
3537

3638
private[instances] trait SeqInstances1 extends SeqInstances2 {
@@ -68,6 +70,7 @@ class SeqEq[A](implicit ev: Eq[A]) extends Eq[Seq[A]] {
6870
else StaticMethods.iteratorEq(xs.iterator, ys.iterator)
6971
}
7072

73+
@deprecated("Use SeqMonoid.apply, which does not allocate a new instance", "2.9.0")
7174
class SeqMonoid[A] extends Monoid[Seq[A]] {
7275
def empty: Seq[A] = Seq.empty
7376
def combine(x: Seq[A], y: Seq[A]): Seq[A] = x ++ y
@@ -78,3 +81,9 @@ class SeqMonoid[A] extends Monoid[Seq[A]] {
7881
override def combineAll(xs: IterableOnce[Seq[A]]): Seq[A] =
7982
StaticMethods.combineAllIterable(Seq.newBuilder[A], xs)
8083
}
84+
85+
object SeqMonoid {
86+
@nowarn("msg=deprecated")
87+
private[this] val singleton: Monoid[Seq[Any]] = new SeqMonoid[Any]
88+
def apply[A]: SeqMonoid[A] = singleton.asInstanceOf[SeqMonoid[A]]
89+
}

kernel/src/main/scala/cats/kernel/instances/VectorInstances.scala

+11-1
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@ package cats.kernel
2323
package instances
2424
import compat.scalaVersionSpecific._
2525

26+
import scala.annotation.nowarn
27+
2628
@suppressUnusedImportWarningForScalaVersionSpecific
2729
trait VectorInstances extends VectorInstances1 {
2830
implicit def catsKernelStdOrderForVector[A: Order]: Order[Vector[A]] =
2931
new VectorOrder[A]
3032
implicit def catsKernelStdMonoidForVector[A]: Monoid[Vector[A]] =
31-
new VectorMonoid[A]
33+
VectorMonoid[A]
3234
}
3335

3436
private[instances] trait VectorInstances1 extends VectorInstances2 {
@@ -66,6 +68,7 @@ class VectorEq[A](implicit ev: Eq[A]) extends Eq[Vector[A]] {
6668
else StaticMethods.iteratorEq(xs.iterator, ys.iterator)
6769
}
6870

71+
@deprecated("Use VectorMonoid.apply, which does not allocate a new instance", "2.9.0")
6972
class VectorMonoid[A] extends Monoid[Vector[A]] {
7073
def empty: Vector[A] = Vector.empty
7174
def combine(x: Vector[A], y: Vector[A]): Vector[A] = x ++ y
@@ -76,3 +79,10 @@ class VectorMonoid[A] extends Monoid[Vector[A]] {
7679
override def combineAll(xs: IterableOnce[Vector[A]]): Vector[A] =
7780
StaticMethods.combineAllIterable(Vector.newBuilder[A], xs)
7881
}
82+
83+
object VectorMonoid {
84+
@nowarn("msg=deprecated")
85+
private[this] val singleton: Monoid[Vector[Any]] = new VectorMonoid[Any]
86+
87+
def apply[A]: Monoid[Vector[A]] = singleton.asInstanceOf[Monoid[Vector[A]]]
88+
}

0 commit comments

Comments
 (0)