fsm
type Predicate<S, E> = Box<Fn(&S, &E) -> bool>;
Predicates are used to filter down whether a transition can occur