Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

More consistency #3000

Closed
wants to merge 12 commits into from
19 changes: 13 additions & 6 deletions core/src/main/scala-2.12-/cats/instances/all.scala
Original file line number Diff line number Diff line change
Expand Up @@ -33,20 +33,27 @@ trait AllInstances
with UUIDInstances
with VectorInstances

trait AllInstancesBinCompat0 extends FunctionInstancesBinCompat0 with Tuple2InstancesBinCompat0
private[cats] trait AllInstancesBinCompat0 extends FunctionInstancesBinCompat0 with Tuple2InstancesBinCompat0

trait AllInstancesBinCompat1
private[cats] trait AllInstancesBinCompat1
extends OptionInstancesBinCompat0
with ListInstancesBinCompat0
with VectorInstancesBinCompat0
with StreamInstancesBinCompat0
with MapInstancesBinCompat0
with SortedMapInstancesBinCompat0

trait AllInstancesBinCompat2 extends DurationInstances with FiniteDurationInstances
private[cats] trait AllInstancesBinCompat2 extends DurationInstances with FiniteDurationInstances

trait AllInstancesBinCompat3 extends AllCoreDurationInstances
private[cats] trait AllInstancesBinCompat3 extends AllCoreDurationInstances

trait AllInstancesBinCompat4 extends SortedMapInstancesBinCompat1 with MapInstancesBinCompat1
private[cats] trait AllInstancesBinCompat4 extends SortedMapInstancesBinCompat1 with MapInstancesBinCompat1

trait AllInstancesBinCompat5 extends SortedSetInstancesBinCompat0
private[cats] trait AllInstancesBinCompat5 extends SortedSetInstancesBinCompat0

private[cats] trait AllInstancesBinCompat6
extends SortedSetInstancesBinCompat1
with SortedMapInstancesBinCompat2
with FunctionInstancesBinCompat1
with cats.kernel.instances.EitherInstancesBinCompat0
with cats.kernel.instances.FunctionInstancesBinCompat0
17 changes: 13 additions & 4 deletions core/src/main/scala-2.12-/cats/instances/package.scala
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ package object instances {
with AllInstancesBinCompat3
with AllInstancesBinCompat4
with AllInstancesBinCompat5
with AllInstancesBinCompat6
object bigInt extends BigIntInstances
object bigDecimal extends BigDecimalInstances
object bitSet extends BitSetInstances
Expand All @@ -17,12 +18,16 @@ package object instances {
object char extends CharInstances
object double extends DoubleInstances
object duration extends CoreDurationInstances with DurationInstances
object either extends EitherInstances
object either extends EitherInstances with cats.kernel.instances.EitherInstancesBinCompat0
object eq extends EqInstances
object equiv extends EquivInstances
object float extends FloatInstances
object finiteDuration extends CoreFiniteDurationInstances with FiniteDurationInstances
object function extends FunctionInstances with FunctionInstancesBinCompat0
object function
extends FunctionInstances
with FunctionInstancesBinCompat0
with FunctionInstancesBinCompat1
with cats.kernel.instances.FunctionInstancesBinCompat0
object future extends FutureInstances
object int extends IntInstances
object invariant extends InvariantMonoidalInstances
Expand All @@ -38,8 +43,12 @@ package object instances {
object queue extends QueueInstances
object set extends SetInstances
object short extends ShortInstances
object sortedMap extends SortedMapInstances with SortedMapInstancesBinCompat0 with SortedMapInstancesBinCompat1
object sortedSet extends SortedSetInstances with SortedSetInstancesBinCompat0
object sortedMap
extends SortedMapInstances
with SortedMapInstancesBinCompat0
with SortedMapInstancesBinCompat1
with SortedMapInstancesBinCompat2
object sortedSet extends SortedSetInstances with SortedSetInstancesBinCompat0 with SortedSetInstancesBinCompat1
object stream extends StreamInstances with StreamInstancesBinCompat0
object string extends StringInstances
object try_ extends TryInstances
Expand Down
2 changes: 1 addition & 1 deletion core/src/main/scala-2.12-/cats/instances/stream.scala
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ trait StreamInstances extends cats.kernel.instances.StreamInstances {

}

trait StreamInstancesBinCompat0 {
private[instances] trait StreamInstancesBinCompat0 {
implicit val catsStdTraverseFilterForStream: TraverseFilter[Stream] = new TraverseFilter[Stream] {
val traverse: Traverse[Stream] = cats.instances.stream.catsStdInstancesForStream

Expand Down
19 changes: 13 additions & 6 deletions core/src/main/scala-2.13+/cats/instances/all.scala
Original file line number Diff line number Diff line change
Expand Up @@ -34,20 +34,27 @@ trait AllInstances
with UUIDInstances
with VectorInstances

trait AllInstancesBinCompat0 extends FunctionInstancesBinCompat0 with Tuple2InstancesBinCompat0
private[cats] trait AllInstancesBinCompat0 extends FunctionInstancesBinCompat0 with Tuple2InstancesBinCompat0

trait AllInstancesBinCompat1
private[cats] trait AllInstancesBinCompat1
extends OptionInstancesBinCompat0
with ListInstancesBinCompat0
with VectorInstancesBinCompat0
with StreamInstancesBinCompat0
with MapInstancesBinCompat0
with SortedMapInstancesBinCompat0

trait AllInstancesBinCompat2 extends DurationInstances with FiniteDurationInstances
private[cats] trait AllInstancesBinCompat2 extends DurationInstances with FiniteDurationInstances

trait AllInstancesBinCompat3 extends AllCoreDurationInstances
private[cats] trait AllInstancesBinCompat3 extends AllCoreDurationInstances

trait AllInstancesBinCompat4 extends SortedMapInstancesBinCompat1 with MapInstancesBinCompat1
private[cats] trait AllInstancesBinCompat4 extends SortedMapInstancesBinCompat1 with MapInstancesBinCompat1

trait AllInstancesBinCompat5 extends SortedSetInstancesBinCompat0
private[cats] trait AllInstancesBinCompat5 extends SortedSetInstancesBinCompat0

private[cats] trait AllInstancesBinCompat6
extends SortedSetInstancesBinCompat1
with SortedMapInstancesBinCompat2
with FunctionInstancesBinCompat1
with cats.kernel.instances.EitherInstancesBinCompat0
with cats.kernel.instances.FunctionInstancesBinCompat0
17 changes: 13 additions & 4 deletions core/src/main/scala-2.13+/cats/instances/package.scala
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ package object instances {
with AllInstancesBinCompat3
with AllInstancesBinCompat4
with AllInstancesBinCompat5
with AllInstancesBinCompat6
object bigInt extends BigIntInstances
object bigDecimal extends BigDecimalInstances
object bitSet extends BitSetInstances
Expand All @@ -17,12 +18,16 @@ package object instances {
object char extends CharInstances
object double extends DoubleInstances
object duration extends CoreDurationInstances with DurationInstances
object either extends EitherInstances
object either extends EitherInstances with cats.kernel.instances.EitherInstancesBinCompat0
object eq extends EqInstances
object equiv extends EquivInstances
object float extends FloatInstances
object finiteDuration extends CoreFiniteDurationInstances with FiniteDurationInstances
object function extends FunctionInstances with FunctionInstancesBinCompat0
object function
extends FunctionInstances
with FunctionInstancesBinCompat0
with FunctionInstancesBinCompat1
with cats.kernel.instances.FunctionInstancesBinCompat0
object future extends FutureInstances
object int extends IntInstances
object invariant extends InvariantMonoidalInstances
Expand All @@ -38,8 +43,12 @@ package object instances {
object queue extends QueueInstances
object set extends SetInstances
object short extends ShortInstances
object sortedMap extends SortedMapInstances with SortedMapInstancesBinCompat0 with SortedMapInstancesBinCompat1
object sortedSet extends SortedSetInstances with SortedSetInstancesBinCompat0
object sortedMap
extends SortedMapInstances
with SortedMapInstancesBinCompat0
with SortedMapInstancesBinCompat1
with SortedMapInstancesBinCompat2
object sortedSet extends SortedSetInstances with SortedSetInstancesBinCompat0 with SortedSetInstancesBinCompat1

@deprecated("2.0.0-RC2", "Use cats.instances.lazyList")
object stream extends StreamInstances with StreamInstancesBinCompat0
Expand Down
2 changes: 1 addition & 1 deletion core/src/main/scala-2.13+/cats/instances/stream.scala
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ trait StreamInstances extends cats.kernel.instances.StreamInstances {

}

trait StreamInstancesBinCompat0 {
private[instances] trait StreamInstancesBinCompat0 {
@deprecated("2.0.0-RC2", "Use cats.instances.lazyList")
implicit val catsStdTraverseFilterForStream: TraverseFilter[Stream] = new TraverseFilter[Stream] {
val traverse: Traverse[Stream] = cats.instances.stream.catsStdInstancesForStream
Expand Down
2 changes: 1 addition & 1 deletion core/src/main/scala/cats/data/Binested.scala
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ trait BinestedInstances extends BinestedInstances0 {
}
}

trait BinestedInstances0 {
private[data] trait BinestedInstances0 {
implicit def catsDataBifoldableForBinested[F[_, _], G[_], H[_]](
implicit F0: Bifoldable[F],
G0: Foldable[G],
Expand Down
5 changes: 4 additions & 1 deletion core/src/main/scala/cats/data/NonEmptyList.scala
Original file line number Diff line number Diff line change
Expand Up @@ -500,7 +500,10 @@ object NonEmptyList extends NonEmptyListInstances {
ZipNonEmptyList(fa.value.zipWith(fb.value) { case (a, b) => (a, b) })
}

implicit def zipNelEq[A: Eq]: Eq[ZipNonEmptyList[A]] = Eq.by(_.value)
@deprecated("2.0.0-RC2", "Use catsDataEqForZipNonEmptyList")
private[data] def zipNelEq[A: Eq]: Eq[ZipNonEmptyList[A]] = catsDataEqForZipNonEmptyList[A]

implicit def catsDataEqForZipNonEmptyList[A: Eq]: Eq[ZipNonEmptyList[A]] = Eq.by(_.value)
}
}

Expand Down
5 changes: 4 additions & 1 deletion core/src/main/scala/cats/data/NonEmptyVector.scala
Original file line number Diff line number Diff line change
Expand Up @@ -428,6 +428,9 @@ object NonEmptyVector extends NonEmptyVectorInstances with Serializable {
ZipNonEmptyVector(fa.value.zipWith(fb.value) { case (a, b) => (a, b) })
}

implicit def zipNevEq[A: Eq]: Eq[ZipNonEmptyVector[A]] = Eq.by(_.value)
@deprecated("2.0.0-RC2", "Use catsDataEqForZipNonEmptyVector")
private[data] def zipNevEq[A: Eq]: Eq[ZipNonEmptyVector[A]] = catsDataEqForZipNonEmptyVector[A]

implicit def catsDataEqForZipNonEmptyVector[A: Eq]: Eq[ZipNonEmptyVector[A]] = Eq.by(_.value)
}
}
6 changes: 5 additions & 1 deletion core/src/main/scala/cats/data/Op.scala
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,12 @@ sealed abstract private[data] class OpInstances extends OpInstances0 {
implicit def catsDataCategoryForOp[Arr[_, _]](implicit ArrC: Category[Arr]): Category[Op[Arr, *, *]] =
new OpCategory[Arr] { def Arr: Category[Arr] = ArrC }

implicit def catsKernelEqForOp[Arr[_, _], A, B](implicit ArrEq: Eq[Arr[B, A]]): Eq[Op[Arr, A, B]] =
implicit def catsDataEqForOp[Arr[_, _], A, B](implicit ArrEq: Eq[Arr[B, A]]): Eq[Op[Arr, A, B]] =
new OpEq[Arr, A, B] { def Arr: Eq[Arr[B, A]] = ArrEq }

@deprecated("2.0.0-RC2", "Use catsDataEqForOp")
private[data] def catsKernelEqForOp[Arr[_, _], A, B](implicit ArrEq: Eq[Arr[B, A]]): Eq[Op[Arr, A, B]] =
catsDataEqForOp[Arr, A, B]
}

sealed abstract private[data] class OpInstances0 {
Expand Down
35 changes: 20 additions & 15 deletions core/src/main/scala/cats/instances/function.scala
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import annotation.tailrec

trait FunctionInstances extends cats.kernel.instances.FunctionInstances with Function0Instances with Function1Instances

trait FunctionInstancesBinCompat0 {
private[instances] trait FunctionInstancesBinCompat0 {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure about introducing a BinCompat trait to fix a typo. The plan is to branch out scala 2.11 code right after 2.0 release. Which means we shall be able to leave the typo in the 2.11 code and fix it in master branch without an extra bincompat trait.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can pull these parts out, but in my view it'd be better to get all the instance name-related source compat breakage out of the way at once, instead of spreading it across 2.0 and 2.1.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The source breakage is highly unlikely to affect anyone (and if anyone it would be a super quick fix on compilation time), but the extra trait will be left there for a very long time.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So you're saying that breaking source compat in 2.x releases is acceptable?


/**
* Witness for: E => A <-> E => A
Expand All @@ -22,39 +22,44 @@ trait FunctionInstancesBinCompat0 {
override def index[A](f: E => A): E => A = f
}

implicit val catsSddDeferForFunction0: Defer[Function0] =
new Defer[Function0] {
case class Deferred[A](fa: () => Function0[A]) extends Function0[A] {
def apply() = {
@deprecated("2.0.0-RC2", "Use cats.instances.function.catsStdDeferForFunction0")
private[instances] def catsSddDeferForFunction0: Defer[Function0] = cats.instances.function.catsStdDeferForFunction0

implicit def catsStdDeferForFunction1[A]: Defer[A => *] =
new Defer[A => *] {
case class Deferred[B](fa: () => A => B) extends (A => B) {
def apply(a: A) = {
@annotation.tailrec
def loop(f: () => Function0[A]): A =
def loop(f: () => A => B): B =
f() match {
case Deferred(f) => loop(f)
case next => next()
case next => next(a)
}
loop(fa)
}
}
def defer[A](fa: => Function0[A]): Function0[A] = {
def defer[B](fa: => A => B): A => B = {
lazy val cachedFa = fa
Deferred(() => cachedFa)
}
}
}

implicit def catsStdDeferForFunction1[A]: Defer[A => *] =
new Defer[A => *] {
case class Deferred[B](fa: () => A => B) extends (A => B) {
def apply(a: A) = {
private[instances] trait FunctionInstancesBinCompat1 {
implicit val catsStdDeferForFunction0: Defer[Function0] =
new Defer[Function0] {
case class Deferred[A](fa: () => Function0[A]) extends Function0[A] {
def apply() = {
@annotation.tailrec
def loop(f: () => A => B): B =
def loop(f: () => Function0[A]): A =
f() match {
case Deferred(f) => loop(f)
case next => next(a)
case next => next()
}
loop(fa)
}
}
def defer[B](fa: => A => B): A => B = {
def defer[A](fa: => Function0[A]): Function0[A] = {
lazy val cachedFa = fa
Deferred(() => cachedFa)
}
Expand Down
2 changes: 1 addition & 1 deletion core/src/main/scala/cats/instances/list.scala
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ trait ListInstances extends cats.kernel.instances.ListInstances {
}
}

trait ListInstancesBinCompat0 {
private[instances] trait ListInstancesBinCompat0 {
implicit val catsStdTraverseFilterForList: TraverseFilter[List] = new TraverseFilter[List] {
val traverse: Traverse[List] = cats.instances.list.catsStdInstancesForList

Expand Down
4 changes: 2 additions & 2 deletions core/src/main/scala/cats/instances/map.scala
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ trait MapInstances extends cats.kernel.instances.MapInstances {

}

trait MapInstancesBinCompat0 {
private[instances] trait MapInstancesBinCompat0 {

implicit val catsStdComposeForMap: Compose[Map] = new Compose[Map] {

Expand Down Expand Up @@ -139,7 +139,7 @@ trait MapInstancesBinCompat0 {

}

trait MapInstancesBinCompat1 {
private[instances] trait MapInstancesBinCompat1 {
implicit def catsStdMonoidKForMap[K]: MonoidK[Map[K, *]] = new MonoidK[Map[K, *]] {
override def empty[A]: Map[K, A] = Map.empty

Expand Down
2 changes: 1 addition & 1 deletion core/src/main/scala/cats/instances/option.scala
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ trait OptionInstances extends cats.kernel.instances.OptionInstances {
}
}

trait OptionInstancesBinCompat0 {
private[instances] trait OptionInstancesBinCompat0 {
implicit val catsStdTraverseFilterForOption: TraverseFilter[Option] = new TraverseFilter[Option] {
val traverse: Traverse[Option] = cats.instances.option.catsStdInstancesForOption

Expand Down
Loading