4 days ago

still want this: https://forum.dlang.org/thread/lmvyzfatklcvrijcyhgk@forum.dlang.org

I dont think it will magicly appear in a few hours but maybe someone wants to write the templated opApply code

some active code:

auto takewhilecmp(string op="<",R,T)(R r,ref T senti){
	struct range{
		R r;
		T* senti;
		auto front()=>r.front;
		void popFront()=>r.popFront;
		bool empty()=>mixin(" ! (r.front"~op~"*senti)") || r.empty;
	}
	return range(r,&senti);
}
unittest{
	int i=100;
	foreach(e;iota(0,1000).takewhilecmp(i)){
		i-=e;
		//e.writeln;
	}
}
ref T reintupitive(T,S)(ref S t)=>*cast(T*)&t;
auto indexs(T)(ref T[] r){
	struct slicesimple{
		ulong length;
		T* data;
	}
	return iota(0,int.max).takewhilecmp!"<"(r.reintupitive!(slicesimple).length);
}
unittest{
	int[] foo=[1,2,5,7];
	foreach(i;foo.indexs){
		if(foo[i]%2){
			foo~=foo[i]*2;
		}
		if(i==3){
			foo~=25;
	}}
	//foo.writeln;
}

void printarray(A)(A a){
	foreach(i;a.indexs){
		writeln(i,":",a[i]);
}}
auto indexs(T,S)(ref T[S] a)=>a.byKey;
auto indexs(T,int N)(ref T[N] a)=>iota(0,N);
//unittest{
//	printarray([1,2,5,7]);
//	printarray([1:"foo",2:"bar"]);
//	int[5] foo=[1,2,3,4,5];
//	printarray(foo);
//}
auto iteratebyindex(A)(ref A a){
	alias R=typeof(a.indexs);
	struct range{
		A* a;
		R r;
		auto ref front()=>(*a)[r.front];
		auto ref index()=>r.front;
		void popFront()=>r.popFront;
		bool empty()=>r.empty;
	}
	return range(&a,a.indexs);
}
auto iteratebyindex(A,R)(ref A a,R r){
	struct range{
		A* a;
		R r;
		auto ref front()=>(*a)[r.front];
		auto ref index()=>r.front;
		void popFront()=>r.popFront;
		bool empty()=>r.empty;
	}
	return range(&a,r);
}
unittest{
	int[] foo=[1,2,5,7];
	foreach(e;foo.iteratebyindex){
		if(e%2){
			foo~=e*2;
		}
	}
	//foo.writeln;
}

I will want an foreach with access to an index generated by iteratebyindex after a split(which is one of the functions that breaks countUntil, also see filter and unicode handling)