/**
* Copyright (c) 2013-2016, The SeedStack authors <http://seedstack.org>
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.seedstack.seed.core.internal.utils;
import org.kametic.specifications.AbstractSpecification;
import org.kametic.specifications.Specification;
import java.util.function.Predicate;
public class SpecificationBuilder<T> {
private Predicate<T> predicate;
public SpecificationBuilder(Predicate<T> predicate) {
this.predicate = predicate;
}
public SpecificationBuilder and(Predicate<? super T>... others) {
for (Predicate<? super T> other : others) {
predicate = predicate.and(other);
}
return this;
}
public SpecificationBuilder or(Predicate<? super T>... others) {
for (Predicate<? super T> other : others) {
predicate = predicate.or(other);
}
return this;
}
public SpecificationBuilder negate() {
predicate = predicate.negate();
return this;
}
public Specification<T> build() {
return new AbstractSpecification<T>() {
@Override
public boolean isSatisfiedBy(T candidate) {
return predicate.test(candidate);
}
};
}
}