Effects combine(Effects other) {
    if (this.equals(other)) return this;
    Set<EffectQuantum> newEffects;
    if (this.effects.containsAll(other.effects)) {
      newEffects = this.effects;
    }
    else if (other.effects.containsAll(this.effects)) {
      newEffects = other.effects;
    }
    else {
      newEffects = new HashSet<>(this.effects);
      newEffects.addAll(other.effects);
      if (newEffects.contains(EffectQuantum.TopEffectQuantum)) {
        newEffects = TOP_EFFECTS;
      }
      newEffects = Set.copyOf(newEffects);
    }
    DataValue newReturnValue = this.returnValue.equals(other.returnValue) ? this.returnValue : DataValue.UnknownDataValue1;
    return new Effects(newReturnValue, newEffects);
  }
Effects combine(Effects other)