Module optional

Home of the Optional type

Example

import std.algorithm: equal;

// Create empty optional
auto a = no!int;

// Operating on an empty optional is safe and results in none
assert(a == none);
assert(++a == none);

// Assigning a value and then operating yields results
a = 9;
assert(a == some(9));
assert(++a == some(10));

// It is a range
import std.algorithm: map;
auto b = some(10);
auto c = no!int;
assert(b.map!(a => a * 2).equal([20]));
assert(c.map!(a => a * 2).empty);

// Safely get the inner value
assert(b.frontOr(3) == 10);
assert(c.frontOr(3) == 3);

// Unwrap to get to the raw data (returns a non-null pointer or reference if there's data)
class C {
    int i = 3;
}

auto n = no!C;
n.or!(() => n = some!C(null));
assert(n == none);
n.or!(() => n = new C());
assert(n.front !is null);
assert(n.front.i == 3);

Example

Phobos equvalent range.only test

import std.algorithm: filter, joiner, map, equal;
import std.uni: isUpper;

assert(equal(some('♡'), "♡"));

string title = "The D Programming Language";
assert(title
    .filter!isUpper // take the upper case letters
    .map!some       // make each letter its own range
    .joiner(".")    // join the ranges together lazily
    .equal("T.D.P.L"));