AND constructor

Implementation

AND(SemanticContext a, SemanticContext b) {
  var operands = <SemanticContext>{};
  if (a is AND) {
    operands.addAll(a.opnds);
  } else {
    operands.add(a);
  }
  if (b is AND) {
    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 lowest precedence
    final reduced =
        precedencePredicates.reduce((a, b) => a.compareTo(b) <= 0 ? a : b);
    operands.add(reduced);
  }

  opnds = operands.toList();
}