package net.exoego.queen;
import java.util.regex.MatchResult;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class MatchResultSeq extends AbstractSeq<MatchResult> {
private final Pattern pattern;
private final CharSequence source;
private MatchResultSeq(final CharSequence source, final Pattern pattern) {
this.pattern = pattern;
this.source = source;
}
static Seq<MatchResult> newInstance(final CharSequence charSequence, final Pattern pattern) {
if (charSequence == null) {
throw new NullPointerException("charSequence");
}
if (pattern == null) {
throw new NullPointerException("pattern");
}
return new MatchResultSeq(charSequence, pattern);
}
@Override
public Enumerator<MatchResult> iterator() {
return new StringMatchResultEnumerator(pattern, source);
}
private static final class StringMatchResultEnumerator extends Enumerator<MatchResult> {
private final Pattern pattern;
private final CharSequence source;
private int lastMatch;
StringMatchResultEnumerator(final Pattern pattern, final CharSequence source) {
this.pattern = pattern;
this.source = source;
lastMatch = 0;
}
@Override
protected boolean tryGetNext() {
final Matcher match = pattern.matcher(source.toString());
if (match.find(lastMatch)) {
lastMatch = match.end();
return yield(match.toMatchResult());
}
return false;
}
}
}