package org.glassfish.pfl.basic.fsm;
import org.glassfish.pfl.basic.func.BinaryFunction;
import org.glassfish.pfl.basic.func.BinaryPredicate;
public interface Guard {
enum Result { ENABLED, DISABLED, DEFERRED } ;
public Result evaluate( FSM fsm, Input in ) ;
public abstract class Base extends NameBase implements Guard {
public static abstract class SimpleName {
private String name ;
public SimpleName( String name ) {
this.name = name ;
}
@Override
public String toString() {
return name ;
}
}
public static abstract class Predicate extends SimpleName
implements BinaryPredicate<FSM,Input> {
public Predicate( String name ) {
super( name ) ;
}
}
public static abstract class IntFunc extends SimpleName
implements BinaryFunction<FSM,Input,Integer> {
public IntFunc( String name ) {
super( name ) ;
}
}
public static Guard makeGuard( final Predicate pred ) {
return new Guard.Base( pred.toString() ) {
@Override
public Guard.Result evaluate( FSM fsm, Input in ) {
return pred.evaluate( fsm, in ) ?
Result.ENABLED : Result.DISABLED ;
}
} ;
}
public static Predicate not( final Predicate pred ) {
return new Predicate( "!" + pred.toString() ) {
@Override
public boolean evaluate( final FSM fsm, final Input in ) {
return !pred.evaluate( fsm, in ) ;
}
} ;
}
public static Predicate and( final Predicate arg1, final Predicate arg2 ) {
return new Predicate( "(" + arg1.toString() + "&&" + arg2.toString() + ")" ) {
@Override
public boolean evaluate( final FSM fsm, final Input in ) {
if (!arg1.evaluate( fsm, in )) {
return false;
} else {
return arg2.evaluate(fsm, in);
}
}
} ;
}
public static Predicate or( final Predicate arg1, final Predicate arg2 ) {
return new Predicate( "(" + arg1.toString() + "||" + arg2.toString() + ")" ) {
@Override
public boolean evaluate( final FSM fsm, final Input in ) {
if (arg1.evaluate( fsm, in )) {
return true;
} else {
return arg2.evaluate(fsm, in);
}
}
} ;
}
public static IntFunc constant( final int val ) {
return new IntFunc( "constant(" + val + ")" ) {
@Override
public Integer evaluate( final FSM fsm, final Input input ) {
return val ;
}
} ;
}
public static Predicate lt( final IntFunc arg1, final IntFunc arg2 ) {
return new Predicate( "(" + arg1.toString()
+ "<" + arg2.toString() + ")" ) {
@Override
public boolean evaluate( final FSM fsm, final Input in ) {
return arg1.evaluate( fsm, in ) < arg2.evaluate( fsm, in ) ;
}
} ;
}
public static Predicate le( final IntFunc arg1, final IntFunc arg2 ) {
return new Predicate( "(" + arg1.toString()
+ "<=" + arg2.toString() + ")" ) {
@Override
public boolean evaluate( final FSM fsm, final Input in ) {
return arg1.evaluate( fsm, in ) <= arg2.evaluate( fsm, in ) ;
}
} ;
}
public static Predicate gt( final IntFunc arg1, final IntFunc arg2 ) {
return new Predicate( "(" + arg1.toString()
+ ">" + arg2.toString() + ")" ) {
@Override
public boolean evaluate( final FSM fsm, final Input in ) {
return arg1.evaluate( fsm, in ) > arg2.evaluate( fsm, in ) ;
}
} ;
}
public static Predicate ge( final IntFunc arg1, final IntFunc arg2 ) {
return new Predicate( "(" + arg1.toString()
+ ">=" + arg2.toString() + ")" ) {
@Override
public boolean evaluate( final FSM fsm, final Input in ) {
return arg1.evaluate( fsm, in ) >= arg2.evaluate( fsm, in ) ;
}
} ;
}
public static Predicate eq( final IntFunc arg1, final IntFunc arg2 ) {
return new Predicate( "(" + arg1.toString()
+ "==" + arg2.toString() + ")" ) {
@Override
public boolean evaluate( final FSM fsm, final Input in ) {
return arg1.evaluate( fsm, in ) == arg2.evaluate( fsm, in ) ;
}
} ;
}
public static Predicate ne( final IntFunc arg1, final IntFunc arg2 ) {
return new Predicate( "(" + arg1.toString()
+ "!=" + arg2.toString() + ")") {
@Override
public boolean evaluate( final FSM fsm, final Input in ) {
return arg1.evaluate( fsm, in ) != arg2.evaluate( fsm, in ) ;
}
} ;
}
public Base( String name ) { super( name ) ; }
}
}