package com.googlecode.totallylazy.parser; import com.googlecode.totallylazy.Segment; import com.googlecode.totallylazy.Sequence; import com.googlecode.totallylazy.Sequences; import java.util.ArrayList; import java.util.List; import static com.googlecode.totallylazy.Sequences.sequence; import static com.googlecode.totallylazy.Unchecked.cast; import static com.googlecode.totallylazy.parser.Success.success; class ListParser<A> implements Parser<List<A>> { private final Sequence<? extends Parser<? extends A>> parsers; private ListParser(Sequence<? extends Parser<? extends A>> parsers) { this.parsers = parsers; } static <A> ListParser<A> list(final Iterable<? extends Parser<? extends A>> parsers) { return new ListParser<A>(Sequences.sequence(parsers)); } @Override public String toString() { return parsers.toString(); } @Override public Result<List<A>> parse(Segment<Character> characters) { Segment<Character> state = characters; List<A> parsed = new ArrayList<A>(); for (Parser<? extends A> parser : parsers) { Result<? extends A> result = parser.parse(state); if (result instanceof Failure) return cast(result); parsed.add(result.value()); state = result.remainder(); } return success(parsed, state); } }