On Friday, 24 August 2018 at 20:59:34 UTC, aliak wrote:
THis is true. And might be interesting to try out actually. Can you access the types in a SumType via index?

I'm thinking because Optional behaves like a range, and I guess I'd define a SumType!(T, None), then a rough outline may be:

struct None {}
immutable none = None();

struct(T) {
  SumType(T, None) opt;
  T front() {
    return opt[0]; // what to do here?
  }
}

Or I guess I should maybe do it like this?:

return opt.match!(
  (T val) => val,
  (None) => T.init,
);

I think this is probably the best way:

@property T front() {
    return opt.match!(
        (T val) => val,
        (None) {
            assert(false, "called .front on an empty range");
            return T.init; // for return type inference
        }
    );
}

You could also do it with `tryMatch` and `std.exception.assertNotThrown`. It makes the code a little nicer, but involving exceptions at all seemed like unnecessary overhead to me.

Reply via email to