On Friday, 23 January 2015 at 22:20:19 UTC, H. S. Teoh wrote:
It's kind of a misnomer, because it actually only considers *consecutive runs* of equivalent elements; it doesn't look at the whole range before deciding what goes in which group. So technically it should be called consecutiveGroupBy or consecutivePartitionBy, but that's too big a
mouthful to be a usable name.

What you describe could be an interesting candidate to add, though. It could iterate over distinct values of the predicate, and traverse the forward range (input ranges obviously can't work unless you allocate, which makes it no longer lazy) each time. This, however, has O(n*k) complexity where k is the number of distinct predicate values. If it's anything bigger than bool or a relatively small enum, it would be impractical. Moreover, the requirement to traverse the range multiple times kinda sux; you might as well just call filter() with different expected values yourself, in a loop. In fact, you could ostensibly
implement it something along these lines:

        auto globalPartition(alias pred, R)(R range) {
                alias Values = typeof(pred(range.front, range.front));

                return iota(Values.min, Values.max)
                        .map!(v => range.save.filter!(pred(e) == v));
        }
...

Alright and thanks for the whole explanation.

Matheus.

Reply via email to