Skip to content

Commit fcd436b

Browse files
committed
Make NamedTuples work under new MatchType spec
1 parent 0fdf796 commit fcd436b

File tree

3 files changed

+30
-16
lines changed

3 files changed

+30
-16
lines changed

library/src/scala/NamedTuple.scala

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ object NamedTuple:
1515
extension [V <: Tuple](x: V)
1616
inline def withNames[N <: Tuple]: NamedTuple[N, V] = x
1717

18+
export NamedTupleDecomposition.{Names, DropNames}
19+
1820
extension [N <: Tuple, V <: Tuple](x: NamedTuple[N, V])
1921

2022
/** The underlying tuple without the names */
@@ -103,14 +105,6 @@ object NamedTuple:
103105

104106
end extension
105107

106-
/** The names of a named tuple, represented as a tuple of literal string values. */
107-
type Names[X <: AnyNamedTuple] <: Tuple = X match
108-
case NamedTuple[n, _] => n
109-
110-
/** The value types of a named tuple represented as a regular tuple. */
111-
type DropNames[NT <: AnyNamedTuple] <: Tuple = NT match
112-
case NamedTuple[_, x] => x
113-
114108
/** The size of a named tuple, represented as a literal constant subtype of Int */
115109
type Size[X <: AnyNamedTuple] = Tuple.Size[DropNames[X]]
116110

@@ -182,3 +176,16 @@ object NamedTuple:
182176
NamedTuple[Names[X], Tuple.Zip[DropNames[X], DropNames[Y]]]
183177

184178
end NamedTuple
179+
180+
@experimental
181+
/** Separate from NamedTuple object so that we can match on the opaque type NamedTuple. */
182+
object NamedTupleDecomposition:
183+
import NamedTuple.*
184+
185+
/** The names of a named tuple, represented as a tuple of literal string values. */
186+
type Names[X <: AnyNamedTuple] <: Tuple = X match
187+
case NamedTuple[n, _] => n
188+
189+
/** The value types of a named tuple represented as a regular tuple. */
190+
type DropNames[NT <: AnyNamedTuple] <: Tuple = NT match
191+
case NamedTuple[_, x] => x

tests/pos/named-tuples-strawman-2.scala

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,24 +62,29 @@ object TupleOps:
6262
inline def concatDistinct[X <: Tuple, Y <: Tuple](xs: X, ys: Y): ConcatDistinct[X, Y] =
6363
(xs ++ ys.filter[Y, [Elem] =>> ![Contains[X, Elem]]]).asInstanceOf[ConcatDistinct[X, Y]]
6464

65+
object NamedTupleDecomposition:
66+
import NamedTupleOps.*
67+
68+
/** The names of the named tuple type `NT` */
69+
type Names[NT <: AnyNamedTuple] <: Tuple = NT match
70+
case NamedTuple[n, _] => n
71+
72+
/** The value types of the named tuple type `NT` */
73+
type DropNames[NT <: AnyNamedTuple] <: Tuple = NT match
74+
case NamedTuple[_, x] => x
75+
6576
object NamedTupleOps:
6677
import TupleOps.*
6778

6879
opaque type AnyNamedTuple = Any
6980

7081
opaque type NamedTuple[N <: Tuple, +X <: Tuple] >: X <: AnyNamedTuple = X
7182

83+
export NamedTupleDecomposition.*
84+
7285
object NamedTuple:
7386
def apply[N <: Tuple, X <: Tuple](x: X): NamedTuple[N, X] = x
7487

75-
/** The names of the named tuple type `NT` */
76-
type Names[NT <: AnyNamedTuple] <: Tuple = NT match
77-
case NamedTuple[n, _] => n
78-
79-
/** The value types of the named tuple type `NT` */
80-
type DropNames[NT <: AnyNamedTuple] <: Tuple = NT match
81-
case NamedTuple[_, x] => x
82-
8388
extension [NT <: AnyNamedTuple](x: NT)
8489
inline def toTuple: DropNames[NT] = x.asInstanceOf
8590
inline def names: Names[NT] = constValueTuple[Names[NT]]

tests/run-tasty-inspector/stdlibExperimentalDefinitions.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ val experimentalDefinitionInLibrary = Set(
9494
// New feature: named tuples
9595
"scala.NamedTuple",
9696
"scala.NamedTuple$",
97+
"scala.NamedTupleDecomposition",
98+
"scala.NamedTupleDecomposition$",
9799
)
98100

99101

0 commit comments

Comments
 (0)