package net.varkhan.base.functor.expander;
import net.varkhan.base.functor.Expander;
import net.varkhan.base.functor.Mapper;
import java.util.Iterator;
/**
* <b></b>.
* <p/>
*
* @author varkhan
* @date 2/11/12
* @time 3:21 PM
*/
public class ComposedExpander<R,A,C> implements Expander<R,A,C> {
protected final Mapper<R,Object,C> mapr;
protected final Expander<Object,A,C> expr;
@SuppressWarnings({ "unchecked" })
public <U> ComposedExpander(Mapper<R,U,C> mapr, Expander<U,A,C> expr) {
this.expr=(Expander<Object,A,C>) expr;
this.mapr=(Mapper<R,Object,C>) mapr;
}
public Mapper<R,?,C> left() { return mapr; }
public Expander<?,A,C> right() { return expr; }
public Iterable<R> invoke(final A arg, final C ctx) {
return new Iterable<R>() {
@Override
public Iterator<R> iterator() {
final Iterator<Object> it = expr.invoke(arg, ctx).iterator();
return new Iterator<R>() {
@Override
public boolean hasNext() { return it.hasNext(); }
@Override
public R next() { return mapr.invoke(it.next(),ctx); }
@Override
public void remove() { }
};
}
};
}
@Override
public String toString() {
String rs = right().toString();
String ls = left().toString();
if("$".equals(rs)) return ls;
if("$".equals(ls)) return rs;
StringBuilder buf = new StringBuilder();
int p1 = 0, p2;
while(p1<ls.length() && (p2=ls.indexOf('$',p1))>=0) {
buf.append(ls.substring(p1,p2)).append(rs);
p1 = p2+1;
}
buf.append(ls.substring(p1,ls.length()));
return buf.toString();
}
}