On Tuesday, 3 June 2025 at 16:03:15 UTC, Andy Valencia wrote:
I have a situation where chain()'ing them together would be convenient, but InputRange requires front() and popFront().

As an exercise in chaining opApply based containers, I tried:

```d
// Chain across containers; their type is T and what they hold is type B
class Chain(T,B) {
    private T[] members;
    this(T...)(T args) {
        foreach(m; args) {
            this.members ~= *m;
        }
    }
    int
    opApply(int delegate(ref B) ops) const {
        int res = 0;
        foreach(m; this.members) {
            foreach(val; m) {
                res = ops(val);
                if (res) {
                    break;
                }
            }
        }
        return res;
    }
}
```

I'm a little iffy on the walk of the args and the *m deref. But it tests out OK in practice. Using one looks like:

```d
    import tiny.set : Set;
    alias SetInt = Set!int;

    auto s1 = new SetInt();
    s1.add(1);
    s1.add(2);
    s1.add(3);
    auto s2 = new SetInt();
    s2.add(4);
    s2.add(5);
    s2.add(6);
    auto s3 = new SetInt();
    foreach(x; new Chain!(SetInt,int)(s1, s2)) {
        s3.add(x);
    }
```

Andy

Reply via email to