/**
 * interface simplifiée pour un Deque, c'est-à-dire une file d'attente à double extrémité
 * 
 * Pour éviter la lourdeur de l'interface Deque de l'API officielle, celle-ci limite 
 * cette dernière à 5 méthodes essentielles.
 *
 * La spécification de ces méthodes est essentiellement identique à celle des méthodes équivalentes 
 * dans Deque.
 *
 * Ici nous choisissons d'interdire null comme élément et de ne pas limiter la capacité de la deque.
 * Nous ignorons ClassCastException qui n'est a priori pas possible d'obtenir en runtime avec javac sans contorsion.
 *
 * The javadoc is reproduced and adapted from source for your convenience below in the file, but in english.
 *
 * Il est recommandé d'ajouter un constructeur sans argument qui instancie un deque vide. 
 * Il est utile de surcharger toString() pour permettre d'afficher utilement la structure de donnée.
 *Œ
 * @author Luc Hernandez, Florent Madelaine.
 * @See  Java.util.Deque
 */

public interface MinimalDeque<E> {

  /**
   * Inserts the specified element at the front of this deque if it is
   * possible to do so.
   *
   * @param e the element to add
   * @throws NullPointerException if the specified element is null
   * @throws IllegalArgumentException if some property of the specified
   *         element prevents it from being added to this deque
   */
    void addFirst(E e);

    /**
     * Inserts the specified element at the end of this deque if it is
     * possible to do so.
     *
     * @param e the element to add
     * @throws NullPointerException if the specified element is null
     * @throws IllegalArgumentException if some property of the specified
     *         element prevents it from being added to this deque
     */
    void addLast(E e);

    /**
     * Returns <tt>true</tt> if this collection contains no elements.
     *
     * @return <tt>true</tt> if this collection contains no elements
     */
    boolean isEmpty();

    /**
     * Retrieves and removes the first element of this deque.
     *
     * @return the head of this deque
     * @throws NoSuchElementException if this deque is empty
     */
    E removeFirst();

    /**
     * Retrieves and removes the last element of this deque.
     *
     * @return the tail of this deque
     * @throws NoSuchElementException if this deque is empty
     */
    E removeLast();
}
