package com.github.mustachejava.util;
import java.util.AbstractCollection;
import java.util.Collection;
import java.util.Iterator;
/**
* Exposes first / last / index / value on each element.
*/
public class DecoratedCollection<T> extends AbstractCollection<Element<T>> {
private final Collection<T> c;
public DecoratedCollection(Collection<T> c) {
this.c = c;
}
@Override
public Iterator<Element<T>> iterator() {
final Iterator<T> iterator = c.iterator();
return new Iterator<Element<T>>() {
int index = 0;
@Override
public boolean hasNext() {
return iterator.hasNext();
}
@Override
public Element<T> next() {
T next = iterator.next();
int current = index++;
return new Element<>(current, current == 0, !iterator.hasNext(), next);
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
@Override
public int size() {
return c.size();
}
}
class Element<T> {
public final int index;
public final boolean first;
public final boolean last;
public final T value;
public Element(int index, boolean first, boolean last, T value) {
this.index = index;
this.first = first;
this.last = last;
this.value = value;
}
}