package com.wrox.algorithms.iteration;

/**
 * Iterator bazujący na wzorcach projektowych (Gamma i in. 1995).
 */
public interface Iterator {
    /**
     * (Re)pozycjonuje iterator na pierwszym elemencie.
     * Gdy niezaimplementowana, wywołuje wyjątek UnsupportedOperationException
     */
    public void first();

    /**
     * (Re)pozycjonuje iterator na ostatnim elemencie.
     * Gdy niezaimplementowana, wywołuje wyjątek UnsupportedOperationException
     */
    public void last();

    /**
     * Sprawdza, czy określony jest bieżący element iteracji
     * zwraca false gdy jest i true, gdy nie jest
     */
    public boolean isDone();

    /**
     * Pozycjonuje iterator na następnym elemencie.
     * Gdy niezaimplementowana, wywołuje wyjątek UnsupportedOperationException
     */
    public void next();

    /**
     * Pozycjonuje iterator na poprzednim elemencie.
     * Gdy niezaimplementowana, wywołuje wyjątek UnsupportedOperationException
     */
    public void previous();

    /**
     * Zwraca wartość bieżącego elementu;.
     * Gdy bieżący element nie jest określony, wywołuje wyjątek 
     * IteratorOutOfBoundsException
     */
    public Object current() throws IteratorOutOfBoundsException;
}
