public boolean isEquivalent(ModelRule op) {
		if (assign == null && op.assign == null) {
			// Nothing to compare
		}
		else if (assign != null && op.assign != null) {
			if (!assign.isEquivalent(op.assign)) {
				return false;
			}
		}
		else {
			return false;
		}
		if (filter == null && op.filter == null) {
			// Nothing to compare
		}
		else if (filter != null && op.filter != null) {
			if (!filter.isEquivalent(op.filter)) {
				return false;
			}
		}
		else {
			return false;
		}
		if (qualifier == null && op.qualifier == null) {
			// Nothing to compare
		}
		else if (qualifier != null && op.qualifier != null) {
			if (!qualifier.isEquivalent(op.qualifier)) {
				return false;
			}
		}
		else {
			return false;
		}
		if (sideeffects.length != op.sideeffects.length) {
			return false;
		}
		for (int i = 0; i < sideeffects.length; ++i) {
			if (!sideeffects[i].isEquivalent(op.sideeffects[i])) {
				return false;
			}
		}
		return true;
	}
Construct from components

The provided components are cloned into the new object.
@param typeFilter is the data-type filter the rule applies before performing the action
@param action is the action that will be applied
@param res is the resource list to which this rule will be applied
@throws InvalidInputException if necessary resources are missing from the list
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/lang/protorules/ModelRule.java