On Sunday, 19 May 2019 at 22:20:48 UTC, Josh wrote:
Thank you, that helps big time.

This is just more curiosity, but do you happen to know why I have to use DList.linearRemove() instead of DList.remove()?

import std.stdio;
import std.container.dlist;
import std.algorithm;
import std.range;

void main()
{
    auto list = make!DList("the", "quick", "brown", "fox");
    auto range = list[].find("quick").take(1);
    list.remove(range);
    list[].each!writeln; // the brown fox
}

This results in a compiler issue:

onlineapp.d(10): Error: function std.container.dlist.Container!string.DList.remove(Range r) is not callable using argument types (Take!(Range)) onlineapp.d(10): cannot pass argument range of type Take!(Range) to parameter Range r

Changing "remove" to "linearRemove" fixes it, but both the remove and linearRemove functions take a Range object, and linearRemove seems to just be a pass through to remove.

The documentation for DList.remove says that the range parameter "must be originally obtained from this container." A range returned from `take` doesn't qualify, since `take` returns a new range that wraps the original one. (`find` seems to be the exception rather than the rule, here, in that it actually returns the same type of range that's given to it.) However, the 2nd overload of linearRemove [1] is specifically written to accept a Take!Range, so it will work.

Fortunately, it is possible to accomplish what you want using DList.popFirstOf: [2]

    auto range = list[].find("quick");
    list.popFirstOf(range);

Full example: https://run.dlang.io/is/DCYtbp

[1] https://dlang.org/phobos/std_container_dlist.html#.DList.linearRemove.2 [2] https://dlang.org/phobos/std_container_dlist.html#.DList.popFirstOf

Reply via email to