package org.seqcode.gsebricks.verbs.location;
import java.util.*;
import org.seqcode.genome.location.Region;
public class OverlappingRegionCombiner implements Iterator<Region> {
private Iterator<Region> iter;
public OverlappingRegionCombiner(Collection<? extends Region> rgs, int dummy) {
Vector<Region> regions = new Vector<Region>();
for(Region r : rgs) {
boolean foundOverlap = false;
for(int i = 0; i < regions.size(); i++) {
if(r.overlaps(regions.get(i))) {
int start = Math.min(r.getStart(), regions.get(i).getStart());
int end = Math.max(r.getEnd(), regions.get(i).getEnd());
regions.set(i, new Region(r.getGenome(), r.getChrom(), start, end));
foundOverlap = true;
break;
}
}
if(!foundOverlap) {
regions.add(r);
}
}
iter = regions.iterator();
}
public OverlappingRegionCombiner(Collection<Iterator<? extends Region>> collection) {
ArrayList<Region> regions = new ArrayList<Region>();
for (Iterator<? extends Region> iter : collection) {
while (iter.hasNext()) {
Region r = iter.next();
boolean found = false;
for (int i = 0; i < regions.size(); i++) {
if (r.overlaps(regions.get(i))) {
regions.set(i,r.combine(regions.get(i)));
found = true;
break;
}
}
if (!found) {
regions.add(r);
}
}
}
iter = regions.iterator();
}
public boolean hasNext() {
return iter.hasNext();
}
public Region next() {
return iter.next();
}
public void remove() {
throw new UnsupportedOperationException();
}
}