Consider providing an implicit conversion to an instance of type Ordered
:
case class Location(x: Int, y: Int, s: String)
import scala.math.Ordered
implicit class LocationOrdered(val loc: Location)
extends Ordered[LocationOrdered] {
def compare(other: LocationOrdered): Int = {
this.loc.toString.compare(other.loc.toString)
}
}
val a = Location(123, 456, "foo")
val b = Location(456, 789, "bar")
println("a = " + a + " b = " + b)
if (a > b) println("a > b") else println("! a > b")
if (a >= b) println("a >= b") else println("! a >= b")
if (a <= b) println("a <= b") else println("! a <= b")
if (a < b) println("a < b") else println("! a < b")
In this way, you automatically get all the other comparison methods <=
, <
, >=
, >
for free.
As @AlexeyRomanov has pointed out, it is usually preferable to have an implicit Ordering
in scope, because for example List.sort
requires it as an implicit argument. The implementation would be even shorter than for Ordered
:
import scala.math.Ordering
import scala.math.Ordering._
implicit object LocationOrdering extends Ordering[Location] {
def compare(a: Location, b: Location) = a.toString.compare(b.toString)
}
This would allow us to compare the Location
values like this:
val locationOrdering = implicitly[Ordering[Location]]
import locationOrdering._
val a = Location(123, 456, "foo")
val b = Location(456, 789, "bar")
if (a > b) println("a > b") else println("! a > b")