On 10/11/2016 09:55 AM, orip wrote:
auto foo(int[] ints) {
import std.range;
if (ints.length > 10) {
return chain(ints[0..5], ints[8..$]);
} else {
//return ints; // Error: mismatched function return type inference
of int[] and Result
return chain(ints[0..0], ints[0..$]); // This workaround compiles
}
}
Is there a compatible return type that can be used, or some other
workaround?
You've got some options:
1) OOP with std.range.interfaces. Ali already showed how this work.
Comes at the cost of extra allocations and indirections.
2) std.range.choose wraps two different range types and uses forwards to
one of them based on a condition. Should be cheap. But you need
restructure your code a little:
----
auto foo(int[] ints) {
import std.range: chain, choose;
return choose(ints.length > 10,
chain(ints[0..5], ints[8..$]),
ints);
}
----
3) The workaround you already discovered: making a seemingly pointless
call to `chain` to get the types to match. Possibly the most efficient
solution. Looks a little odd.