xxxxxxxxxx
import std.stdio;
import std.variant;
alias Message = Algebraic!(string, int, This[]);
auto send(T, M)(T obj, M message) { return obj.dispatch(Message(message)); }
auto send(T, MS...)(T obj, MS messages) if(MS.length > 1) {
Message[] msg;
foreach(m; messages) msg ~= Message(m);
obj.send(msg);
}
class Foo {
void dispatch(Message msg) {
msg.visit!(
(string x) => writefln("string: %s", x),
(int x) => writefln("integer: %s", x),
x => writefln("unsupported: %s", x)
);
}
}
void main() {
Foo foo = new Foo;
foo.send("hello");
foo.send(123);
foo.send("hello", 123);
}