package com.googlecode.totallylazy.parser; import com.googlecode.totallylazy.predicates.Predicate; import com.googlecode.totallylazy.Segment; import com.googlecode.totallylazy.Sequence; import com.googlecode.totallylazy.Sequences; import static com.googlecode.totallylazy.Sequences.sequence; import static com.googlecode.totallylazy.parser.Success.success; class PredicatesParser implements Parser<String> { private final Sequence<? extends Predicate<? super Character>> predicates; private PredicatesParser(Sequence<? extends Predicate<? super Character>> predicates) { this.predicates = predicates; } static Parser<String> string(Iterable<? extends Predicate<? super Character>> predicates) { return new PredicatesParser(Sequences.sequence(predicates)); } @SafeVarargs static Parser<String> string(Predicate<? super Character>... predicates) { return new PredicatesParser(Sequences.sequence(predicates)); } @Override public Result<String> parse(Segment<Character> characters) { Segment<Character> segment = characters; StringBuilder result = new StringBuilder(); for (Predicate<? super Character> predicate : predicates) { char a = segment.head(); result.append(a); if (!predicate.matches(a)) return fail(toString(), result.toString()); segment = segment.tail(); } return success(result.toString(), segment); } @Override public String toString() { return predicates.toString(""); } }