package net.varkhan.base.functor.mapper;
import net.varkhan.base.functor.Mapper;
/**
* <b></b>.
* <p/>
*
* @author varkhan
* @date 2/11/12
* @time 3:06 PM
*/
public abstract class AggregateMapper<R,A,C> implements Mapper<R,A,C> {
protected final Mapper<R,A,C>[] maps;
public AggregateMapper(Mapper<R,A,C>... maps) {
this.maps=maps;
}
@SuppressWarnings("unchecked")
public Mapper<R,A,C>[] components() {
return maps.clone();
}
public abstract R invoke(A arg, C ctx);
protected String toString(String op) {
StringBuilder buf = new StringBuilder(op);
buf.append('(');
boolean f = true;
for(Mapper<R,A,C> m: maps) {
if(f) f = false;
else buf.append(',');
buf.append(m.toString());
}
buf.append(')');
return buf.toString();
}
@Override
public String toString() {
return toString(this.getClass().getSimpleName());
}
}