On Tuesday, 3 June 2025 at 16:03:15 UTC, Andy Valencia wrote:
I have a Set data structure which has no concept of order; its members are stored and can be searched efficiently based on their hash.

I have a situation where chain()'ing them together would be convenient, but InputRange requires front() and popFront(). There really _isn't_ a front, and creating a new Set with an element removed would be unpleasant.

What would be the best way to iterate across a list of such Set's? For now I'm just going to write the explicit loop.

Thanks!
Andy

```d
import std;
struct myset{
        bool has3;
        bool has5;
        auto opBinary(string s:"+")(typeof(this) a){
                return myset(has3||a.has3,has5||a.has5);
        }
        alias chain=opBinary!"+";
        int front(){
                if(has3){ return 3;}
                if(has5){ return 5;}
                assert(0);
        }
        void popFront(){
                if(has3){has3=false; return;}
                has5=false;
        }
        bool empty()=>( ! has3) && ( ! has5);
}
myset toset(R)(R r){
        myset o;
        foreach(i;r){
                if(i==3){o.has3=true;}
                if(i==5){o.has5=true;}
        }
        return o;
}
unittest{
        myset a,b;
        a.has3=true;
        b.has5=true;
        (a+b).writeln;
        
        a.chain(a).chain(a).writeln;
        b.chain(b).chain(b).writeln;
        a.chain(b).writeln;
        
        auto c=a+b;
        c.map!(a=>a*2).writeln;
        iota(10).filter!(a=>a==3).toset.chain(
                iota(10).filter!(a=>a!=3).toset)
                .writeln;
}
```

You can overload the names inside the datastructure and eagerly lower it as needed if you need it in something nested I have some more workarounds, but they start to suck.

Reply via email to