Hello, I'm trying to write a function called "pull" that, given 2 ranges, "pull"s the values from range 2 out of range 1. I'm not sure if I'm doing it correctly though, and I have some questions so any help is appreciated. This is what I have:

ref pull(R1, R2)(return ref R1 r1, R2 r2) {
    import std.algorithm, std.array, std.range;
    int numFound = 0;
    auto r = r1.save;
    ElementType!R1[] unfoundElements;
    foreach (e; r) {
        if (!r2.canFind(e)) {
            unfoundElements ~= e;
        } else {
            numFound++;
        }
    }
    moveEmplaceAll(unfoundElements, r1);
    r1.popBackN(numFound);
    return r1;
}

So my questions are:

1) So first of all, is there a function like this in phobos that I can use? From what I understand phobos is supposed to be nogc so mutating functions like these are usually in place ones?

2) Is there a way to avoid the extra "moveEmplaceAll" call towards the end and still get the same results?

3) Is it necessary to always import std.array (or std.range: empty, front) when doing work like this with range algorithms? (otherwise you get no property save when an array is used as a range)

4) is the .save necessary? My (initial) tests seem to show that it works without, but from my understanding of what save does, it feels like it's necessary.

5) return ref and -dip25 ... is that something that's going to become default at some time? Is there a timeline? (also curious about dip1000 for that matter).

6) It will not work when I pass in a range that has const elements.

ie:

const(int)[] arr = [1, 2, 3, 4, 5];
arr.pull([2, 3]);

This I guess makes sense because moveEmplaceAll depends on isInputRange and from my understanding, a const range cannot be one (is that correct?). So am I correct in thinking there really is no way around this, or is there some move/cast trickery that I can use maybe?

Cheers,
- Ali

Reply via email to