package jalview.datamodel; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * An iterator which iterates over visible regions in a range. Provides a * special "endsAtHidden" indicator to allow callers to determine if the final * visible column is adjacent to a hidden region. */ public class VisibleContigsIterator implements Iterator { private List vcontigs = new ArrayList<>(); private int currentPosition = 0; private boolean endsAtHidden = false; VisibleContigsIterator(int start, int end, List hiddenColumns) { if (hiddenColumns != null && hiddenColumns.size() > 0) { int vstart = start; int hideStart; int hideEnd; for (int[] region : hiddenColumns) { endsAtHidden = false; hideStart = region[0]; hideEnd = region[1]; // navigate to start if (hideEnd < vstart) { continue; } if (hideStart > vstart) { if (end - 1 > hideStart - 1) { int[] contig = new int[] { vstart, hideStart - 1 }; vcontigs.add(contig); endsAtHidden = true; } else { int[] contig = new int[] { vstart, end - 1 }; vcontigs.add(contig); } } vstart = hideEnd + 1; // exit if we're past the end if (vstart >= end) { break; } } if (vstart < end) { int[] contig = new int[] { vstart, end - 1 }; vcontigs.add(contig); endsAtHidden = false; } } else { int[] contig = new int[] { start, end - 1 }; vcontigs.add(contig); } } @Override public boolean hasNext() { return (currentPosition < vcontigs.size()); } @Override public int[] next() { int[] result = vcontigs.get(currentPosition); currentPosition++; return result; } public boolean endsAtHidden() { return endsAtHidden; } }