On Saturday, 30 December 2017 at 19:00:07 UTC, aliak wrote:
Instead of this:
auto result = range.op!f;
if (!result.empty) {
result.front.method();
}
This:
range.op!f.ifFront.method();
Ah, so you don't have a problem with checking emptiness but you
want to do it inside the expression, without having to type the
range twice? I personally find it useful to define an "use"
template for cases like this:
import std.typecons : Nullable;
auto ref use(alias how, T)(T what){return how(what);}
void main()
{
import std.algorithm, std.range, std.stdio;
auto arr = [2, 3, 4];
foreach(unused; 0 .. 5)
{ arr
.map!(x => (x + 2) * x)
.use!(x => x.empty? 0: x.front)
.writeln;
if (arr.empty){} else arr.popFront;
}
readln(); //program termination delayed until pressing enter
}
/+
8
15
24
0
0
+/
Of course, if you want you can also define a more specialized
template which does not require typing the lambda function.