package org.squirrelframework.foundation.fsm;
import java.util.List;
/**
* Constants conditions
*
* @author Henry.He
*
*/
public class Conditions {
public static <C> boolean isSatified(Condition<C> condition, C context) {
return condition!=null && context!=null && condition.isSatisfied(context);
}
public static <C> boolean isNotSatified(Condition<C> condition, C context) {
return condition==null || context==null || !condition.isSatisfied(context);
}
public static class Always<C> extends AnonymousCondition<C> {
@Override
public boolean isSatisfied(C context) {
return true;
}
}
public static <C> Condition<C> always() {
return new Always<C>();
}
public static class Never<C> extends AnonymousCondition<C> {
@Override
public boolean isSatisfied(C context) {
return false;
}
}
public static <C> Condition<C> never() {
return new Never<C>();
}
public static <C> Condition<C> and(final Condition<C> first, final Condition<C> second) {
return new Condition<C>() {
@Override
public boolean isSatisfied(C context) {
return first.isSatisfied(context) && second.isSatisfied(context);
}
@Override
public String name() {
return first.name()+"And"+second.name();
}
};
}
public static <C> Condition<C> and(final List<Condition<C>> conditions) {
return new Condition<C>() {
@Override
public boolean isSatisfied(C context) {
for (Condition<C> condition : conditions) {
if (!condition.isSatisfied(context)) {
return false;
}
}
return true;
}
@Override
public String name() {
String name = null;
for(Condition<C> c : conditions) {
if(name==null)
name=c.name();
else
name = name+"And"+c.name();
}
return name;
}
};
}
public static <C> Condition<C> or(final Condition<C> first, final Condition<C> second) {
return new Condition<C>() {
@Override
public boolean isSatisfied(C context) {
return first.isSatisfied(context) || second.isSatisfied(context);
}
@Override
public String name() {
return first.name()+"Or"+second.name();
}
};
}
public static <C> Condition<C> or(final List<Condition<C>> conditions) {
return new Condition<C>() {
@Override
public boolean isSatisfied(C context) {
for (Condition<C> condition : conditions) {
if (condition.isSatisfied(context)) {
return true;
}
}
return false;
}
@Override
public String name() {
String name = null;
for(Condition<C> c : conditions) {
if(name==null)
name=c.name();
else
name = name+"Or"+c.name();
}
return name;
}
};
}
public static <C> Condition<C> not(final Condition<C> condition) {
return new Condition<C>() {
@Override
public boolean isSatisfied(C context) {
return !condition.isSatisfied(context);
}
@Override
public String name() {
return "Not"+condition.name();
}
};
}
public static <C> Condition<C> xor(final Condition<C> first, final Condition<C> second) {
return new Condition<C>() {
@Override
public boolean isSatisfied(C context) {
return first.isSatisfied(context) ^ second.isSatisfied(context);
}
@Override
public String name() {
return first.name()+"Xor"+second.name();
}
};
}
}