OR constructor

Implementation

OR(SemanticContext a, SemanticContext b) {
  var operands = <SemanticContext>{};
  if (a is OR) {
    operands.addAll(a.opnds);
  } else {
    operands.add(a);
  }
  if (b is OR) {
    operands.addAll(b.opnds);
  } else {
    operands.add(b);
  }

  final precedencePredicates =
      SemanticContext.filterPrecedencePredicates(operands);

  operands = SemanticContext.filterNonPrecedencePredicates(operands).toSet();
  if (precedencePredicates.isNotEmpty) {
    // interested in the transition with the highest precedence
    final reduced =
        precedencePredicates.reduce((a, b) => a.compareTo(b) >= 0 ? a : b);
    operands.add(reduced);
  }

  opnds = operands.toList();
}