package com.googlecode.totallylazy.parser; import com.googlecode.totallylazy.predicates.Predicate; import com.googlecode.totallylazy.Segment; import static com.googlecode.totallylazy.parser.Success.success; class CharactersParser implements Parser<CharSequence> { private final Predicate<Character> predicate; private CharactersParser(Predicate<Character> predicate) { this.predicate = predicate; } public static CharactersParser characters(Predicate<Character> predicate) {return new CharactersParser(predicate);} @Override public String toString() { return String.format("many %s", predicate); } @Override public Result<CharSequence> parse(Segment<Character> characters) { if(characters.isEmpty()) return fail(predicate, ""); Segment<Character> segment = characters; StringBuilder result = new StringBuilder(); while (!segment.isEmpty()) { Character head = segment.head(); if (!predicate.matches(head)) break; result.append(head); segment = segment.tail(); } if(result.length() == 0) return fail(predicate, characters.head()); return success(result, segment); } }