On Thursday, 9 February 2017 at 05:40:01 UTC, Jonathan M Davis
wrote:
auto func(alias pred, R)(R range)
if(from!"std.range.primitives".isInputRange!R &&
is(typeof(pred(range.front)) == bool))
{...}
but you can't import std.range.primitives.front to make dynamic
arrays work, whereas with DIP 1005, you can just add the import
to the function declaration, and it will work without having to
tie the import to a specific symbol.
That's a problem with UFCS in general. Workaround:
import std.functional;
import std.range;
void main(){
auto r = [1];
auto i = r.unaryFun!(std.range.front);
assert(i == 1);
}
As an enhancement, it seems supporting value.(callable) would
work:
range.(std.range.front)
That would be generally useful:
// print reciprocal of reduced range
range.reduce!someFunc.(n => 1 / n).writeln;
The other problem is how much more verbose it is. With DIP
1005, you can do
with(import std.datetime)
auto foo(SysTime st1, SysTime st2, Duration d);
The import is only listed once, whereas with this technique,
you have to list it for each symbol.
That's a problem only when very few of a module's declarations
need more than one symbol from the same module. How often does
that occur when a module-level import should be avoided?