On Fri, Jan 23, 2015 at 10:08:30AM -0800, Andrei Alexandrescu via Digitalmars-d 
wrote:
> So H.S. Teoh awesomely took
> https://github.com/D-Programming-Language/phobos/pull/2878 to
> completion. We now have a working and fast relational "group by"
> facility.

Unfortunately it doesn't work in pure/@safe/nothrow code because of
limitations in the current RefCounted implementation.


[...]
> The next step is to define an aggregate() function, which is a lot
> similar to reduce() but works on ranges of ranges and aggregates a
> function over each group. Continuing the previous example:
> 
>     [293, 453, 600, 929, 339, 812, 222, 680, 529, 768]
>         .groupBy!(a => a & 1)
>         .aggregate!max
>         .writeln;
> 
> should print:
> 
> [453, 600, 929, 812, 529, 768]
> 
> The aggregate function should support aggregating several functions at
> once, e.g. aggregate!(min, max) etc.
> 
> Takers?
[...]

Isn't that just a simple matter of defining aggregate() in terms of
map() and reduce()?  Working example:

        import std.algorithm.comparison : max;
        import std.algorithm.iteration;
        import std.stdio;
        
        auto aggregate(alias func, RoR)(RoR ror) {
                return ror.map!(reduce!func);
        }
        
        void main() {
            [293, 453, 600, 929, 339, 812, 222, 680, 529, 768]
                 .groupBy!(a => a & 1)
                 .aggregate!max
                 .writeln;
        }

Output is as expected.


T

-- 
Verbing weirds language. -- Calvin (& Hobbes)

Reply via email to