/*
 *  @author Ranides Atterwim <ranides@gmail.com>
 *  @copyright Ranides Atterwim
 *  @license WTFPL
 *  @url http://ranides.net/projects/assira
 */

package net.ranides.assira.collection.list;

import java.util.ListIterator;
import java.util.NoSuchElementException;

/**
 * Implementacja iteratora reprezentującego pusty zbiór, którego nie można modyfikować.
 * @param <T>
 * @author ranides
 */
public final class EmptyListIterator<T> implements ListIterator<T> {

    /**
     * Stała reprezentująca iterator. Iterator pustego zbioru może być bez przeszkód
     * współdzielony, bez potrzeby wielokrotnego tworzenia nowej instancji.
     */
    public static final ListIterator INSTANCE = new EmptyListIterator();

    /**
     * Zwraca iterator reprezentujący pusty zbiór. Metoda stworzona w celu type-safe
     * współpracy z generics-ami.
     * @param <TT>
     * @return
     */
    @SuppressWarnings("unchecked")
    public static <TT> ListIterator<TT> emptyIterator() {
        return INSTANCE;
    }

    @Override
    public boolean hasNext() {
        return false;
    }

    @Override
    public T next() {
        throw new NoSuchElementException("list is empty");
    }

    @Override
    public boolean hasPrevious() {
        return false;
    }

    @Override
    public T previous() {
        throw new NoSuchElementException("list is empty");
    }

    @Override
    public int nextIndex() {
        return 0;
    }

    @Override
    public int previousIndex() {
        return -1;
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException("list is empty");
    }

    @Override
    public void set(T value) {
        throw new UnsupportedOperationException("list is immutable");
    }

    @Override
    public void add(T value) {
        throw new UnsupportedOperationException("list is immutable");
    }

}