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.
I've noticed some inconsistencies with how several methods on
Rangeand that useRangeare defined when dealing with ranges which go different directions.Range.contains
containsforRangeis not symmetric aroundreverse.Perhaps most troubling,
This is made more confusing when looking at how
Rangeis used withDiet.There are a few ways to remedy this that come to mind, though I think the most simple would be to change
Rangeto be defined as always going in one direction. If aRangeis desired that is going in the inverse order, then an newtype (perhaps Inverse) could be used.