What is "FilterResult" type?
Meta via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue Sep 8 12:23:13 PDT 2015
On Tuesday, 8 September 2015 at 11:08:59 UTC, Bahman Movaqar
wrote:
> However, I have made this a strict practice of mine to specify
> the full signature of my public API. I suppose, if I want to
> be pedantic, I have to realise the lazy value first and pass
> the resulting array out. Is this correct?
If you _really_ want to specify the return type, you can import
std.range.interfaces[1] and use the appropriate return type
(e.g., InputRange!int, RandomAccessFinite!char, etc.) and then
append a `.inputRangeObject` to the end of your range chain.
Ex:
import std.algorithm;
import std.range;
InputRange!int doRangeyThings(R)(R r)
if (isInputRange!R)
{
return r.filter!(x => !(x & 1))
.map!(x => x * 2)
.inputRangeObject;
}
void main()
{
auto n = [1, 2, 3, 4];
auto m = n.doRangeyThings();
assert(is(typeof(m) == InputRange!int));
assert(m.equal([4, 8]));
}
You should use this sparingly, however. The types in
std.range.interfaces are interfaces that allow you to combine
ranges with runtime polymorphism, and you have to pay the
corresponding price for that, namely, you'll be hitting the GC
and the virtual functions entail a speed hit.
1. http://dlang.org/phobos/std_range_interfaces.html
More information about the Digitalmars-d-learn
mailing list