[WORK] groupBy is in! Next: aggregate
H. S. Teoh via Digitalmars-d
digitalmars-d at puremagic.com
Fri Jan 23 10:34:17 PST 2015
On Fri, Jan 23, 2015 at 10:29:13AM -0800, H. S. Teoh via Digitalmars-d wrote:
> On Fri, Jan 23, 2015 at 10:08:30AM -0800, Andrei Alexandrescu via Digitalmars-d wrote:
[...]
> > 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.
[...]
Here's a working variadic implementation:
import std.algorithm.comparison : max, min;
import std.algorithm.iteration;
import std.stdio;
template aggregate(funcs...) {
auto aggregate(RoR)(RoR ror) {
return ror.map!(reduce!funcs);
}
}
void main() {
[293, 453, 600, 929, 339, 812, 222, 680, 529, 768]
.groupBy!(a => a & 1)
.aggregate!(max,min)
.writeln;
}
Output (kinda ugly, but it works):
[Tuple!(int, int)(453, 293), Tuple!(int, int)(600, 600), Tuple!(int, int)(929, 339), Tuple!(int, int)(812, 222), Tuple!(int, int)(529, 529), Tuple!(int, int)(768, 768)]
Of course, it will require a little more polish before merging into
Phobos, but the core implementation is nowhere near the complexity of
groupBy.
T
--
The best compiler is between your ears. -- Michael Abrash
More information about the Digitalmars-d
mailing list