On Monday 14 February 2011 19:35:21 Andrej Mitrovic wrote: > import std.stdio, std.algorithm, std.range; > > void main() > { > writeln( find([5, 1, 2, 3, 4, 5, 1], 5) ); > writeln( find(retro([5, 1, 2, 3, 4, 5, 1]), 5) ); > } > > Output: > [5, 1, 2, 3, 4, 5, 1] > [5, 4, 3, 2, 1, 5] > > The docs for find are: > "returns : haystack advanced such that binaryFun!pred(haystack.front, > needle) is true " "To find the last occurence of needle in haystack, call > find(retro(haystack), needle). " > > To me, if I was looking for the last element in a range I would expect to > get a range with the found element followed by an elements after it. > Obviously retro reverses the range (it just hard-wires front=back, > back=front for those not in the know), so this code is correct. > > Still, I would expect that finding a last element in this range: > [5, 1, 2, 3, 4, 5, 1] > > would return the range: > [5, 1] > > and not: > [5, 4, 3, 2, 1, 5] > > Isn't that what most people would want when they're looking for the last > matching element?
retro revereses the whole range. What you want is something like findFromBack. Of course, retro isn't going to be what you want (though I guess I can understand why you would think that it would work if you didn't think it through). I don't think that we have any functions like findFromBack though. It's probably worth an enhancement request. - Jonathan M Davis