[BREAKING CHANGE] redesign of aggregator interface


#1

the functions hl.agg.filter and hl.agg.explode have been changed. They now look like:

hl.agg.filter(condition, hl.agg.collect(agg_expr))
hl.agg.explode(lambda elt: hl.agg.collect(elt), agg_array)

They can be combined arbitrarily with each other and with hl.agg.group_by, but must always an aggregation. For example:

hl.agg.filter(t.idx > 7, 
              hl.agg.explode(
                  lambda i: hl.agg.group_by(t.group, 
                                            hl.agg.collect(t.x)),
                  t.ys))

would take the rows of the table for which t.idx > 7, and then explode them along the contents of the array t.ys, and finally group the filtered, exploded contents by the key t.group and collect the value of t.x for each group.

Also, hl.agg.count() now takes no arguments. hl.agg.count(hl.agg.filter(cond, expr)) in the new syntax becomes hl.agg.filter(cond, hl.agg.count()), so agg.count never needs any arguments.