Skip to content

Commit b07ff86

Browse files
committed
correct Sum.EffectiveType using tuples rather than unions
1 parent c3f24a3 commit b07ff86

1 file changed

Lines changed: 26 additions & 14 deletions

File tree

forja/src/Lang.scala

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package forja
22

33
import scala.util.NotGiven
4-
import scala.annotation.publicInBinary
54
import scala.deriving.Mirror
65
import forja.util.Instanceless
76
import forja.util.InlineConversion
8-
import java.util.Objects
7+
import scala.annotation.publicInBinary
98
import scala.compiletime.asMatchable
9+
import java.util.Objects
1010

1111
trait Lang:
1212
final transparent inline given this.type = this
@@ -62,35 +62,43 @@ object Lang:
6262

6363
object Sum:
6464
sealed trait EffectiveType[C <: Sum#Case] extends Instanceless:
65-
type T <: Node#T
65+
type T
6666
end EffectiveType
6767
object EffectiveType:
68-
type Aux[C <: Sum#Case, T0 <: Node#T] = EffectiveType[C] {
68+
type Aux[C <: Sum#Case, T0] = EffectiveType[C] {
6969
type T = T0
7070
}
7171

7272
inline given inst: [C <: Sum#Case] => (mirror: Mirror.SumOf[C])
7373
=> (tc: TransformedCases[mirror.MirroredElemTypes])
74-
=> EffectiveType.Aux[C, tc.C] = Instanceless[EffectiveType.Aux[C, tc.C]]
74+
=> EffectiveType.Aux[C, Tuple.Union[tc.TC]] =
75+
Instanceless[EffectiveType.Aux[C, Tuple.Union[tc.TC]]]
7576
end EffectiveType
7677

7778
sealed trait TransformedCases[Cases <: Tuple] extends Instanceless:
78-
type C <: Node#T
79+
type TC <: Tuple
7980
end TransformedCases
8081
object TransformedCases:
81-
type Aux[Cases <: Tuple, C0 <: Node#T] = TransformedCases[Cases] {
82-
type C = C0
82+
type Aux[Cases <: Tuple, TC0 <: Tuple] = TransformedCases[Cases] {
83+
type TC = TC0
8384
}
8485

85-
inline def apply[Cases <: Tuple, C <: Node#T](): Aux[Cases, C] =
86-
Instanceless[Aux[Cases, C]]
86+
inline def apply[Cases <: Tuple, TC <: Tuple](): Aux[Cases, TC] =
87+
Instanceless[Aux[Cases, TC]]
8788

88-
inline given empty: TransformedCases.Aux[EmptyTuple, Nothing] =
89+
inline given empty: TransformedCases.Aux[EmptyTuple, EmptyTuple] =
8990
TransformedCases()
90-
inline given cons: [Hd, Tl <: Tuple]
91-
=> (eht: EffectiveNodeType[Hd & Node]) => (HN: eht.To)
91+
inline given cons: [Hd <: Node, Tl <: Tuple]
92+
=> (Hd: Hd)
93+
=> (inline ng: NotGiven[Hd.Retract])
94+
=> (eht: Lang.EffectiveType[Hd.T])
95+
=> (ttl: TransformedCases[Tl])
96+
=> TransformedCases.Aux[Hd *: Tl, eht.To *: ttl.TC] = TransformedCases()
97+
inline given consRetracted: [Hd <: Node, Tl <: Tuple]
98+
=> (Hd: Hd)
99+
=> Hd.Retract
92100
=> (ttl: TransformedCases[Tl])
93-
=> TransformedCases.Aux[Hd *: Tl, HN.T | ttl.C] = TransformedCases()
101+
=> TransformedCases.Aux[Hd *: Tl, ttl.TC] = TransformedCases()
94102
end TransformedCases
95103
end Sum
96104

@@ -224,6 +232,7 @@ object Test:
224232
sealed trait Case extends Lang.Node
225233

226234
object Pong extends Lang.Term[(k: Int, foo: Foo.T)], Case
235+
object Bob extends Lang.Term[(k: Int, foo: Foo.T)], Case
227236
end Ping
228237
end L1
229238
object L1 extends L1
@@ -240,6 +249,7 @@ object Test:
240249
given r1: up.Foo.ReplaceWith[Bar.type]()
241250
given r2: up.Ping.Pong.ReplaceWith[Bar.type]()
242251
// given up.Foo.Retract
252+
// given up.Ping.Bob.Retract()
243253
end L2
244254
object L2 extends L2
245255

@@ -256,6 +266,8 @@ object Test:
256266
ping2.ex match
257267
case L2.Bar(s, opt) =>
258268
println(s"$s, $opt")
269+
// case L2.Ping.Bob(s, opt) =>
270+
// println("bob")
259271
end match
260272
end main
261273
end Test

0 commit comments

Comments
 (0)