On Tuesday, 26 August 2025 at 20:04:36 UTC, monkyyy wrote:
does anyone how a concept for insideout iterating

I have this:
```d
struct cursor(T){
    T[] data; alias data this;
    int index;
    ref opIndex(int i){
        return data[min($-1,max(0,i+index))];
    }
    auto forward(){
        struct range{
            T[] data;
            int index;
            ref T front()=>data[0];
            void popFront(){
                data=data[1..$];
                index++;
            }
            bool empty()=>data.length==0;
        }
        return range(data[index..$],0);
    }
    auto back(){
        struct range{
            T[] data;
            int index;
            ref T front()=>data[$-1];
            void popFront(){
                data=data[0..$-1];
                index--;
            }
            bool empty()=>data.length==0;
        }
        return range(data[0..index],-1);
    }
    auto forwardthenback()=>chain(forward,back);
}
```
and Im using [index-sign(index)] to access the reliant other member surely theres a better way

---
```d
foreach(ref me,ref other;[1,2,3,4,5].???(2)){
  writeln(me,','other);
}
```

```
3,3
4,3
5,4
2,3
1,2
```
(reminder tuples and refness dont actaully work, and im modifying the center out)

```d
#!opend -unittest -main -run app.d
import std;
auto insideout(R,I)(R r,I i){
        struct foreach_{
                R r;
                I i;
                alias E=typeof(r[i]);
                int opApply(int delegate(ref E a,ref E b) dg){
                        int result=dg(r[i],r[i]);
                        I j=i+1;
                        if(result>1) {goto exit;}
                        while(j<r.length){
                                result=dg(r[j],r[j-1]);
                                if(result){
                                        if(result==1){break;}
                                        goto exit;
                                }
                                j++;
                        }
                        j=i-1;
                        while(j>=0){
                                result=dg(r[j],r[j+1]);
                                if(result){
                                        break;
                                }
                                j--;
                        }
                        exit:return result;
                }
        }
        return foreach_(r,i);
}

unittest{
        lable: foreach(ref me,ref other;[1,2,3,4,5,6,7,8].insideout(2)){
                writeln(me,',',other);
                if(me==5){break;}
        }
        "end".writeln;
}
```

Reply via email to