package com.googlecode.gaal.analysis.impl;
import java.util.Iterator;
import java.util.NoSuchElementException;
import com.googlecode.gaal.analysis.api.Filter;
import com.googlecode.gaal.analysis.api.IntervalSetBuilder;
import com.googlecode.gaal.data.api.IntervalSet;
import com.googlecode.gaal.data.api.SymbolTable;
import com.googlecode.gaal.suffix.api.EmbeddedSuffixTree.EmbeddedInterval;
import com.googlecode.gaal.suffix.api.LinearizedSuffixTree;
import com.googlecode.gaal.suffix.api.LinearizedSuffixTree.BinaryInterval;
public class EmbeddedContextExtractor implements Iterable<EmbeddedInterval> {
private final IntervalSet<BinaryInterval> intervalSet;
private final EmbeddedIntervalExtractor intervalContextExtractor;
public EmbeddedContextExtractor(LinearizedSuffixTree lst, SymbolTable<?> symbolTable,
IntervalSetBuilder intervalSetBuilder, Filter<EmbeddedInterval> contextFilter, int windowSize) {
this.intervalSet = intervalSetBuilder.buildIntervalSet(lst);
this.intervalContextExtractor = new EmbeddedIntervalExtractor(lst, symbolTable, intervalSetBuilder,
contextFilter, windowSize);
}
@Override
public Iterator<EmbeddedInterval> iterator() {
return new ContextIterator();
}
private class ContextIterator implements Iterator<EmbeddedInterval> {
private final Iterator<BinaryInterval> iterator = intervalSet.iterator();
private Iterator<EmbeddedInterval> intervalContextIterator;
private EmbeddedInterval next = advance();
@Override
public boolean hasNext() {
return next != null;
}
@Override
public EmbeddedInterval next() {
if (next == null)
throw new NoSuchElementException();
EmbeddedInterval context = next;
next = advance();
return context;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
private EmbeddedInterval advance() {
while (intervalContextIterator == null || !intervalContextIterator.hasNext()) {
if (iterator.hasNext()) {
intervalContextIterator = intervalContextExtractor.iterator(iterator.next());
} else {
return null;
}
}
return intervalContextIterator.next();
}
};
}