package org.gridkit.jvmtool.event;
import java.util.Iterator;
import java.util.NoSuchElementException;
public class MorphingEventReader<T extends Event> implements EventReader<T> {
@SuppressWarnings({ "rawtypes", "unchecked" })
public static <S extends Event, T extends Event> EventReader<T> morph(EventReader<S> source, EventMorpher<S, T> morpher) {
return new MorphingEventReader(source, morpher);
}
private final EventReader<Event> nested;
private final EventMorpher<Event, T> morpher;
private T nextEvent;
protected MorphingEventReader(EventReader<Event> source) {
this(source, null);
}
public MorphingEventReader(EventReader<Event> source, EventMorpher<Event, T> morph) {
this.nested = source;
this.morpher = morph;
}
@Override
public <M extends Event> EventReader<M> morph(EventMorpher<T, M> morpher) {
return morph(this, morpher);
}
@Override
public boolean hasNext() {
while(nextEvent == null && nested.hasNext()) {
Event e = nested.next();
nextEvent = transform(e);
}
return nextEvent != null;
}
protected T transform(Event event) {
return morpher.morph(event);
}
@Override
public T next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
T event = nextEvent;
nextEvent = null;
return event;
}
@Override
public T peekNext() {
if (!hasNext()) {
throw new NoSuchElementException();
}
T event = nextEvent;
return event;
}
@Override
public Iterator<T> iterator() {
return this;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
@Override
public void dispose() {
nested.dispose();
}
}