algebraic

Converts a given TaggedUnion to a TaggedAlgebraic.

This allows to access members or operators of a TaggedUnion with a concise syntax.

algebraic
(
TU
)
if (
isInstanceOf!(TaggedUnion, TU)
)

Examples

import taggedalgebraic.visit : visit;

struct Button {
	string caption;
	int callbackID;
}

struct Label {
	string caption;
}

union U {
	Button button;
	Label label;
}

alias Control = TaggedUnion!U;

// define a generic list of controls
Control[] controls = [
	Control(Button("Hello", -1)),
	Control(Label("World"))
];

// just a dummy for the sake of the example
void print(string message) {}

// short syntax using `algebraic`
foreach (c; controls)
	print(algebraic(c).caption);

// slightly longer and noisier alternative using `visit`
foreach (c; controls)
	print(c.visit!(ct => ct.caption));

// low level alternative
foreach (c; controls) {
	final switch (c.kind) {
		case Control.Kind.button:
			print(c.buttonValue.caption);
			break;
		case Control.Kind.label:
			print(c.labelValue.caption);
			break;
	}
}

Meta