package com.googlecode.totallylazy.parser; import com.googlecode.totallylazy.functions.Function1; import com.googlecode.totallylazy.predicates.Predicate; import com.googlecode.totallylazy.Segment; import static com.googlecode.totallylazy.predicates.Predicates.is; import static com.googlecode.totallylazy.predicates.Predicates.not; import static com.googlecode.totallylazy.parser.Success.success; class CharacterParser implements Parser<Character> { private final Predicate<Character> predicate; private CharacterParser(Predicate<Character> predicate) { this.predicate = predicate; } public static CharacterParser character(Predicate<Character> value) { return new CharacterParser(value); } public static CharacterParser character(char value) { return character(is(value)); } public static CharacterParser isChar(Predicate<Character> value) { return character(value); } public static CharacterParser isChar(char value) { return character(value); } public static CharacterParser notChar(char value) { return character(not(value)); } public static Function1<Character, Parser<Character>> characterParser() { return character -> character(character); } @Override public Result<Character> parse(final Segment<Character> characters) { if(characters.isEmpty()) return fail(predicate, "[EOF]"); Character c = characters.head(); return predicate.matches(c) ? success(c, characters.tail()) : fail(predicate, c); } @Override public String toString() { return predicate.toString(); } }