== Quote from Andrei Alexandrescu ([email protected])'s article > > As a general rule, when they could return either the left or the right > subrange of a range, functions in std.algorithm return the right range. > This is because sentinel-terminated ranges cannot express the > left-hand-side range.
Gotcha. That's unfortunate, but makes perfect sense. > Partition is in fact the perfect example because it works with forward > ranges. If you want to partition a singly-linked list, you'd have to > return the right-hand sublist. There's nothing else you could possibly > return! If you wanted to return the left-hand sublist, you'd have to > return a different type of range (something like "list up to this node"). > So for generality's sake, whenever you have a choice, return the > right-hand part of a range. It looks like there may be another bug in partition then. The static else clause (ss == SwapStrategy.unstable) is supposed to work for forward ranges but it calls popBack(). It looks like only the semistable option is actually available to forward ranges. Is this correct? > There is growing interest in defining additional ranges that express (at > a cost) things like "the portion of a singly-linked list starting at > node X and ending at node Y". For example, people want to do a find() > and then deal with the portion _before_ the found element. I'd love to > discuss that further, but I guess I'll have to wait for the d.next > newsgroup. :oD Yeah, it would be great if it were possible to slice and dice a range in any manner of different ways.
