11package forja
22
33import scala .util .NotGiven
4- import scala .annotation .publicInBinary
54import scala .deriving .Mirror
65import forja .util .Instanceless
76import forja .util .InlineConversion
8- import java . util . Objects
7+ import scala . annotation . publicInBinary
98import scala .compiletime .asMatchable
9+ import java .util .Objects
1010
1111trait 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
261273end Test
0 commit comments