Skip to content

Commit 5bba231

Browse files
authored
Add an Ordering given instance for named tuples (#23379)
2 parents 4f1f39f + e3b99d0 commit 5bba231

File tree

4 files changed

+27
-8
lines changed

4 files changed

+27
-8
lines changed

library/src/scala/NamedTuple.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,10 @@ object NamedTuple:
128128
/** The empty named tuple */
129129
val Empty: Empty = EmptyTuple
130130

131+
/** The ordering instance for named tuples */
132+
given namedTupleOrdering: [N <: Tuple, V <: Tuple] => (ord: Ordering[V]) => Ordering[NamedTuple[N, V]]:
133+
def compare(x: NamedTuple[N, V], y: NamedTuple[N, V]): Int =
134+
ord.compare(x.toTuple, y.toTuple)
131135
end NamedTuple
132136

133137
/** Separate from NamedTuple object so that we can match on the opaque type NamedTuple. */

project/MiMaFilters.scala

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,26 @@ object MiMaFilters {
88
val ForwardsBreakingChanges: Map[String, Seq[ProblemFilter]] = Map(
99
// Additions that require a new minor version of the library
1010
Build.mimaPreviousDottyVersion -> Seq(
11-
ProblemFilters.exclude[MissingClassProblem]("scala.annotation.internal.readOnlyCapability"),
12-
ProblemFilters.exclude[MissingClassProblem]("scala.annotation.internal.onlyCapability"),
13-
1411
// Scala.js-only class
1512
ProblemFilters.exclude[FinalClassProblem]("scala.scalajs.runtime.AnonFunctionXXL"),
1613
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.scalajs.runtime.AnonFunctionXXL.this"),
1714

1815
ProblemFilters.exclude[MissingFieldProblem]("scala.runtime.stdLibPatches.language.2.13"),
1916
ProblemFilters.exclude[MissingClassProblem]("scala.runtime.stdLibPatches.language$2$u002E13$"),
20-
ProblemFilters.exclude[MissingFieldProblem]("scala.runtime.stdLibPatches.language#experimental.separationChecking"),
21-
ProblemFilters.exclude[MissingClassProblem]("scala.runtime.stdLibPatches.language$experimental$separationChecking$"),
2217

2318
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.Conversion.underlying"),
2419
ProblemFilters.exclude[MissingClassProblem]("scala.Conversion$"),
25-
ProblemFilters.exclude[MissingClassProblem]("scala.annotation.internal.RuntimeChecked"),
26-
20+
ProblemFilters.exclude[MissingClassProblem]("scala.annotation.internal.RuntimeChecked"),
2721
ProblemFilters.exclude[MissingClassProblem]("scala.annotation.stableNull"),
2822

29-
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.quoted.Quotes#reflectModule#ValDefModule.let"),
23+
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.NamedTuple.namedTupleOrdering"),
24+
ProblemFilters.exclude[MissingClassProblem]("scala.NamedTuple$namedTupleOrdering"),
25+
26+
// cc related
27+
ProblemFilters.exclude[MissingClassProblem]("scala.annotation.internal.readOnlyCapability"),
28+
ProblemFilters.exclude[MissingClassProblem]("scala.annotation.internal.onlyCapability"),
29+
ProblemFilters.exclude[MissingFieldProblem]("scala.runtime.stdLibPatches.language#experimental.separationChecking"),
30+
ProblemFilters.exclude[MissingClassProblem]("scala.runtime.stdLibPatches.language$experimental$separationChecking$"),
3031
),
3132

3233
// Additions since last LTS

tests/run/named-tuple-ordering.check

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
List((Alice,29), (Alice,30), (Bob,25), (Charlie,35))

tests/run/named-tuple-ordering.scala

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
type Person = (name: String, age: Int)
2+
3+
val so = summon[Ordering[Person]]
4+
5+
val people: List[Person] = List(
6+
(name = "Charlie", age = 35),
7+
(name = "Alice", age = 30),
8+
(name = "Alice", age = 29),
9+
(name = "Bob", age = 25),
10+
)
11+
val sortedPeople = people.sorted
12+
13+
@main def Test = println(s"$sortedPeople")

0 commit comments

Comments
 (0)