diff --git a/library/src/scala/NamedTuple.scala b/library/src/scala/NamedTuple.scala index 1e4d3c084a3c..c63ad29c56e9 100644 --- a/library/src/scala/NamedTuple.scala +++ b/library/src/scala/NamedTuple.scala @@ -128,6 +128,10 @@ object NamedTuple: /** The empty named tuple */ val Empty: Empty = EmptyTuple + /** The ordering instance for named tuples */ + given namedTupleOrdering: [N <: Tuple, V <: Tuple] => (ord: Ordering[V]) => Ordering[NamedTuple[N, V]]: + def compare(x: NamedTuple[N, V], y: NamedTuple[N, V]): Int = + ord.compare(x.toTuple, y.toTuple) end NamedTuple /** Separate from NamedTuple object so that we can match on the opaque type NamedTuple. */ diff --git a/project/MiMaFilters.scala b/project/MiMaFilters.scala index c57136b262dd..002f53b24761 100644 --- a/project/MiMaFilters.scala +++ b/project/MiMaFilters.scala @@ -19,6 +19,9 @@ object MiMaFilters { ProblemFilters.exclude[DirectMissingMethodProblem]("scala.Conversion.underlying"), ProblemFilters.exclude[MissingClassProblem]("scala.Conversion$"), + + ProblemFilters.exclude[DirectMissingMethodProblem]("scala.NamedTuple.namedTupleOrdering"), + ProblemFilters.exclude[MissingClassProblem]("scala.NamedTuple$namedTupleOrdering"), ), // Additions since last LTS diff --git a/tests/run/named-tuple-ordering.check b/tests/run/named-tuple-ordering.check new file mode 100644 index 000000000000..ea1c136aeec1 --- /dev/null +++ b/tests/run/named-tuple-ordering.check @@ -0,0 +1 @@ +List((Alice,29), (Alice,30), (Bob,25), (Charlie,35)) diff --git a/tests/run/named-tuple-ordering.scala b/tests/run/named-tuple-ordering.scala new file mode 100644 index 000000000000..5d1c4583c915 --- /dev/null +++ b/tests/run/named-tuple-ordering.scala @@ -0,0 +1,13 @@ +type Person = (name: String, age: Int) + +val so = summon[Ordering[Person]] + +val people: List[Person] = List( + (name = "Charlie", age = 35), + (name = "Alice", age = 30), + (name = "Alice", age = 29), + (name = "Bob", age = 25), +) +val sortedPeople = people.sorted + +@main def Test = println(s"$sortedPeople")