package com.googlecode.totallylazy.parser;
import com.googlecode.totallylazy.functions.Function1;
import com.googlecode.totallylazy.Either;
import com.googlecode.totallylazy.Option;
import com.googlecode.totallylazy.Segment;
import static com.googlecode.totallylazy.Option.none;
import static com.googlecode.totallylazy.Unchecked.cast;
public interface Failure<A> extends Result<A>{
static <A> Failure<A> failure(final Object expected, final Object actual) {
return new Failure<A>() {
@Override
public Object actual() {
return actual;
}
@Override
public String message() {
return String.format("%s expected, %s encountered.", expected, actual);
}
@Override
public String toString() {
return "Failure(\"" + message() + "\")";
}
};
}
static <A> Failure<A> failure(final Object expected, final Exception actual) {
return failure(expected, actual.getMessage());
}
@Override
default <B> Failure<B> map(Function1<? super A, ? extends B> callable) {
return cast(this);
}
@Override
default <B> Result<B> flatMap(Function1<? super A, ? extends Result<B>> callable) {
return cast(this);
}
@Override
default Option<A> option() {
return none();
}
@Override
default Either<String, A> either() {
return Either.left(message());
}
@Override
default boolean success() {
return false;
}
@Override
default boolean failure() {
return true;
}
@Override
default Segment<Character> remainder() {
throw exception();
}
@Override
default A value() {
throw exception();
}
default RuntimeException exception() {
return new RuntimeException(message());
}
}