/*
Copyright (c) 1999-2009 Ariba, Inc.
All rights reserved. Patents pending.
$Id: //ariba/platform/util/core/ariba/util/core/Aggregator.java#2 $
Responsible: dfinlay
*/
package ariba.util.core;
import java.util.List;
/**
@aribaapi ariba
*/
public abstract class Aggregator<W, V>
{
public abstract W aggregate (W aggregate, V value);
public boolean mutatesAggregate ()
{
return false;
}
public static final Aggregator<Number,Number> Summer = new Aggregator<Number, Number>()
{
public Number aggregate (Number aggregate, Number value)
{
if (aggregate == null) {
return value;
}
return ArithmeticUtil.add(aggregate, value);
}
};
public static final Aggregator<Integer,Object> Count = new Aggregator<Integer, Object>()
{
public Integer aggregate (Integer aggregate, Object value)
{
if (aggregate == null) {
return 1;
}
return aggregate + 1;
}
};
public static class Collector<X> extends Aggregator<List<X>,X>
{
public List<X> aggregate (List<X> aggregate, X value)
{
if (aggregate == null) {
return ListUtil.list(value);
}
aggregate.add(value);
return aggregate;
}
public boolean mutatesAggregate ()
{
return false;
}
}
private static final Collector COLLECTOR = new Collector();
public static final <X> Collector<X> collector ()
{
return Aggregator.COLLECTOR;
}
}