package com.googlecode.totallylazy.parser; import com.googlecode.totallylazy.functions.Function1; import com.googlecode.totallylazy.functions.Callables; import com.googlecode.totallylazy.Characters; import com.googlecode.totallylazy.Option; import com.googlecode.totallylazy.Pair; import com.googlecode.totallylazy.predicates.Predicate; import com.googlecode.totallylazy.Triple; import java.io.PrintStream; import java.util.List; import java.util.concurrent.Callable; import static com.googlecode.totallylazy.Sequences.sequence; public interface Parsers { Function1<Iterable<?>, String> toString = iterable -> sequence(iterable).toString(""); static <A> Parser<A> parser(final Parser<? extends A> parser) { return MappingParser.map(parser, Callables.<A>returnArgument()); } // Use in Java 7+, for Java 6 use Parsers.reference static <T> Parser<T> lazy(Callable<? extends Parser<T>> value) { return LazyParser.lazy(value); } // Use in Java 6, for Java 7+ use Parsers.lazy static <T> ReferenceParser<T> reference(){ return ReferenceParser.reference(); } static Parser<Character> character(Predicate<Character> value) { return CharacterParser.character(value); } static Parser<Character> character(char value) { return CharacterParser.character(value); } static Parser<CharSequence> characters(Predicate<Character> value) { return CharactersParser.characters(value); } static Parser<Character> isChar(Predicate<Character> value) { return CharacterParser.character(value); } static Parser<Character> isChar(char value) { return CharacterParser.character(value); } static Parser<Character> wsChar(char value) { return ws(isChar(value)); } static <A> Parser<A> ws(Parser<A> parser) { return parser.surroundedBy(isChar(Characters.whitespace).many()); } static Parser<Character> notChar(char value) { return CharacterParser.notChar(value); } static Parser<Character> among(String value) { return CharacterParser.character(Characters.among(value)); } static Parser<Character> notAmong(String value) { return CharacterParser.character(Characters.notAmong(value)); } static Parser<String> string(String value) { return StringParser.string(value); } static Parser<String> string(Iterable<? extends Predicate<? super Character>> value) { return PredicatesParser.string(value); } @SafeVarargs static Parser<String> string(Predicate<? super Character>... predicates) { return PredicatesParser.string(predicates); } static Parser<String> pattern(String value, String pretty) { return pattern(value).pretty(pretty); } static Parser<String> pattern(String value) { return PatternParser.pattern(value); } static <A> Parser<A> pretty(String pretty, Parser<A> parse) { return PrettyParser.pretty(parse, pretty); } static <A, B> Parser<B> map(Parser<? extends A> source, Function1<? super A, ? extends B> callable) { return MappingParser.map(source, callable); } static <A> Parser<Option<A>> optional(Parser<? extends A> parserA) { return OptionalParser.optional(parserA); } static <A> Parser<A> or(Iterable<? extends Parser<? extends A>> parsers) { return OrParser.or(parsers); } @SafeVarargs static <A> Parser<A> or(Parser<? extends A>... parsers) { return or(sequence(parsers)); } static <A> Parser<A> returns(A a) { return new ReturnsParser<>(a); } static <T> Parser<T> constant(T value) { return returns(value); } static <A> Parser<List<A>> many(Parser<? extends A> parser) { return ManyParser.many(parser); } static <A> Parser<List<A>> list(final Iterable<? extends Parser<? extends A>> parsers) { return ListParser.list(parsers); } @SafeVarargs static <A> Parser<List<A>> list(final Parser<? extends A>... parsers) { return list(sequence(parsers)); } static <A, B> Parser<Pair<A, B>> pair(final Parser<? extends A> parserA, final Parser<? extends B> parserB) { return PairParser.pair(parserA, parserB); } static <A, B, C> Parser<Triple<A, B, C>> triple(final Parser<? extends A> parserA, final Parser<? extends B> parserB, final Parser<? extends C> parserC) { return TripleParser.triple(parserA, parserB, parserC); } static <A, B> Parser<Pair<A, B>> tuple(final Parser<? extends A> parserA, final Parser<? extends B> parserB) { return PairParser.pair(parserA, parserB); } static <A, B, C> Parser<Triple<A, B, C>> tuple(final Parser<? extends A> parserA, final Parser<? extends B> parserB, final Parser<? extends C> parserC) { return TripleParser.triple(parserA, parserB, parserC); } static <A> Parser<A> between(Parser<?> before, Parser<A> parserB, Parser<?> after) { return TripleParser.triple(before, parserB, after).map(Callables.<A>second()); } static <T> Parser<T> debug(String name, Parser<T> parser) { return debug(System.out, name, parser); } static <T> Parser<T> debug(PrintStream printStream, String name, Parser<T> parser) { return new DebugParser<>(parser, name, printStream); } }