Open
Description
I've noticed some inconsistencies with how several methods on Range
and that use Range
are defined when dealing with ranges which go different directions.
Range.contains
contains
for Range
is not symmetric around reverse
.
scala> val a = Range(1, 10)
a: cats.collections.Range[Int] = Range(1,10)
scala> val b = a.reverse
b: cats.collections.Range[Int] = Range(10,1)
scala> a.contains(b)
res0: Boolean = true
scala> b.contains(a)
res1: Boolean = false
Perhaps most troubling,
scala> Range(1, 10).contains(Range(15, 9))
res0: Boolean = true
This is made more confusing when looking at how Range
is used with Diet
.
scala> val a = Range(1, 10)
a: cats.collections.Range[Int] = Range(1,10)
scala> val b = a.reverse
b: cats.collections.Range[Int] = Range(10,1)
scala> Diet.fromRange(b) === Diet.fromRange(a)
res0: Boolean = false
scala> Diet.empty.addRange(b) === Diet.fromRange(a)
res1: Boolean = true
There are a few ways to remedy this that come to mind, though I think the most simple would be to change Range
to be defined as always going in one direction. If a Range
is desired that is going in the inverse order, then an newtype (perhaps Inverse) could be used.