package com.googlecode.totallylazy.validations; import com.googlecode.totallylazy.predicates.Predicates; import com.googlecode.totallylazy.Sequence; import static com.googlecode.totallylazy.predicates.Predicates.not; import static com.googlecode.totallylazy.Sequences.sequence; import static com.googlecode.totallylazy.validations.ValidationResult.constructors.pass; import static com.googlecode.totallylazy.validations.ValidationResult.functions.succeeded; import static com.googlecode.totallylazy.validations.Validator.functions.validateAgainst; public class FirstFailureValidator<T> extends LogicalValidator<T> { private final Sequence<Validator<? super T>> validators; public FirstFailureValidator(Sequence<Validator<? super T>> validators) { this.validators = validators; } @Override public ValidationResult validate(T instance) { return validators.map(validateAgainst(instance)). find(Predicates.not(succeeded())). getOrElse(pass()); } public static class constructors { public static <T> FirstFailureValidator<T> firstFailure(Iterable<Validator<? super T>> validators) { return new FirstFailureValidator<T>(sequence(validators)); } } }