sumtype

A sum type for modern D.

Features

Pattern matching, including support for introspection-based matching

Self-referential types, using This

Works with pure , @safe , @nogc , nothrow , and immutable

, , , , and Compatible with -betterC and -dip1000

and Zero runtime overhead compared to hand-written C No heap allocation Does not rely on runtime type information ( TypeInfo )



Documentation

View online on Github Pages.

sumtype uses adrdox to generate its documentation. To build your own copy, run the following command from the root of the sumtype repository:

path/to/adrdox/doc2 --genSearchIndex --genSource -o generated-docs src

Example

import std.math: approxEqual, cos, PI, sqrt; struct Rectangular { double x, y; } struct Polar { double r, theta; } alias Vector = SumType!(Rectangular, Polar); pure @safe @nogc nothrow double length(Vector v) { return v.match!( rect => sqrt(rect.x^^2 + rect.y^^2), polar => polar.r ); } pure @safe @nogc nothrow double horiz(Vector v) { return v.match!( rect => rect.x, polar => polar.r * cos(polar.theta) ); } Vector u = Rectangular(1, 1); Vector v = Polar(1, PI/4); assert(length(u).approxEqual(sqrt(2.0))); assert(length(v).approxEqual(1)); assert(horiz(u).approxEqual(1)); assert(horiz(v).approxEqual(sqrt(0.5)));

Installation

If you're using dub, add the sumtype package to your project as a dependency.