In order to my array class work with filter, I went to implement an InputRange
. But I don't quite get how do that and didn't find much help on the docs. From below code, is moveFront()
implemented correctly? I'm using a simple int i as index of current item and in popFront() just increment it. I must reset the i value once the loop is done, right? where am I supposed to do that? opApply()? not properly reseting it result in obvious bugs like subsequent calls doesn't work because the index is in the end of the array:
auto arr = new MyArray!int;
arr.Add(1);
arr.Add(2);
arr.Add(3);
arr.Add(4);
auto r = arr.filter!(n => (n % 2) == 0);
auto r2 = arr.filter!(n => n >= 2);
writeln(r); // ok
writeln(r2); // empty
yeah, i'm a bit confused... here's the code:
class MyArray(T) : InputRange!T
{
private T[] arr;
private int i = 0;
void Add(T item)
{
arr ~= item;
}
void Add(T[] items)
{
foreach(item; items)
{
Add(item);
}
}
size_t length() nothrow
{
return arr.length;
}
bool empty()
{
return i == length;
}
T front()
{
return arr[i];
}
void popFront()
{
i++;
}
T moveFront()
{
auto r = front;
popFront();
return r;
}
int opApply(scope int delegate(ref T) dg)
{
int result = 0;
foreach (item; arr)
{
result = dg(item);
if (result) {
break;
}
}
return result;
}
int opApply(scope int delegate(T) dg)
{
int result = 0;
foreach (item; arr)
{
result = dg(item);
if (result) {
break;
}
}
return result;
}
int opApply(scope int delegate(uint, T) dg)
{
int result = 0;
foreach (j, item; arr)
{
result = dg(j, item);
if (result) {
break;
}
}
return result;
}
}