package tc.oc.commons.core.inject;
import java.util.function.Predicate;
import com.google.inject.Binding;
import com.google.inject.Key;
import com.google.inject.TypeLiteral;
import com.google.inject.matcher.Matcher;
import tc.oc.commons.core.reflect.Types;
import tc.oc.commons.core.util.FunctionalMatcher;
public class Matchers {
public static <T> Matcher<T> predicate(Predicate<T> predicate) {
return (FunctionalMatcher<T>) predicate::test;
}
public static Matcher<? extends TypeLiteral<?>> subtypesOf(TypeLiteral<?> type) {
return (FunctionalMatcher<? extends TypeLiteral<?>>) t -> Types.isAssignable(type, t);
}
public static Matcher<? extends Binding<?>> bindingsForKeys(Matcher<? super Key<?>> keys) {
return (FunctionalMatcher<? extends Binding<?>>) binding -> keys.matches(binding.getKey());
}
public static Matcher<? extends Binding<?>> bindingsForTypeLiterals(Matcher<? super TypeLiteral<?>> types) {
return (FunctionalMatcher<? extends Binding<?>>) binding -> types.matches(binding.getKey().getTypeLiteral());
}
public static Matcher<? extends Binding<?>> bindingsForClasses(Matcher<? super Class<?>> types) {
return (FunctionalMatcher<? extends Binding<?>>) binding -> types.matches(binding.getKey().getTypeLiteral().getRawType());
}
public static Matcher<? extends Binding<?>> bindingsForSubtypesOf(TypeLiteral<?> type) {
return bindingsForTypeLiterals((Matcher<TypeLiteral<?>>) subtypesOf(type));
}
public static Matcher<? extends Binding<?>> bindingsForSubtypesOf(Class<?> type) {
return bindingsForSubtypesOf(TypeLiteral.get(type));
}
}