removeConflictingTransitions method

  1. @visibleForTesting
Iterable<Transition<T>> removeConflictingTransitions(
  1. Iterable<Transition<T>> enabledTransitions
)

Selects for the highest targets in the tree (only needed when transitions come from a parallel state).

Implementation

@visibleForTesting
Iterable<Transition<T>> removeConflictingTransitions(
    Iterable<Transition<T>> enabledTransitions) {
  if (enabledTransitions.length <= 1) return enabledTransitions;

  // We have multiple transitions, which will happen when triggering
  // an event on a parallel state.
  final filteredTransitions = <Transition<T>>{};
  //toList sorts the transitions in the order of the states that selected them
  for (var t1 in enabledTransitions.sorted) {
    var t1Preempted = false;
    final transitionsToRemove = <Transition<T>>{};
    for (var t2 in filteredTransitions.sorted) {
      if (computeExitSet([t1])
          .intersection(computeExitSet([t2]))
          .isNotEmpty) {
        if (t1.source!.descendsFrom(t2.source!)) {
          transitionsToRemove.add(t2);
        } else {
          t1Preempted = true;
          break;
        }
      }
    }
    if (!t1Preempted) {
      filteredTransitions.removeAll(transitionsToRemove);
    }
    filteredTransitions.add(t1);
  }
  return filteredTransitions.sorted;
}