On 10/23/2016 11:55 PM, Nick Sabalausky wrote:
--------------------------------
// An equivalent std.variant.Algebraic would be clunky by comparison:
variant RgbColor {
| Red
| Yellow
| Green
| Different {
red : float;
green : float;
blue : float;
}
}
--------------------------------
Just to compare to equivalent D:
--------------------------------
struct RgbColor_ // Don't clutter the namepsace
{
struct Red {}
struct Yellow {}
struct Green {}
struct Different {
float red;
float green;
float blue;
}
}
alias RgbColor = Algenraic!(
RgbColor_.Red,
RgbColor_.Yellow,
RgbColor_.Green,
RgbColor_.Different,
}
--------------------------------
It's just...I mean, yea, it works, and you could probably DRY it up a
little with a type contructing template ("alias RgbColor =
DoMagic!RgbColor_"), but...meh...
And then the pattern matching end would be similarly "ehh...meh...":
--------------------------------
RgbColor color = ...;
auto x = color.visit(
(RgbColor_.Red a) => "red",
(RgbColor_.Yellow a) => "yellow",
(RgbColor_.Green a) => "green",
(RgbColor_.Red a) =>
mixin(interpolateStr!`rgb(${a.red}, ${a.green}, ${a.blue})`),
);
--------------------------------
Again, technically works, but...ehh, it's like doing slices or
high-order funcs in C.