// @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])
      : currentIndex = 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;
      }
    }
  }
}
