Good intuitive list patterns

monkyyy crazymonkyyy at gmail.com
Sat Feb 21 09:25:20 UTC 2026


```d
#!opend test app
import std;

struct intutisive(alias Array,discrim...){
	static Array array; alias array this;
	//this(){
	//	array~=typeof(array[0]);
	//}
	auto opIndex(I)(I i){
		static struct handle{
			I i;
			ref get()=>array[i]; alias get this;
			string toString()=>get.to!string;
			auto children(){
				static struct kidhandle{
					I i;
					ref front()=>array[i];
					void popFront(){i=front.sib;}
					bool empty()=>i==0;
					//void opOpAssign(string op:"~")(handle a){//I dont think 
this works without a parent pointer
					//	a.sib=front.sib;
					//	front.sib=a.i;
					//}
				}
				return kidhandle(get.kid);
			}
			void addchild(handle a){
				a.sib=get.kid;
				get.kid=cast(typeof(get.kid))a.i;
			}
		}
		return handle(i);
	}
	auto length()=>array.length-1;
	auto opSlice()=>iota(1,array.length).map!(i=>opIndex(i));
}

struct data{
	string name;
	ubyte kid;
	ubyte sib;
}
intutisive!(data[]) foo;

unittest{
	foo~=data("");
	foo~=data("hi");
	assert(foo[1].children.empty);
	foo~=data("bye");
	foo[1].kid=2;
	assert(foo[1].children.front.name=="bye");
	foo[].writeln;
	//---
	foo~=data("cow");
	foo~=data("moo");
	foo[].filter!(a=>a.name=="cow").front.addchild( 
foo[].filter!(a=>a.name=="moo").front );
	foo[].writeln;
}
```

https://www.youtube.com/watch?v=ShSGHb65f3M

I feel like im missing something. Maybe it cant fit cleanly into 
ranges but idk.


More information about the Digitalmars-d-learn mailing list