package com.github.sommeri.less4j.utils;
import java.util.Iterator;
import java.util.LinkedHashSet;
public class LastOfKindSet<K, V> implements Iterable<V> {
private final LinkedHashSet<Entry<K, V>> entries = new LinkedHashSet<Entry<K, V>>();
public void add(K kind, V value) {
Entry<K, V> entry = new Entry<K, V>(kind, value);
if (entries.contains(entry)) {
entries.remove(entry);
}
entries.add(entry);
}
@Override
public Iterator<V> iterator() {
return new ValueIterator<K, V>(entries.iterator());
}
}
class ValueIterator<K, V> implements Iterator<V> {
private final Iterator<Entry<K,V>> entryIterator;
public ValueIterator(Iterator<Entry<K, V>> entryIterator) {
super();
this.entryIterator = entryIterator;
}
@Override
public boolean hasNext() {
return entryIterator.hasNext();
}
@Override
public V next() {
return entryIterator.next().value;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
class Entry<K, V> {
public Entry(K kind, V value) {
super();
this.kind = kind;
this.value = value;
}
K kind;
V value;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((kind == null) ? 0 : kind.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
@SuppressWarnings("rawtypes")
Entry other = (Entry) obj;
if (kind == null) {
if (other.kind != null)
return false;
} else if (!kind.equals(other.kind))
return false;
return true;
}
}