package org.rr.commons.collection;
import java.util.AbstractList;
import java.util.Collection;
import java.util.List;
/**
* The {@link InsertElementList} allows to map a value to a specific
* index into the map without modifying the original {@link List}.
*/
public class InsertElementList<E> extends AbstractList<E> {
private List<E> list;
private E value;
private int idx;
public InsertElementList(List<E> list, E value, int index) {
this.list = list;
this.value = value;
this.idx = index;
}
@Override
public E get(int index) {
int internalListIndex = getInternalListIndex(index);
if(internalListIndex == -1) {
return value;
} else {
return list.get(internalListIndex);
}
}
@Override
public int size() {
return list.size() + 1;
}
@Override
public boolean add(E e) {
return list.add(e);
}
@Override
public void add(int index, E e) {
if(index < idx) {
list.add(index, e);
} else if(index == idx) {
idx++;
list.add(index, e);
} else {
list.add(index - 1, e);
}
}
@Override
public boolean addAll(Collection<? extends E> c) {
return list.addAll(c);
}
private int getInternalListIndex(int index) {
if(idx > index) {
return index;
} else if(idx == index) {
return -1; //mapped object
} else {
return index - 1;
}
}
}