On 05/13/2015 07:47 PM, rcorre wrote:
I've run into this situation a lot:
I have a function that returns a range (in this case, a slice of a
custom container).
In some cases, the function needs to return an empty range.

It sounded like takeNone was what I wanted:

@nogc auto fun() {
    return (some_condition) ? getRange() : getRange.takeNone;
}

but there is a return type ambiguity. I finally ended up doing this:

@nogc auto fun() {
    return (some_condition) ? getRange().take(size_t.max) :
getRange.takeNone;
}

I'm not sure if this is clever or insane.
It works, but just looks a bit crazy to me.
Does anyone else run into this situation? Have any cool ways to solve it?
MyRange is an inputRange, and I can't use a wrapper (InputRange) and
keep the @nogc.

I needed the same thing in a code example of this chapter:

  http://ddili.org/ders/d.en/fibers.html

There is this function that returns a range:

auto byNode(const(Node) * node)
{
    return new FiberRange!(const(Node)*)(
        () => nextNode(node));
}

I am lucky because although the returned type is opaque to me, I know that it is constructed by a void lambda. So, I could pass (){} to the constructor to make an empty range:

auto byNode(const(Tree) tree)
{
    alias RangeType = typeof(byNode(tree.root));

    return (tree.root
            ? byNode(tree.root)
            : new RangeType(() {}));    // ← Empty range
}

Ali

Reply via email to