package org.seqcode.gsebricks.verbs.location;
import java.util.Iterator;
import java.util.Set;
import java.util.HashSet;
import java.util.Collections;
import java.util.ArrayList;
import org.seqcode.genome.location.Gene;
import org.seqcode.genome.location.Region;
import org.seqcode.gsebricks.verbs.Expander;
/**
* RefGeneUnion queries a set of RefGeneGenerators and presents the
* combined results. Use this when you want a single generator but
* want to pull genes from several sets of annotations.
*/
public class RefGeneUnion<X extends Region> implements Expander<X,Gene> {
private Set<RefGeneGenerator<X>> generators;
public RefGeneUnion() {
generators = new HashSet<RefGeneGenerator<X>>();
}
public void addGenerator(RefGeneGenerator<X> gen) {
generators.add(gen);
}
public Iterator<Gene> execute (X region) {
ArrayList<Gene> output = new ArrayList<Gene>();
for (RefGeneGenerator<X> gen : generators) {
Iterator<Gene> iter = gen.execute(region);
while (iter.hasNext()) {
output.add(iter.next());
}
}
Collections.sort(output);
return output.iterator();
}
}