package com.googlecode.totallylazy.parser; import com.googlecode.totallylazy.Segment; import com.googlecode.totallylazy.Triple; import static com.googlecode.totallylazy.Unchecked.cast; class TripleParser<A, B, C> implements Parser<Triple<A, B, C>> { private final Parser<? extends A> parserA; private final Parser<? extends B> parserB; private final Parser<? extends C> parserC; private TripleParser(Parser<? extends A> parserA, Parser<? extends B> parserB, Parser<? extends C> parserC) { this.parserA = parserA; this.parserB = parserB; this.parserC = parserC; } static <A, B, C> TripleParser<A, B, C> triple(final Parser<? extends A> parserA, final Parser<? extends B> parserB, final Parser<? extends C> parserC) { return new TripleParser<A, B, C>(parserA, parserB, parserC); } @Override public Result<Triple<A, B, C>> parse(Segment<Character> characters) { Result<? extends A> resultA = parserA.parse(characters); if (resultA instanceof Failure) return cast(resultA); Result<? extends B> resultB = parserB.parse(resultA.remainder()); if (resultB instanceof Failure) return cast(resultB); Result<? extends C> resultC = parserC.parse(resultB.remainder()); if (resultC instanceof Failure) return cast(resultC); return Success.success(Triple.triple(resultA.value(), resultB.value(), resultC.value()), resultC.remainder()); } @Override public String toString() { return String.format("%s and %s and %s", parserA, parserB, parserC); } }