// // NamedUnion // record NamedUnion[...Fields] { data : Union[...mapValues(x => x.1, ...Fields)]; } private fieldIndex(name, ...fields) { var i = 0; static for (field in ...fields) { if (name == field.0) return i; i += 1; } error("invalid field name"); return -1; } [...fields] overload fieldRef(x:NamedUnion[...fields], name) { alias i = fieldIndex(name, ...fields); return ref staticIndex(x.0, static i); } // // sample code for named unions // alias MyUnion = NamedUnion[(#foo, Int), (#bar, UInt8)]; main() { var a = MyUnion(); a.foo = -1; println(a.bar); // prints 255 }