@@ -4,6 +4,16 @@ import scala.quoted._
4
4
5
5
package object compiletime {
6
6
7
+ /** Use this method when you have a type, do not have a value for it but want to
8
+ * pattern match on it. For example, given a type `Tup <: Tuple`, one can
9
+ * pattern-match on it as follows:
10
+ * ```
11
+ * erasedValue[Tup] match {
12
+ * case _: EmptyTuple => ...
13
+ * case _: h *: t => ...
14
+ * }
15
+ * ```
16
+ */
7
17
erased def erasedValue [T ]: T = ???
8
18
9
19
/** The error method is used to produce user-defined compile errors during inline expansion.
@@ -38,10 +48,29 @@ package object compiletime {
38
48
transparent inline def (inline self : StringContext ) code (inline args : Any * ): String =
39
49
$ { dotty.internal.CompileTimeMacros .codeExpr(' self , ' args ) }
40
50
51
+ /** Same as `constValue` but returns a `None` if a constant value
52
+ * cannot be constructed from the provided type. Otherwise returns
53
+ * that value wrapped in `Some`.
54
+ */
41
55
inline def constValueOpt [T ]: Option [T ] = ???
42
56
57
+ /** Given a constant, singleton type `T`, convert it to a value
58
+ * of the same singleton type. For example: `assert(constValue[1] == 1)`.
59
+ */
43
60
inline def constValue [T ]: T = ???
44
61
62
+ /** Given a tuple type `(X1, ..., Xn)`, returns a tuple value
63
+ * `(constValue[X1], ..., constValue[Xn])`.
64
+ */
65
+ inline def constValueTuple [T <: Tuple ]: Tuple .Widen [T ]=
66
+ val res =
67
+ inline erasedValue[T ] match
68
+ case _ : EmptyTuple => EmptyTuple
69
+ case _ : (t *: ts) => constValue[t] *: constValueTuple[ts]
70
+ end match
71
+ res.asInstanceOf [Tuple .Widen [T ]]
72
+ end constValueTuple
73
+
45
74
/** Summons first given matching one of the listed cases. E.g. in
46
75
*
47
76
* given B { ... }
@@ -68,6 +97,20 @@ package object compiletime {
68
97
case t : T => t
69
98
}
70
99
100
+ /** Given a tuple T, summons each of its member types and returns them in
101
+ * a Tuple.
102
+ *
103
+ * @tparam T the tuple containing the types of the values to be summoned
104
+ * @return the given values typed as elements of the tuple
105
+ */
106
+ inline def summonAll [T <: Tuple ]: Tuple .Widen [T ] =
107
+ val res =
108
+ inline erasedValue[T ] match
109
+ case _ : EmptyTuple => EmptyTuple
110
+ case _ : (t *: ts) => summonInline[t] *: summonAll[ts]
111
+ end match
112
+ res.asInstanceOf [Tuple .Widen [T ]]
113
+ end summonAll
71
114
72
115
/** Succesor of a natural number where zero is the type 0 and successors are reduced as if the definition was
73
116
*
0 commit comments