package com.googlecode.totallylazy.parser; import com.googlecode.totallylazy.Option; import com.googlecode.totallylazy.Segment; import static com.googlecode.totallylazy.parser.Success.success; import static java.lang.String.format; class OptionalParser<A> implements Parser<Option<A>> { private final Parser<? extends A> parserA; private OptionalParser(Parser<? extends A> parserA) { this.parserA = Parsers.parser(parserA); } static <A> OptionalParser<A> optional(Parser<? extends A> parserA) { return new OptionalParser<A>(parserA); } @Override public String toString() { return format("optional(%s)", parserA.toString()); } @Override public Result<Option<A>> parse(Segment<Character> characters) { Result<? extends A> result = parserA.parse(characters); if (result instanceof Failure) return success(Option.<A>none(), characters); return success(Option.option(result.value()), result.remainder()); } }