[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