@@ -93,6 +93,72 @@ package quoted {
93
93
def ofList [T ](xs : Seq [Expr [T ]])(given Type [T ], QuoteContext ): Expr [List [T ]] =
94
94
if (xs.isEmpty) ' { Nil } else ' { List ($ {ofSeq(xs)}: _* ) }
95
95
96
+ /** Lifts this sequence of expressions into an expression of a tuple
97
+ *
98
+ * Transforms a sequence of expression
99
+ * `Seq(e1, e2, ...)` where `ei: Expr[_]`
100
+ * to an expression equivalent to
101
+ * `'{ ($e1, $e2, ...) }` typed as an `Expr[Tuple]`
102
+ */
103
+ def ofTuple (seq : Seq [Expr [_]])(given QuoteContext ): Expr [Tuple ] = {
104
+ seq match {
105
+ case Seq () =>
106
+ unitExpr
107
+ case Seq (' { $x1 : $t1 }) =>
108
+ ' { Tuple1 ($x1) }
109
+ case Seq (' { $x1 : $t1 }, ' { $x2 : $t2 }) =>
110
+ ' { Tuple2 ($x1, $x2) }
111
+ case Seq (' { $x1 : $t1 }, ' { $x2 : $t2 }, ' { $x3 : $t3 }) =>
112
+ ' { Tuple3 ($x1, $x2, $x3) }
113
+ case Seq (' { $x1 : $t1 }, ' { $x2 : $t2 }, ' { $x3 : $t3 }, ' { $x4 : $t4 }) =>
114
+ ' { Tuple4 ($x1, $x2, $x3, $x4) }
115
+ case Seq (' { $x1 : $t1 }, ' { $x2 : $t2 }, ' { $x3 : $t3 }, ' { $x4 : $t4 }, ' { $x5 : $t5 }) =>
116
+ ' { Tuple5 ($x1, $x2, $x3, $x4, $x5) }
117
+ case Seq (' { $x1 : $t1 }, ' { $x2 : $t2 }, ' { $x3 : $t3 }, ' { $x4 : $t4 }, ' { $x5 : $t5 }, ' { $x6 : $t6 }) =>
118
+ ' { Tuple6 ($x1, $x2, $x3, $x4, $x5, $x6) }
119
+ case Seq (' { $x1 : $t1 }, ' { $x2 : $t2 }, ' { $x3 : $t3 }, ' { $x4 : $t4 }, ' { $x5 : $t5 }, ' { $x6 : $t6 }, ' { $x7 : $t7 }) =>
120
+ ' { Tuple7 ($x1, $x2, $x3, $x4, $x5, $x6, $x7) }
121
+ case Seq (' { $x1 : $t1 }, ' { $x2 : $t2 }, ' { $x3 : $t3 }, ' { $x4 : $t4 }, ' { $x5 : $t5 }, ' { $x6 : $t6 }, ' { $x7 : $t7 }, ' { $x8 : $t8 }) =>
122
+ ' { Tuple8 ($x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8) }
123
+ case Seq (' { $x1 : $t1 }, ' { $x2 : $t2 }, ' { $x3 : $t3 }, ' { $x4 : $t4 }, ' { $x5 : $t5 }, ' { $x6 : $t6 }, ' { $x7 : $t7 }, ' { $x8 : $t8 }, ' { $x9 : $t9 }) =>
124
+ ' { Tuple9 ($x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9) }
125
+ case Seq (' { $x1 : $t1 }, ' { $x2 : $t2 }, ' { $x3 : $t3 }, ' { $x4 : $t4 }, ' { $x5 : $t5 }, ' { $x6 : $t6 }, ' { $x7 : $t7 }, ' { $x8 : $t8 }, ' { $x9 : $t9 }, ' { $x10 : $t10 }) =>
126
+ ' { Tuple10 ($x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10) }
127
+ case Seq (' { $x1 : $t1 }, ' { $x2 : $t2 }, ' { $x3 : $t3 }, ' { $x4 : $t4 }, ' { $x5 : $t5 }, ' { $x6 : $t6 }, ' { $x7 : $t7 }, ' { $x8 : $t8 }, ' { $x9 : $t9 }, ' { $x10 : $t10 }, ' { $x11 : $t11 }) =>
128
+ ' { Tuple11 ($x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11) }
129
+ case Seq (' { $x1 : $t1 }, ' { $x2 : $t2 }, ' { $x3 : $t3 }, ' { $x4 : $t4 }, ' { $x5 : $t5 }, ' { $x6 : $t6 }, ' { $x7 : $t7 }, ' { $x8 : $t8 }, ' { $x9 : $t9 }, ' { $x10 : $t10 }, ' { $x11 : $t11 }, ' { $x12 : $t12 }) =>
130
+ ' { Tuple12 ($x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12) }
131
+ case Seq (' { $x1 : $t1 }, ' { $x2 : $t2 }, ' { $x3 : $t3 }, ' { $x4 : $t4 }, ' { $x5 : $t5 }, ' { $x6 : $t6 }, ' { $x7 : $t7 }, ' { $x8 : $t8 }, ' { $x9 : $t9 }, ' { $x10 : $t10 }, ' { $x11 : $t11 }, ' { $x12 : $t12 }, ' { $x13 : $t13 }) =>
132
+ ' { Tuple13 ($x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13) }
133
+ case Seq (' { $x1 : $t1 }, ' { $x2 : $t2 }, ' { $x3 : $t3 }, ' { $x4 : $t4 }, ' { $x5 : $t5 }, ' { $x6 : $t6 }, ' { $x7 : $t7 }, ' { $x8 : $t8 }, ' { $x9 : $t9 }, ' { $x10 : $t10 }, ' { $x11 : $t11 }, ' { $x12 : $t12 }, ' { $x13 : $t13 }, ' { $x14 : $t14 }) =>
134
+ ' { Tuple14 ($x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14) }
135
+ case Seq (' { $x1 : $t1 }, ' { $x2 : $t2 }, ' { $x3 : $t3 }, ' { $x4 : $t4 }, ' { $x5 : $t5 }, ' { $x6 : $t6 }, ' { $x7 : $t7 }, ' { $x8 : $t8 }, ' { $x9 : $t9 }, ' { $x10 : $t10 }, ' { $x11 : $t11 }, ' { $x12 : $t12 }, ' { $x13 : $t13 }, ' { $x14 : $t14 }, ' { $x15 : $t15 }) =>
136
+ ' { Tuple15 ($x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15) }
137
+ case Seq (' { $x1 : $t1 }, ' { $x2 : $t2 }, ' { $x3 : $t3 }, ' { $x4 : $t4 }, ' { $x5 : $t5 }, ' { $x6 : $t6 }, ' { $x7 : $t7 }, ' { $x8 : $t8 }, ' { $x9 : $t9 }, ' { $x10 : $t10 }, ' { $x11 : $t11 }, ' { $x12 : $t12 }, ' { $x13 : $t13 }, ' { $x14 : $t14 }, ' { $x15 : $t15 }, ' { $x16 : $t16 }) =>
138
+ ' { Tuple16 ($x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x16) }
139
+ case Seq (' { $x1 : $t1 }, ' { $x2 : $t2 }, ' { $x3 : $t3 }, ' { $x4 : $t4 }, ' { $x5 : $t5 }, ' { $x6 : $t6 }, ' { $x7 : $t7 }, ' { $x8 : $t8 }, ' { $x9 : $t9 }, ' { $x10 : $t10 }, ' { $x11 : $t11 }, ' { $x12 : $t12 }, ' { $x13 : $t13 }, ' { $x14 : $t14 }, ' { $x15 : $t15 }, ' { $x16 : $t16 }, ' { $x17 : $t17 }) =>
140
+ ' { Tuple17 ($x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x16, $x17) }
141
+ case Seq (' { $x1 : $t1 }, ' { $x2 : $t2 }, ' { $x3 : $t3 }, ' { $x4 : $t4 }, ' { $x5 : $t5 }, ' { $x6 : $t6 }, ' { $x7 : $t7 }, ' { $x8 : $t8 }, ' { $x9 : $t9 }, ' { $x10 : $t10 }, ' { $x11 : $t11 }, ' { $x12 : $t12 }, ' { $x13 : $t13 }, ' { $x14 : $t14 }, ' { $x15 : $t15 }, ' { $x16 : $t16 }, ' { $x17 : $t17 }, ' { $x18 : $t18 }) =>
142
+ ' { Tuple18 ($x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x16, $x17, $x18) }
143
+ case Seq (' { $x1 : $t1 }, ' { $x2 : $t2 }, ' { $x3 : $t3 }, ' { $x4 : $t4 }, ' { $x5 : $t5 }, ' { $x6 : $t6 }, ' { $x7 : $t7 }, ' { $x8 : $t8 }, ' { $x9 : $t9 }, ' { $x10 : $t10 }, ' { $x11 : $t11 }, ' { $x12 : $t12 }, ' { $x13 : $t13 }, ' { $x14 : $t14 }, ' { $x15 : $t15 }, ' { $x16 : $t16 }, ' { $x17 : $t17 }, ' { $x18 : $t18 }, ' { $x19 : $t19 }) =>
144
+ ' { Tuple19 ($x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x16, $x17, $x18, $x19) }
145
+ case Seq (' { $x1 : $t1 }, ' { $x2 : $t2 }, ' { $x3 : $t3 }, ' { $x4 : $t4 }, ' { $x5 : $t5 }, ' { $x6 : $t6 }, ' { $x7 : $t7 }, ' { $x8 : $t8 }, ' { $x9 : $t9 }, ' { $x10 : $t10 }, ' { $x11 : $t11 }, ' { $x12 : $t12 }, ' { $x13 : $t13 }, ' { $x14 : $t14 }, ' { $x15 : $t15 }, ' { $x16 : $t16 }, ' { $x17 : $t17 }, ' { $x18 : $t18 }, ' { $x19 : $t19 }, ' { $x20 : $t20 }) =>
146
+ ' { Tuple20 ($x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x16, $x17, $x18, $x19, $x20) }
147
+ case Seq (' { $x1 : $t1 }, ' { $x2 : $t2 }, ' { $x3 : $t3 }, ' { $x4 : $t4 }, ' { $x5 : $t5 }, ' { $x6 : $t6 }, ' { $x7 : $t7 }, ' { $x8 : $t8 }, ' { $x9 : $t9 }, ' { $x10 : $t10 }, ' { $x11 : $t11 }, ' { $x12 : $t12 }, ' { $x13 : $t13 }, ' { $x14 : $t14 }, ' { $x15 : $t15 }, ' { $x16 : $t16 }, ' { $x17 : $t17 }, ' { $x18 : $t18 }, ' { $x19 : $t19 }, ' { $x20 : $t20 }, ' { $x21 : $t21 }) =>
148
+ ' { Tuple21 ($x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x16, $x17, $x18, $x19, $x20, $x21) }
149
+ case Seq (' { $x1 : $t1 }, ' { $x2 : $t2 }, ' { $x3 : $t3 }, ' { $x4 : $t4 }, ' { $x5 : $t5 }, ' { $x6 : $t6 }, ' { $x7 : $t7 }, ' { $x8 : $t8 }, ' { $x9 : $t9 }, ' { $x10 : $t10 }, ' { $x11 : $t11 }, ' { $x12 : $t12 }, ' { $x13 : $t13 }, ' { $x14 : $t14 }, ' { $x15 : $t15 }, ' { $x16 : $t16 }, ' { $x17 : $t17 }, ' { $x18 : $t18 }, ' { $x19 : $t19 }, ' { $x20 : $t20 }, ' { $x21 : $t21 }, ' { $x22 : $t22 }) =>
150
+ ' { Tuple22 ($x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x16, $x17, $x18, $x19, $x20, $x21, $x22) }
151
+ case _ =>
152
+ ' { Tuple .fromIArray(IArray ($ {ofSeq(seq)}: _* )) }
153
+ }
154
+ }
155
+
156
+ /** Given a tuple of the form `(Expr[A1], ..., Expr[An])`, outputs a tuple `Expr[(A1, ..., An)]`. */
157
+ def ofTuple [T <: Tuple : Tuple .IsMappedBy [Expr ]: Type ](tup : T ) (given ctx : QuoteContext ): Expr [Tuple .InverseMap [T , Expr ]] = {
158
+ import ctx .tasty ._
159
+ val elems : Seq [Expr [_]] = tup.asInstanceOf [Product ].productIterator.toSeq.asInstanceOf [Seq [Expr [_]]]
160
+ ofTuple(elems).cast[Tuple .InverseMap [T , Expr ]]
161
+ }
96
162
}
97
163
98
164
}
0 commit comments