d7594f92420584a1856318b5be87b9d42870048d
[jalview.git] / src / jalview / datamodel / VisibleContigsIterator.java
1 package jalview.datamodel;
2
3 import java.util.ArrayList;
4 import java.util.Iterator;
5 import java.util.List;
6
7 /**
8  * An iterator which iterates over visible regions in a range.
9  */
10 public class VisibleContigsIterator implements Iterator<int[]>
11 {
12   private List<int[]> vcontigs = new ArrayList<>();
13
14   private int currentPosition = 0;
15
16   VisibleContigsIterator(int start, int end,
17           List<int[]> hiddenColumns)
18   {
19     if (hiddenColumns != null && hiddenColumns.size() > 0)
20     {
21       int vstart = start;
22       int hideStart;
23       int hideEnd;
24
25       for (int[] region : hiddenColumns)
26       {
27         hideStart = region[0];
28         hideEnd = region[1];
29
30         // navigate to start
31         if (hideEnd < vstart)
32         {
33           continue;
34         }
35         if (hideStart > vstart)
36         {
37           int[] contig = new int[] { vstart, hideStart - 1 };
38           vcontigs.add(contig);
39         }
40         vstart = hideEnd + 1;
41
42         // exit if we're past the end
43         if (vstart >= end)
44         {
45           break;
46         }
47       }
48
49       if (vstart < end)
50       {
51         int[] contig = new int[] { vstart, end - 1 };
52         vcontigs.add(contig);
53       }
54     }
55     else
56     {
57       int[] contig = new int[] { start, end - 1 };
58       vcontigs.add(contig);
59     }
60   }
61
62   @Override
63   public boolean hasNext()
64   {
65     return (currentPosition < vcontigs.size());
66   }
67
68   @Override
69   public int[] next()
70   {
71     int[] result = vcontigs.get(currentPosition);
72     currentPosition++;
73     return result;
74   }
75 }
76