package com.googlecode.totallylazy.parser; import com.googlecode.totallylazy.Segment; import com.googlecode.totallylazy.Sequence; import com.googlecode.totallylazy.Sequences; import static com.googlecode.totallylazy.Sequences.sequence; class OrParser<A> implements Parser<A> { private final Sequence<Parser<A>> parsers; private OrParser(Sequence<Parser<A>> parsers) { this.parsers = parsers; } static <A> OrParser<A> or(Iterable<? extends Parser<? extends A>> parsers) { return new OrParser<A>(Sequences.sequence(parsers).<Parser<A>>unsafeCast()); } @Override public String toString() { return parsers.toString(" or "); } @Override public Result<A> parse(Segment<Character> characters) { Result<A> result = null; for (Parser<A> parser : parsers) { result = parser.parse(characters); if (result.success()) return result; } return result; } }