xxxxxxxxxx
import std.typecons, std.typetuple, std.stdio, std.algorithm,
std.range;
bool validAsRange(T)() {
if (!isTuple!T || NoDuplicates!(T.Types).length != 1)
return false;
foreach (i, _; T.Types) // Useless?
if (T.tupleof[i].offsetof != T.Types[0].sizeof * i)
return false;
return true;
}
T.Types[0][] asRange(T)(ref T tup) if (validAsRange!T()) {
return (cast(T.Types[0]*)&tup[0])[0 .. T.length];
}
void main() { // demo
auto a = [0];
auto b = [5];
auto c = [11];
auto d = [22];
Tuple!(int,int,int,int) tup = zip(a, b, c, d).front;
auto result = tup.asRange.map!(x => x * 2).array;
assert(result == [0, 10, 22, 44]);
tup.expand.only.writeln;
}