package org.seqcode.gsebricks.verbs.location;
import java.util.*;
import org.seqcode.genome.Genome;
import org.seqcode.genome.location.NamedRegion;
import org.seqcode.genome.location.Region;
import org.seqcode.gsebricks.verbs.CastingMapper;
import org.seqcode.gsebricks.verbs.Expander;
import org.seqcode.gsebricks.verbs.ExpanderIterator;
import org.seqcode.gsebricks.verbs.Mapper;
import org.seqcode.gsebricks.verbs.MapperIterator;
/**
* This encapsulates the little pattern that we always have to write when we want
* to get all of some X in an *entire* genome.
*
* We usually take a Genome, throw it through ChromRegionIterator, (sometimes)
* map those NamedRegions down to Regions, and then concatenate that Iterator
* with the Expander of interest. This just does all that, in its execute method --
* it is an Expander which takes a Genome, and returns "all of the X's" in that
* entire genome.
*
* @author tdanford
*/
public class GenomeExpander<X> implements Expander<Genome,X> {
private Expander<Region,X> expander;
private Mapper<NamedRegion,Region> caster;
public GenomeExpander(Expander<Region,X> exp) {
expander = exp;
caster = new CastingMapper<NamedRegion,Region>();
}
public Iterator<X> execute(Genome a) {
ChromRegionIterator chroms = new ChromRegionIterator(a);
Iterator<Region> rchroms = new MapperIterator<NamedRegion,Region>(caster, chroms);
return new ExpanderIterator<Region,X>(expander, rchroms);
}
}