package net.varkhan.base.functor.predicate;
import net.varkhan.base.functor.Predicate;
/**
* <b></b>.
* <p/>
*
* @author varkhan
* @date 2/11/12
* @time 3:13 PM
*/
public abstract class AggregatePredicate<A,C> implements Predicate<A,C> {
protected final Predicate<A, C>[] preds;
public AggregatePredicate(Predicate<A, C>... preds) {
this.preds = preds;
}
public Predicate<A, C>[] components() {
return preds.clone();
}
public abstract boolean invoke(A arg, C ctx);
public static <A,C> AggregatePredicate<A,C> and(Predicate<A, C>... preds) {
return new AggregatePredicate<A,C>(preds) {
@Override
public boolean invoke(A arg, C ctx) {
for(Predicate<A, C> p: preds)
if(!p.invoke(arg, ctx)) return false;
return true;
}
@Override
public String toString() {
StringBuilder buf = new StringBuilder();
boolean f = true;
for(Predicate<A,C> p: preds) {
if(f) f = false;
else buf.append('&');
buf.append(p.toString());
}
return buf.toString();
}
};
}
public static <A,C> AggregatePredicate<A,C> nand(Predicate<A, C>... preds) {
return new AggregatePredicate<A,C>(preds) {
@Override
public boolean invoke(A arg, C ctx) {
for(Predicate<A, C> p: preds)
if(!p.invoke(arg, ctx)) return true;
return false;
}
@Override
public String toString() {
StringBuilder buf = new StringBuilder("!");
buf.append('(');
boolean f = true;
for(Predicate<A,C> p: preds) {
if(f) f = false;
else buf.append('&');
buf.append(p.toString());
}
buf.append(')');
return buf.toString();
}
};
}
public static <A,C> AggregatePredicate<A,C> or(Predicate<A, C>... preds) {
return new AggregatePredicate<A,C>(preds) {
@Override
public boolean invoke(A arg, C ctx) {
for(Predicate<A, C> p: preds)
if(p.invoke(arg, ctx)) return true;
return false;
}
@Override
public String toString() {
StringBuilder buf = new StringBuilder();
boolean f = true;
for(Predicate<A,C> p: preds) {
if(f) f = false;
else buf.append('|');
buf.append(p.toString());
}
return buf.toString();
}
};
}
public static <A,C> AggregatePredicate<A,C> nor(Predicate<A, C>... preds) {
return new AggregatePredicate<A,C>(preds) {
@Override
public boolean invoke(A arg, C ctx) {
for(Predicate<A, C> p: preds)
if(p.invoke(arg, ctx)) return false;
return true;
}
@Override
public String toString() {
StringBuilder buf = new StringBuilder("!");
buf.append('(');
boolean f = true;
for(Predicate<A,C> p: preds) {
if(f) f = false;
else buf.append('|');
buf.append(p.toString());
}
buf.append(')');
return buf.toString();
}
};
}
protected String toString(String op) {
StringBuilder buf = new StringBuilder(op);
buf.append('(');
boolean f = true;
for(Predicate<A,C> p: preds) {
if(f) f = false;
else buf.append(',');
buf.append(p.toString());
}
buf.append(')');
return buf.toString();
}
@Override
public String toString() {
return toString(this.getClass().getSimpleName());
}
}