/** A slightly-simplified version of Java's {@link java.util.List} interface.
 *
 * Represents an indexed, growable list of generic objects.
 */
public interface List<T> {
  /** Return the element at the index in the list.
   *
   * If the list currently has k elements, the only valid indices are 0 through
   * k-1, regardless of its capacity; any other index should be an
   * IndexOutOfBoundsException.
   *
   * @param index the index to get
   * @return the value of the element at the index
  **/
  T get(int index) throws IndexOutOfBoundsException;

  /** Set the value of the element at an existing, legal index to something new.
   *
   * If the list currently has k elements, the only valid indices are 0 through
   * k-1, regardless of its capacity; any other index should result in an
   * IndexOutOfBoundsException.
   *
   * @param index the index to alter
   * @param data the value to assign at that index
  */
  void set(int index, T data) throws IndexOutOfBoundsException;

  /** Insert a new element into the list and move later elements up by one index.
   *
   * If a list consists of [ A B C ], and add(1,D) is called, it should newly
   * be [ A D B C ].  If there are k elements in the list, legal indices are
   * 0-k.  All others should result in IndexOutOfBoundsException.
   *
   * @param index the index where the new element will go
   * @param data the value to insert at that index
   */
  void add(int index, T data) throws IndexOutOfBoundsException;


  /** Remove the element at the given index and move later elements down by one.
   *
   * If a list consists of [ A B C D ], and remove(1) is called, this should
   * return B, and result in [ A C D ].  If you try and remove something at a
   * bad index, it should throw a IndexOutOfBoundsException.
   *
   * @param index the index to remove from
   */
  void remove(int index) throws IndexOutOfBoundsException;

  /** Return the number of elements in the list.
   *
   * Note this is NOT the same as the capacity of the underlying array storage.
   *
   * @return the number of elements currently in the list
   */
  int size();
}