package xapi.fu; /** * @author James X. Nelson (james@wetheinter.net) * Created on 2/14/16. */ public interface Filter<T> { Filter TRUE = args->true; Filter FALSE = args->false; boolean filter(T ... args); interface Filter1 <T> extends Filter<T> { boolean filter1(T item); @Override default boolean filter(T... args) { for (T arg : args) { if (!filter1(arg)) { return false; } } return true; } } interface Filter1Unsafe <T> extends Filter1<T>, Rethrowable { boolean filter1Unsafe(T item) throws Exception; @Override default boolean filter1(T args) { try { return filter1Unsafe(args); } catch (Exception e) { throw rethrow(e); } } } interface Filter2 <S, O extends S, T extends S> extends Filter<S> { boolean filter2(O one, T two); @Override default boolean filter(S ... args) { for (int i = 0; i < args.length; i+= 2) { O one = (O) args[i]; T two = (T) args[i+1]; if (!filter2(one, two)) { return false; } } return true; } } interface Filter2Unsafe <S, O extends S, T extends S> extends Filter2<S, O, T>, Rethrowable { boolean filter2Unsafe(O one, T two) throws Exception; @Override default boolean filter2(O one, T two) { try { return filter2Unsafe(one, two); } catch (Exception e) { throw rethrow(e); } } } static <T> Filter1<T> filter1(Filter1<T> filter) { return filter; } static <T> Filter1<T> referenceFilter(T value) { return t->t==value; } static <T> Filter1<T> equalsFilter(T value) { if (value == null) { return t->t==null; } return value::equals; } static <T> Filter1<T> filter1Unsafe(Filter1Unsafe<T> filter) { return filter; } static <S, O extends S, T extends S> Filter2<S, O, T> filter2(Filter2<S, O, T> filter) { return filter; } static <S, O extends S, T extends S> Filter2<S, O, T> filter2Unsafe(Filter2Unsafe<S, O, T> filter) { return filter; } static Filter<Throwable> alwaysTrue() { return TRUE; } static Filter<Throwable> alwaysFalse() { return FALSE; } }