package bjc.utils.parserutils.splitterv2; import bjc.utils.funcdata.FunctionalList; import bjc.utils.funcdata.IList; import java.util.HashSet; import java.util.Set; import java.util.function.Predicate; /** * A token splitter that will not split certain tokens. * * @author EVE * */ public class ExcludingTokenSplitter implements TokenSplitter { private Set literalExclusions; private IList> predExclusions; private TokenSplitter spliter; /** * Create a new excluding token splitter. * * @param splitter * The splitter to apply to non-excluded strings. */ public ExcludingTokenSplitter(TokenSplitter splitter) { spliter = splitter; literalExclusions = new HashSet<>(); predExclusions = new FunctionalList<>(); } /** * Exclude a literal string from splitting. * * @param exclusion * The string to exclude from splitting. */ public void addLiteralExclusion(String exclusion) { literalExclusions.add(exclusion); } /** * Exclude all of the strings matching a predicate from splitting. * * @param exclusion * The predicate to use for exclusions. */ public void addPredicateExclusion(Predicate exclusion) { predExclusions.add(exclusion); } @Override public IList split(String input) { if(literalExclusions.contains(input)) return new FunctionalList<>(input); else if(predExclusions.anyMatch(pred -> pred.test(input))) return new FunctionalList<>(input); return spliter.split(input); } }