package moulder.moulds;
import static moulder.moulds.helpers.JsoupHelper.copy;
import static moulder.moulds.helpers.MouldersApplier.applyMoulders;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import moulder.Moulder;
import moulder.values.SeqValue;
import moulder.values.SimpleBox;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
/**
* A moulder, that will repeatedly invoke the body moulders for each item in the
* seq. They can access the current item using the box.
*/
public class ForEach<T> implements Moulder {
private final SimpleBox<T> box;
private final SeqValue<T> seq;
private final List<Moulder> body;
public ForEach(SimpleBox<T> box, SeqValue<T> seq, Moulder... body) {
this(box, seq, Arrays.asList(body));
}
public ForEach(SimpleBox<T> box, SeqValue<T> seq, List<Moulder> body) {
this.box = box;
this.seq = seq;
this.body = body;
}
public List<Node> process(Element element) {
List<Node> res = new ArrayList<Node>();
T o;
while ((o = seq.get()) != null) {
box.set(o);
res.addAll(applyMoulders(body, Arrays.<Node> asList(copy(element))));
}
return res;
}
}