// Path: src/main/java/moulder/moulds/helpers/JsoupHelper.java
// public static Element copy(Element e) {
//     Element res = new Element(Tag.valueOf(e.tagName()), e.baseUri());
//     for (Attribute a: e.attributes()) {
//         res.attr(a.getKey(), a.getValue());
//     }
//     res.html(e.html());
//     return res;
// }
// 
// Path: src/main/java/moulder/moulds/helpers/MouldersApplier.java
// public static Collection<Node> applyMoulders(Collection<Moulder> moulders, Collection<Node> nodes) {
//     if(moulders.isEmpty()) {
//         return nodes;
//     } else {
//         Collection<Node> workingSet = new ArrayList<Node>(nodes);
//         for(Moulder moulder: moulders) {
//             workingSet = applyMoulder(moulder, workingSet);
//         }
//         return workingSet;
//     }
// }
// 
// Path: src/main/java/moulder/Moulder.java
// public interface Moulder {
//     /**
//      * This is where a moulder can process the input element to generate its
//      * result.
//      *
//      * @param element the element and its associated data to process
//      * @return the list of nodes and their associated data that were generated
//      *         after processing the input element.
//      */
//     List<Node> process(Element element);
// }
// 
// Path: src/main/java/moulder/values/SeqValue.java
// public class SeqValue<T> implements Value<T> {
//     private Iterator<T> values;
// 
//     public SeqValue(Iterator<T> values) {
//         super();
//         this.values = values;
//     }
// 
//     public SeqValue(Iterable<T> values) {
//         this.values = values.iterator();
//     }
// 
//     public SeqValue(T... values) {
//         this.values = Arrays.asList(values).iterator();
//     }
// 
//     public T get() {
//         return values.hasNext() ? values.next() : null;
//     }
// 
//     public SeqValue<T> cycle() {
//         return new SeqValue<T>(new CyclingIterator<T>(values));
//     }
// 
//     private static final class CyclingIterator<S> implements Iterator<S> {
//         private Iterator<S> it;
//         private final boolean itHasValues;
//         private final List<S> values = new ArrayList<S>();
//         private boolean cycled = false;
// 
//         public CyclingIterator(Iterator<S> it) {
//             this.it = it;
//             itHasValues = it.hasNext();
//         }
// 
//         public boolean hasNext() {
//             return itHasValues;
//         }
// 
//         public S next() {
//             if (!itHasValues) {
//                 throw new NoSuchElementException();
//             }
//             if (it.hasNext()) {
//                 S res = it.next();
//                 if (!cycled) {
//                     values.add(res);
//                 }
//                 return res;
//             } else {
//                 cycled = true;
//                 it = values.iterator();
//                 return next();
//             }
//         }
// 
//         public void remove() {
// 
//         }
// 
//     }
// 
//     public SeqValue<T> repeatLast() {
//         return new SeqValue<T>(new RepeatLastIterator<T>(values));
//     }
// 
//     private static final class RepeatLastIterator<S> implements Iterator<S> {
//         private Iterator<S> it;
//         private final boolean itHasValues;
//         private S last;
// 
//         public RepeatLastIterator(Iterator<S> it) {
//             this.it = it;
//             itHasValues = it.hasNext();
//         }
// 
//         public boolean hasNext() {
//             return itHasValues;
//         }
// 
//         public S next() {
//             if (!itHasValues) {
//                 throw new NoSuchElementException();
//             }
//             if (it.hasNext()) {
//                 last = it.next();
//             }
//             return last;
//         }
// 
//         public void remove() {
// 
//         }
// 
//     }
// }
// 
// Path: src/main/java/moulder/values/SimpleBox.java
// public class SimpleBox<T> implements Value<T> {
// 
//     private T value;
// 
//     public SimpleBox() {
//         this.value = null;
//     }
// 
//     public SimpleBox(T value) {
//         this.value = value;
//     }
// 
//     public void set(T value) {
//         this.value = value;
//     }
// 
//     public T get() {
//         return value;
//     }
// }


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;
package moulder.moulds;





/**
 * 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);
// Path: src/main/java/moulder/moulds/helpers/JsoupHelper.java
// public static Element copy(Element e) {
//     Element res = new Element(Tag.valueOf(e.tagName()), e.baseUri());
//     for (Attribute a: e.attributes()) {
//         res.attr(a.getKey(), a.getValue());
//     }
//     res.html(e.html());
//     return res;
// }
// 
// Path: src/main/java/moulder/moulds/helpers/MouldersApplier.java
// public static Collection<Node> applyMoulders(Collection<Moulder> moulders, Collection<Node> nodes) {
//     if(moulders.isEmpty()) {
//         return nodes;
//     } else {
//         Collection<Node> workingSet = new ArrayList<Node>(nodes);
//         for(Moulder moulder: moulders) {
//             workingSet = applyMoulder(moulder, workingSet);
//         }
//         return workingSet;
//     }
// }
// 
// Path: src/main/java/moulder/Moulder.java
// public interface Moulder {
//     /**
//      * This is where a moulder can process the input element to generate its
//      * result.
//      *
//      * @param element the element and its associated data to process
//      * @return the list of nodes and their associated data that were generated
//      *         after processing the input element.
//      */
//     List<Node> process(Element element);
// }
// 
// Path: src/main/java/moulder/values/SeqValue.java
// public class SeqValue<T> implements Value<T> {
//     private Iterator<T> values;
// 
//     public SeqValue(Iterator<T> values) {
//         super();
//         this.values = values;
//     }
// 
//     public SeqValue(Iterable<T> values) {
//         this.values = values.iterator();
//     }
// 
//     public SeqValue(T... values) {
//         this.values = Arrays.asList(values).iterator();
//     }
// 
//     public T get() {
//         return values.hasNext() ? values.next() : null;
//     }
// 
//     public SeqValue<T> cycle() {
//         return new SeqValue<T>(new CyclingIterator<T>(values));
//     }
// 
//     private static final class CyclingIterator<S> implements Iterator<S> {
//         private Iterator<S> it;
//         private final boolean itHasValues;
//         private final List<S> values = new ArrayList<S>();
//         private boolean cycled = false;
// 
//         public CyclingIterator(Iterator<S> it) {
//             this.it = it;
//             itHasValues = it.hasNext();
//         }
// 
//         public boolean hasNext() {
//             return itHasValues;
//         }
// 
//         public S next() {
//             if (!itHasValues) {
//                 throw new NoSuchElementException();
//             }
//             if (it.hasNext()) {
//                 S res = it.next();
//                 if (!cycled) {
//                     values.add(res);
//                 }
//                 return res;
//             } else {
//                 cycled = true;
//                 it = values.iterator();
//                 return next();
//             }
//         }
// 
//         public void remove() {
// 
//         }
// 
//     }
// 
//     public SeqValue<T> repeatLast() {
//         return new SeqValue<T>(new RepeatLastIterator<T>(values));
//     }
// 
//     private static final class RepeatLastIterator<S> implements Iterator<S> {
//         private Iterator<S> it;
//         private final boolean itHasValues;
//         private S last;
// 
//         public RepeatLastIterator(Iterator<S> it) {
//             this.it = it;
//             itHasValues = it.hasNext();
//         }
// 
//         public boolean hasNext() {
//             return itHasValues;
//         }
// 
//         public S next() {
//             if (!itHasValues) {
//                 throw new NoSuchElementException();
//             }
//             if (it.hasNext()) {
//                 last = it.next();
//             }
//             return last;
//         }
// 
//         public void remove() {
// 
//         }
// 
//     }
// }
// 
// Path: src/main/java/moulder/values/SimpleBox.java
// public class SimpleBox<T> implements Value<T> {
// 
//     private T value;
// 
//     public SimpleBox() {
//         this.value = null;
//     }
// 
//     public SimpleBox(T value) {
//         this.value = value;
//     }
// 
//     public void set(T value) {
//         this.value = value;
//     }
// 
//     public T get() {
//         return value;
//     }
// }


// Path: src/main/java/moulder/moulds/ForEach.java
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;

package moulder.moulds;





/**
 * 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))));