File tree Expand file tree Collapse file tree 1 file changed +29
-0
lines changed Expand file tree Collapse file tree 1 file changed +29
-0
lines changed Original file line number Diff line number Diff line change 1+ import scala .compiletime .{constValue , erasedValue , summonInline }
2+ import scala .deriving .Mirror
3+
4+ trait Printer [T ]:
5+ def format : String
6+
7+ given Printer [String ] with
8+ def format : String = " String"
9+
10+ inline given [T ](using mirror : Mirror .ProductOf [T ]): Printer [T ] = Printer .derived[T ]
11+
12+ object Printer :
13+ inline def apply [T ](using printer : Printer [T ]): Printer [T ] = printer
14+
15+ inline def derived [T ](using mirror : Mirror .ProductOf [T ]): Printer [T ] =
16+ val params = summonPrinters[mirror.MirroredElemTypes ]
17+ new Printer [T ] :
18+ def format : String = params.map(p => p.format).mkString(" ," )
19+
20+ inline def summonPrinters [Types <: Tuple ]: Seq [Printer [? ]] = inline erasedValue[Types ] match
21+ case _ : EmptyTuple => Seq .empty
22+ case _ : (v *: vs) => summonInline[Printer [v]] +: summonPrinters[vs]
23+
24+ case class Simple (name : String )
25+
26+ object Test :
27+ def main (args : Array [String ]): Unit =
28+ assert(Printer [String ].format == " String" )
29+ assert(Printer [Simple ].format == " String" )
You can’t perform that action at this time.
0 commit comments