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

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

/**
 * Implementacja iteratora, który umożliwia przeglądanie 1-elementowego zbioru.
 * 
 * @param <T> 
 * @author ranides
 */
public class SingleIterator<T> implements ListIterator<T> {
    
    private static final String LIST_IS_IMMUTABLE = "list is immutable.";
    
    private final T value;
    private boolean end;
    
    /**
     * Tworzy iterator pozwalającej przeglądać 1-elementowy zbiór zawierający
     * podaną wartość.
     * @param value
     */
    public SingleIterator(T value) {
        this.value = value;
        this.end = false;
    }
    
    /**
     * ListIterator umożliwia dwukierunkowe przeglądanie zbioru. 
     * Metoda {@code inverse} przesuwa "bieżącą pozycję" na drugi koniec zbioru.
     * 
     * @return
     */
    public SingleIterator<T> inverse() {
        this.end = !this.end;
        return this;
    }

    @Override
    public boolean hasNext() {
        return !end;
    }

    @Override
    public T next() {
        if(this.end) { throw new NoSuchElementException(); }
        this.end = true;
        return value;
    }

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

    @Override
    public T previous() {
        if(!this.end) { throw new NoSuchElementException(); }
        this.end = false;
        return value;
    }

    @Override
    public int nextIndex() {
        return end ? 1 : 0;
    }

    @Override
    public int previousIndex() {
        return end ? 0 : -1;
    }

    @Override
    public void add(T value) {
        throw new UnsupportedOperationException(LIST_IS_IMMUTABLE);
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException(LIST_IS_IMMUTABLE);
    }

    @Override
    public void set(T value) {
        throw new UnsupportedOperationException(LIST_IS_IMMUTABLE);
    }
    
    
    
}
