SplitOnSubstring.java
package no.motif.iter;
import static no.motif.Base.equalOrGreaterThan;
import static no.motif.Singular.none;
import static no.motif.Singular.optional;
import java.io.Serializable;
import java.util.Iterator;
import no.motif.single.Optional;
public class SplitOnSubstring implements Iterable<String>, Serializable {
private final String string;
private final int stringLength;
private final String substring;
private final int substringLength;
public SplitOnSubstring(String string, String splittingSubstring) {
this.string = string;
this.stringLength = string.length();
this.substring = splittingSubstring;
this.substringLength = splittingSubstring.length();
}
@Override
public Iterator<String> iterator() {
return new SimpleIterator<String>() {
int pos = 0;
@Override
protected Optional<? extends String> nextIfAvailable() {
if (pos > stringLength) return none();
int endIndex = optional(equalOrGreaterThan(0), string.indexOf(substring, pos)).orElse(stringLength);
String next = string.substring(pos, endIndex);
pos = endIndex + substringLength;
return optional(next);
}
};
}
}