It does work as expected if an intermediary type is introduced:
@resultBuilder
struct TupleBuilder {
struct Pack<each T> {
let tuple: (repeat each T)
}
static func buildPartialBlock<V>(first: V) -> Pack<V> {
.init(tuple: first)
}
static func buildPartialBlock<each T, E>(accumulated: Pack<repeat each T>, next: E) -> Pack<repeat each T, String, E> {
Pack(tuple: (repeat each accumulated.tuple, "DIVIDER", next))
}
}
func buildTuple<T>(@TupleBuilder _ builder: () -> T) -> T {
builder()
}
let builtTuple = buildTuple {
1
"two"
3.3
}
print(builtTuple.tuple) // (1, "DIVIDER", "two", "DIVIDER", 3.3)
print(type(of: builtTuple.tuple)) // (Int, String, String, String, Double)