On Wed, 16 Feb 2011 12:37:04 -0500, Andrej Mitrovic
<andrej.mitrov...@gmail.com> wrote:
Quick fix:
import std.stdio;
import std.range;
import std.array;
auto findBack(alias pred = "a == b", R, E)(R haystack, E needle)
if (isBidirectionalRange!R)
{
R result;
size_t index;
auto reversed = retro(haystack);
bool found;
foreach (item; reversed)
{
index++;
if (item == needle)
{
found = true;
break;
}
}
if (found)
{
while (index)
{
result ~= reversed.front;
reversed.popFront;
index--;
}
}
return retro(result);
}
void main()
{
auto orig = [5, 1, 2, 3, 4, 5, 1];
auto result = findBack(orig, 4);
assert(array(result) == [4, 5, 1]);
}
Your code has a rather large design flaw. It does not return a subrange
to the original, it returns a new range. That's not in the charter of
find, find must return a portion of the original. Not to mention it
assumes R can be appended to.
For example, if I want to find the last 5 and change it to 6, I could do:
find(retro(r)).front = 6;
In your code, findBack(r).front = 6 does nothing.
-Steve