-
Notifications
You must be signed in to change notification settings - Fork 104
Open
Labels
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 = falsePerhaps most troubling,
scala> Range(1, 10).contains(Range(15, 9))
res0: Boolean = trueThis 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 = trueThere 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.