xxxxxxxxxx
/+dub.sdl:
dependency "sumtype" version="~>0.4.1"
+/
import std.math: approxEqual, cos, PI, sqrt;
import sumtype;
struct Rectangular { double x, y; }
struct Polar { double r, theta; }
alias Vector = SumType!(Rectangular, Polar);
pure nothrow
double length(Vector v)
{
return v.match!(
rect => sqrt(rect.x^^2 + rect.y^^2),
polar => polar.r
);
}
pure nothrow
double horiz(Vector v)
{
return v.match!(
rect => rect.x,
polar => polar.r * cos(polar.theta)
);
}
void main()
{
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)));
}