On Monday, 1 January 2018 at 04:18:29 UTC, Ali Çehreli wrote:
If you're fine with specifying the function as a template
argument, the following works. (As seen with 's => s.foo()'
below, you have to use a lambda for member functions anyway.)
Ali
Nice! Thanks :) And I think your usage for something named
"ifFront" actually makes more sense than using it to return
"saferef" functionality.
I've basically implemented an optional type for now and the
"iffront" implementation looks like this:
import std.range: isInputRange;
auto iffront(Range)(Range r) if (isInputRange!Range) {
import std.range: ElementType, empty, front;
import optional: no, some;
return r.empty ? no!(ElementType!Range) : some(r.front);
}
unittest {
import std.algorithm: filter;
assert([false].filter!"a".iffront.empty); // because optional
is a range
}
unittest {
import std.algorithm: filter;
import optional: some, none;
struct A {
int f() {
return 7;
}
}
assert([A()].filter!"false".iffront.f == none);
assert([A()].filter!"true".iffront.f == some(7));
}
And thanks everyone for the input. I'll play around with some of
the ideas and see what comes of it.