Here's a little experiment I was trying out earlier today in order to try and convert foreach-style code to using UFCS of ranges:

//////////////////////////////////////////////
import std.algorithm, std.range, std.stdio;

void main()
{
    size_t s = 0;

    void essify(size_t n)
    {
        writeln("n = ", n);
        ++s;
    }

    auto filteredRange = iota(0, 10).filter!(a => (a % 2));

    filteredRange.map!(a => essify(a));

    writeln(s);

    foreach (n; filteredRange)
    {
        essify(n);
    }

    writeln(s);
}
//////////////////////////////////////////////

I'd assumed the two uses of filteredRange would produce equivalent results, but in fact the transformation using map does nothing -- the writeln statement inside the essify() function never gets triggered, suggesting the function body is never executed.

Can anyone advise why, and whether there's a nice range iteration option to ensure that this function gets called using each element of the filteredRange?

Reply via email to