From 0019b7dfcaba7e00e2d8e2ecb7e53b3450345c71 Mon Sep 17 00:00:00 2001 From: odersky Date: Mon, 16 Jun 2025 11:54:07 +0200 Subject: [PATCH 1/3] Add an Ordering given instance for named tuples --- library/src/scala/NamedTuple.scala | 4 ++++ tests/run/named-tuple-ordering.check | 1 + tests/run/named-tuple-ordering.scala | 13 +++++++++++++ 3 files changed, 18 insertions(+) create mode 100644 tests/run/named-tuple-ordering.check create mode 100644 tests/run/named-tuple-ordering.scala 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/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") From 4d0883e4be8a5f271ebec035885bd53d92798df3 Mon Sep 17 00:00:00 2001 From: odersky Date: Mon, 16 Jun 2025 13:55:13 +0200 Subject: [PATCH 2/3] Update MiMa filters --- project/MiMaFilters.scala | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/project/MiMaFilters.scala b/project/MiMaFilters.scala index c57136b262dd..bebde8016a86 100644 --- a/project/MiMaFilters.scala +++ b/project/MiMaFilters.scala @@ -19,6 +19,10 @@ object MiMaFilters { ProblemFilters.exclude[DirectMissingMethodProblem]("scala.Conversion.underlying"), ProblemFilters.exclude[MissingClassProblem]("scala.Conversion$"), + + ProblemFilters.exclude[DirectMissingMethodProblem]("scala.NamedTuple.namedTupleOrdering"), + ProblemFilters.exclude[DirectMissingMethodProblem]("scala.NamedTuple.namedTupleOrdering"), + ProblemFilters.exclude[MissingClassProblem]("scala.NamedTuple$namedTupleOrdering"), ), // Additions since last LTS From 1b6902e6dba7fa2c11e23af608d5b8796dfe0d21 Mon Sep 17 00:00:00 2001 From: odersky Date: Mon, 16 Jun 2025 19:36:17 +0200 Subject: [PATCH 3/3] Drop redundant filter --- project/MiMaFilters.scala | 1 - 1 file changed, 1 deletion(-) diff --git a/project/MiMaFilters.scala b/project/MiMaFilters.scala index bebde8016a86..002f53b24761 100644 --- a/project/MiMaFilters.scala +++ b/project/MiMaFilters.scala @@ -20,7 +20,6 @@ object MiMaFilters { ProblemFilters.exclude[DirectMissingMethodProblem]("scala.Conversion.underlying"), ProblemFilters.exclude[MissingClassProblem]("scala.Conversion$"), - ProblemFilters.exclude[DirectMissingMethodProblem]("scala.NamedTuple.namedTupleOrdering"), ProblemFilters.exclude[DirectMissingMethodProblem]("scala.NamedTuple.namedTupleOrdering"), ProblemFilters.exclude[MissingClassProblem]("scala.NamedTuple$namedTupleOrdering"), ),