| // @dart = 2.9 |
| |
| part of swarmlib; |
| |
| /** |
| * An iterator that allows the user to move forward and backward though |
| * a set of items. (Bi-directional) |
| */ |
| class BiIterator<E> { |
| /** |
| * Provides forward and backward iterator functionality to keep track |
| * which item is currently selected. |
| */ |
| ObservableValue<int> currentIndex; |
| |
| /** |
| * The collection of items we will be iterating through. |
| */ |
| List<E> list; |
| |
| BiIterator(this.list, [List<ChangeListener> oldListeners = null]) |
| : currentIndex = new ObservableValue<int>(0) { |
| if (oldListeners != null) { |
| currentIndex.listeners = oldListeners; |
| } |
| } |
| |
| /** |
| * Returns the next section from the sections, given the current |
| * position. Returns the last source if there is no next section. |
| */ |
| E next() { |
| if (currentIndex.value < list.length - 1) { |
| currentIndex.value += 1; |
| } |
| return list[currentIndex.value]; |
| } |
| |
| /** |
| * Returns the current Section (page in the UI) that the user is |
| * looking at. |
| */ |
| E get current { |
| return list[currentIndex.value]; |
| } |
| |
| /** |
| * Returns the previous section from the sections, given the current |
| * position. Returns the front section if we are already at the front of |
| * the list. |
| */ |
| E previous() { |
| if (currentIndex.value > 0) { |
| currentIndex.value -= 1; |
| } |
| return list[currentIndex.value]; |
| } |
| |
| /** |
| * Move the iterator pointer over so that it points to a given list item. |
| */ |
| void jumpToValue(E val) { |
| for (int i = 0; i < list.length; i++) { |
| if (identical(list[i], val)) { |
| currentIndex.value = i; |
| break; |
| } |
| } |
| } |
| } |