package com.googlecode.totallylazy.predicates;
import com.googlecode.totallylazy.*;
import com.googlecode.totallylazy.functions.Callables;
import com.googlecode.totallylazy.functions.Function1;
import java.util.Collection;
import static com.googlecode.totallylazy.functions.Functions.function;
import static com.googlecode.totallylazy.Sequences.sequence;
import static com.googlecode.totallylazy.Sets.set;
import static com.googlecode.totallylazy.predicates.LogicalPredicate.logicalPredicate;
public class Predicates {
public static <T> LogicalPredicate<T> alwaysTrue() {
return AlwaysTrue.alwaysTrue();
}
public static <T> LogicalPredicate<T> alwaysTrue(Class<T> aClass) {
return AlwaysTrue.alwaysTrue();
}
public static <T> LogicalPredicate<T> always() {
return AlwaysTrue.alwaysTrue();
}
public static <T> LogicalPredicate<T> always(Class<T> aClass) {
return AlwaysTrue.alwaysTrue();
}
public static <T> LogicalPredicate<T> all() {
return AlwaysTrue.alwaysTrue();
}
public static <T> LogicalPredicate<T> all(Class<T> aClass) {
return AlwaysTrue.alwaysTrue();
}
public static <T> LogicalPredicate<T> any() {
return AlwaysTrue.alwaysTrue();
}
public static <T> LogicalPredicate<T> any(Class<T> aClass) {
return AlwaysTrue.alwaysTrue();
}
public static <T> LogicalPredicate<T> anything() {
return AlwaysTrue.alwaysTrue();
}
public static <T> LogicalPredicate<T> anything(Class<T> aClass) {
return AlwaysTrue.alwaysTrue();
}
public static <T> LogicalPredicate<T> alwaysFalse() {
return AlwaysFalse.alwaysFalse();
}
public static <T> LogicalPredicate<T> alwaysFalse(Class<T> aClass) {
return AlwaysFalse.alwaysFalse();
}
public static <T> LogicalPredicate<T> never() {
return AlwaysFalse.alwaysFalse();
}
public static <T> LogicalPredicate<T> never(Class<T> aClass) {
return AlwaysFalse.alwaysFalse();
}
@SafeVarargs
public static <T> LogicalPredicate<Collection<T>> contains(final T... t) {
return new LogicalPredicate<Collection<T>>() {
public boolean matches(Collection<T> other) {
return other.containsAll(Lists.list(t));
}
};
}
public static <T> LogicalPredicate<Collection<T>> containsAll(final Iterable<? extends T> t) {
Collection<T> list = Lists.list(t);
return containsAll(list);
}
public static <T> LogicalPredicate<Collection<T>> containsAll(final Collection<? extends T> t) {
return new LogicalPredicate<Collection<T>>() {
public boolean matches(Collection<T> other) {
return other.containsAll(t);
}
};
}
public static <T> LogicalPredicate<Iterable<T>> exists(final Predicate<? super T> predicate) {
return new LogicalPredicate<Iterable<T>>() {
public boolean matches(Iterable<T> iterable) {
return sequence(iterable).exists(predicate);
}
@Override
public String toString() {
return String.format("iterable containing item '%s'", predicate.toString());
}
};
}
public static <T> LogicalPredicate<Iterable<T>> forAll(final Predicate<? super T> predicate) {
return new LogicalPredicate<Iterable<T>>() {
public boolean matches(Iterable<T> iterable) {
return sequence(iterable).forAll(predicate);
}
};
}
public static <T> LogicalPredicate<Iterable<T>> subsetOf(final Iterable<? extends T> superset) {
return forAll(in(superset));
}
public static <T> LogicalPredicate<Iterable<T>> supersetOf(final Iterable<? extends T> subset) {
return new LogicalPredicate<Iterable<T>>() {
public boolean matches(Iterable<T> superset) {
return sequence(subset).forAll(in(superset));
}
};
}
public static <T> LogicalPredicate<Iterable<T>> setEqualityWith(final Iterable<? extends T> other) {
return new LogicalPredicate<Iterable<T>>() {
public boolean matches(Iterable<T> iterable) {
return set(iterable).equals(set(other));
}
};
}
@SafeVarargs
public static <T> LogicalPredicate<T> in(final T... values) {
return in(sequence(values));
}
public static <T> LogicalPredicate<T> in(final Iterable<? extends T> values) {
return InPredicate.in(values);
}
public static <T> LogicalPredicate<T> in(final Collection<? extends T> values) {
return InPredicate.in(values);
}
public static LogicalPredicate<Either> isLeft() {
return new LogicalPredicate<Either>() {
public boolean matches(Either either) {
return either.isLeft();
}
};
}
public static LogicalPredicate<Either> isRight() {
return new LogicalPredicate<Either>() {
public boolean matches(Either either) {
return either.isRight();
}
};
}
public static <T> LogicalPredicate<T> onlyOnce(final Predicate<? super T> predicate) {
return new OnlyOnce<T>(predicate);
}
public static <T> LogicalPredicate<T> instanceOf(final Class<?> t) {
return new InstanceOf<T>(t);
}
public static <A, B extends A> LogicalPredicate<A> instanceOf(Class<B> subCLass, Predicate<B> predicate) {
return logicalPredicate((A other) ->
subCLass.isInstance(other) && predicate.matches(subCLass.cast(other))
);
}
public static <T> LogicalPredicate<T> equalTo(final T t) {
return EqualsPredicate.equalTo(t);
}
public static <T> LogicalPredicate<T> is(final T t) {
return equalTo(t);
}
public static <S, T extends Predicate<S>> T is(final T t) {
return t;
}
@SafeVarargs
public static <T> LogicalPredicate<T> and(final Predicate<? super T>... predicates) {
return and(Sequences.sequence(predicates));
}
public static <T> LogicalPredicate<T> and(final Iterable<? extends Predicate<? super T>> predicates) {
return AndPredicate.and(predicates);
}
public static <T> LogicalPredicate<T> or() {
return OrPredicate.or(Sequences.<Predicate<T>>empty());
}
public static <T> LogicalPredicate<T> or(final Predicate<? super T> first) {
return logicalPredicate(first);
}
public static <T> LogicalPredicate<T> or(final Predicate<? super T> first, final Predicate<? super T> second) {
return or(Sequences.<Predicate<? super T>>sequence(first, second));
}
public static <T> LogicalPredicate<T> or(final Predicate<? super T> first, final Predicate<? super T> second, final Predicate<? super T> third) {
return or(Sequences.<Predicate<? super T>>sequence(first, second, third));
}
public static <T> LogicalPredicate<T> or(final Predicate<? super T> first, final Predicate<? super T> second, final Predicate<? super T> third, final Predicate<? super T> fourth) {
return or(Sequences.<Predicate<? super T>>sequence(first, second, third, fourth));
}
public static <T> LogicalPredicate<T> or(final Predicate<? super T> first, final Predicate<? super T> second, final Predicate<? super T> third, final Predicate<? super T> fourth, final Predicate<? super T> fifth) {
return or(Sequences.<Predicate<? super T>>sequence(first, second, third, fourth, fifth));
}
@SafeVarargs
public static <T> LogicalPredicate<T> or(final Predicate<? super T>... predicates) {
return or(Sequences.sequence(predicates));
}
public static <T> LogicalPredicate<T> or(final Iterable<? extends Predicate<? super T>> predicates) {
return OrPredicate.or(predicates);
}
public static <T> LogicalPredicate<T> not(final T t) {
return not(is(t));
}
public static <T> LogicalPredicate<T> not(final Predicate<? super T> t) {
return Not.not(t);
}
public static LogicalPredicate<Object> countTo(final Number count) {
return new CountTo(count);
}
public static <T> LogicalPredicate<T> whileTrue(final Predicate<? super T> t) {
return new WhileTrue<>(t);
}
public static <T> LogicalPredicate<T> whileFalse(final Predicate<? super T> t) {
return whileTrue(t).not();
}
public static <T> LogicalPredicate<T> nullValue() {
return new NullPredicate<T>();
}
public static <T> LogicalPredicate<T> nullValue(final Class<T> type) {
return nullValue();
}
public static <T> LogicalPredicate<T> notNullValue() {
return not(nullValue());
}
public static <T> LogicalPredicate<T> notNullValue(final Class<T> aClass) {
return notNullValue();
}
@Deprecated // will be removed after 950. Use flatMap instead.
public static <T> LogicalPredicate<Option<T>> some(final Class<T> aClass) {
return some();
}
@Deprecated // will be removed after 950. Use flatMap instead.
public static <T> LogicalPredicate<Option<T>> some() {
return new LogicalPredicate<Option<T>>() {
public final boolean matches(Option<T> other) {
return !other.isEmpty();
}
};
}
public static LogicalPredicate<Class<?>> assignableTo(final Object o) {
return new LogicalPredicate<Class<?>>() {
public boolean matches(Class<?> aClass) {
return isAssignableTo(o, aClass);
}
};
}
public static LogicalPredicate<Object> assignableTo(final Class<?> aClass) {
return new LogicalPredicate<Object>() {
public boolean matches(Object o) {
return isAssignableTo(o, aClass);
}
};
}
public static boolean isAssignableTo(Object o, Class<?> aClass) {
if (o == null) return false;
return aClass.isAssignableFrom(o.getClass());
}
public static LogicalPredicate<Class<?>> classAssignableFrom(final Class<?> aClass) {
return new LogicalPredicate<Class<?>>() {
@Override
public boolean matches(Class<?> other) {
return other.isAssignableFrom(aClass);
}
};
}
public static LogicalPredicate<Class<?>> classAssignableTo(final Class<?> aClass) {
return new LogicalPredicate<Class<?>>() {
@Override
public boolean matches(Class<?> other) {
return aClass.isAssignableFrom(other);
}
};
}
public static <T, R> LogicalPredicate<T> where(final Function1<? super T, ? extends R> callable, final Predicate<? super R> predicate) {
return WherePredicate.where(callable, predicate);
}
public static <T, R> LogicalPredicate<T> by(final Function1<? super T, ? extends R> callable, final Predicate<? super R> predicate) {
return WherePredicate.where(callable, predicate);
}
public static <T> LogicalPredicate<Predicate<T>> matches(final T instance) {
return new LogicalPredicate<Predicate<T>>() {
@Override
public boolean matches(Predicate<T> predicate) {
return predicate.matches(instance);
}
};
}
public static <T extends Comparable<? super T>> LogicalPredicate<T> greaterThan(final T comparable) {
return GreaterThanPredicate.greaterThan(comparable);
}
public static <T extends Comparable<? super T>> LogicalPredicate<T> greaterThanOrEqualTo(final T comparable) {
return new GreaterThanOrEqualToPredicate<T>(comparable);
}
public static <T extends Comparable<? super T>> LogicalPredicate<T> lessThan(final T comparable) {
return LessThanPredicate.lessThan(comparable);
}
public static <T extends Comparable<? super T>> LogicalPredicate<T> lessThanOrEqualTo(final T comparable) {
return LessThanOrEqualToPredicate.lessThanOrEqualTo(comparable);
}
public static <T extends Comparable<? super T>> LogicalPredicate<T> between(final T lower, final T upper) {
return new BetweenPredicate<T>(lower, upper);
}
public static Predicate<Pair> equalTo() {
return pair -> pair.first().equals(pair.second());
}
public static <T> LogicalPredicate<Iterable<T>> empty() {
return new LogicalPredicate<Iterable<T>>() {
public boolean matches(Iterable<T> other) {
return sequence(other).isEmpty();
}
};
}
public static <T> LogicalPredicate<Iterable<T>> empty(Class<T> aClass) {
return empty();
}
public static <T> LogicalPredicate<T> predicate(final Function1<T, Boolean> callable) {
return new LogicalPredicate<T>() {
@Override
public boolean matches(T other) {
Boolean result = function(callable).apply(other);
return result == null ? false : result;
}
};
}
public static <F> LogicalPredicate<First<F>> first(Predicate<? super F> predicate) {
return where(Callables.<F>first(), predicate);
}
public static <S> LogicalPredicate<Second<S>> second(Predicate<? super S> predicate) {
return where(Callables.<S>second(), predicate);
}
public static <T> LogicalPredicate<T> sameInstance(T expected) {
return new LogicalPredicate<T>() {
@Override
public boolean matches(T other) {
return expected == other;
}
@Override
public String toString() {
return "sameInstance(" + expected + ")";
}
};
}
}