Working with ranges: mismatched function return type inference
TheFlyingFiddle via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue Oct 11 10:28:09 PDT 2016
On Tuesday, 11 October 2016 at 15:46:20 UTC, orip wrote:
> On Tuesday, 11 October 2016 at 13:06:37 UTC, pineapple wrote:
>> Rewrite `return chain(ints[0..5], ints[8..$]);` as `return
>> ints[0..5] ~ ints[8..$];`
>>
>> The `chain` function doesn't return an array, it returns a
>> lazily-evaluated sequence of an entirely different type from
>> `int[]`.
>
> Of course it does! I would like the function to return an
> "input range of int", no matter which one specifically. Is this
> possible?
It is, but you will have to use an interface / class to achieve
this behavior (or use some sort of polymorphic struct). Something
like this will do the trick:
import std.range;
import std.stdio;
interface IInputRange(T)
{
bool empty();
T front();
void popFront();
}
final class InputRange(Range) if(isInputRange!Range)
: IInputRange!(ElementType!Range)
{
Range r;
this(Range r)
{
this.r = r;
}
bool empty() { return r.empty; }
ElementType!Range front() { return r.front; }
void popFront() { r.popFront; }
}
auto inputRange(Range)(Range r)
{
return new InputRange!Range(r);
}
IInputRange!int foo(int[] ints)
{
import std.range;
if(ints.length > 10) {
return inputRange(chain(ints[0 .. 5], ints[8 .. $]));
} else {
return inputRange(ints);
}
}
void main()
{
auto ir = foo([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
auto ir2 = foo([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
writeln(ir);
writeln(ir2);
}
More information about the Digitalmars-d-learn
mailing list