package com.googlecode.totallylazy.parser; import com.googlecode.totallylazy.Segment; import java.util.ArrayList; import java.util.List; import static com.googlecode.totallylazy.parser.Success.success; class ManyParser<A> implements Parser<List<A>> { private final Parser<? extends A> parser; private ManyParser(Parser<? extends A> parser) { this.parser = parser; } static <A> ManyParser<A> many(Parser<? extends A> parser) { return new ManyParser<A>(parser); } public Result<List<A>> parse(Segment<Character> characters) { Segment<Character> segment = characters; List<A> list = new ArrayList<A>(); while (!segment.isEmpty()) { Result<? extends A> result = parser.parse(segment); if (result instanceof Failure) break; list.add(result.value()); segment = result.remainder(); } return success(list, segment); } @Override public String toString() { return String.format("many %s", parser); } }