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

package net.ranides.assira.collection.map;

import java.util.List;
import java.util.Map;

/**
 * Interfejs mapy, która dodatkowe udostępnia widoki na dane, w postaci 
 * uporządkowanych list wartości, kluczy lub par. Modyfikacja widoków zmienia 
 * zawartość mapy. Wstawianie i usuwanie przypisań za pomocą dowolnych metod 
 * (m.in. metod z widoków) przeindeksowuje całą zawartość w spójny sposób.
 * 
 * <p>Klasa pozwala też na proste iterowanie po zapisanych wartościach
 * za pomocą for-each.</p>
 * @param <K> 
 * @param <V> 
 * @author ranides
 */
@SuppressWarnings("PMD.ShortMethodName")
public interface ListableMap<K,V> extends Map<K,V>, Iterable<V> {

    /**
     * Zwraca listę wartości zapisanych w mapie - modyfikacja listy zmienia treść 
     * mapy (i vice versa).
     * @return
     */
    List<V> asListAdapter();

    /**
     * Zwraca listę kluczy zapisanych w mapie - modyfikacja listy zmienia treść 
     * mapy (i vice versa).
     * @return
     */
    List<K> keysList();

    /**
     * Zwraca listę par zapisanych w mapie - modyfikacja listy zmienia treść 
     * mapy (i vice versa).
     * @return
     */
    List<Entry<K,V>> entryList();

    /**
     * Zwraca wartość zapisaną pod wskazanym indeksem. 
     * @param index
     * @return
     */
    V at(int index);

}
