code: function groupConstantsAndFractions(node) {
    let fractions = node.args.filter(Node.Type.isIntegerFraction);
    let constants = node.args.filter(Node.Type.isConstant);
  
    if (fractions.length === 0 || constants.length === 0) {
      throw Error('expected both integer fractions and constants, got ' + node);
    }
  
    if (fractions.length + constants.length !== node.args.length) {
      throw Error('can only evaluate integer fractions and constants');
    }
  
    constants = constants.map(node => {
      // set the changeGroup - this affects both the old and new node
      node.changeGroup = 1;
      // clone so that node and newNode aren't stored in the same memory
      return clone(node);
    });
    // wrap in parenthesis if there's more than one, to group them
    if (constants.length > 1) {
      constants = Node.Creator.parenthesis(Node.Creator.operator('+', constants));
    }
    else {
      constants = constants[0];
    }
  
    fractions = fractions.map(node => {
      // set the changeGroup - this affects both the old and new node
      node.changeGroup = 2;
      // clone so that node and newNode aren't stored in the same memory
      return clone(node);
    });
    // wrap in parenthesis if there's more than one, to group them
    if (fractions.length > 1) {
      fractions = Node.Creator.parenthesis(Node.Creator.operator('+', fractions));
    }
    else {
      fractions = fractions[0];
    }
  
    const newNode = Node.Creator.operator('+', [constants, fractions]);
    return Node.Status.nodeChanged(
      ChangeTypes.COLLECT_LIKE_TERMS, node, newNode);
  }
docs: If we can't combine using one of those functions, there's a mix of > 2 fractions and constants. So we need to group them together so we can later add them. Expects a node that is a sum of integer fractions and constants. Returns a Node.Status object. e.g. 2/3 + 5 + 5/2 => (2/3 + 5/2) + 5