public ResourceAmounts append(ResourceAmounts amounts) {
   return ResourceAmounts.of(
       getCpu() + amounts.getCpu(),
       getMemory() + amounts.getMemory(),
       getDiskIO() + amounts.getDiskIO(),
       getNetworkIO() + amounts.getNetworkIO());
 }
 public ResourceAmounts subtract(ResourceAmounts amounts) {
   return ResourceAmounts.of(
       getCpu() - amounts.getCpu(),
       getMemory() - amounts.getMemory(),
       getDiskIO() - amounts.getDiskIO(),
       getNetworkIO() - amounts.getNetworkIO());
 }
@Value.Immutable
@BuckStyleImmutable
abstract class AbstractResourceAmounts {
  @Value.Parameter
  public abstract int getCpu();

  @Value.Parameter
  public abstract int getMemory();

  @Value.Parameter
  public abstract int getDiskIO();

  @Value.Parameter
  public abstract int getNetworkIO();

  public static final ResourceAmounts ZERO = ResourceAmounts.of(0, 0, 0, 0);

  public ResourceAmounts append(ResourceAmounts amounts) {
    return ResourceAmounts.of(
        getCpu() + amounts.getCpu(),
        getMemory() + amounts.getMemory(),
        getDiskIO() + amounts.getDiskIO(),
        getNetworkIO() + amounts.getNetworkIO());
  }

  public ResourceAmounts subtract(ResourceAmounts amounts) {
    return ResourceAmounts.of(
        getCpu() - amounts.getCpu(),
        getMemory() - amounts.getMemory(),
        getDiskIO() - amounts.getDiskIO(),
        getNetworkIO() - amounts.getNetworkIO());
  }

  public boolean containsValuesLessThan(ResourceAmounts amounts) {
    return getCpu() < amounts.getCpu()
        || getMemory() < amounts.getMemory()
        || getDiskIO() < amounts.getDiskIO()
        || getNetworkIO() < amounts.getNetworkIO();
  }

  public boolean containsValuesGreaterThan(ResourceAmounts amounts) {
    return amounts.containsValuesLessThan(ResourceAmounts.copyOf(this));
  }
}
 public boolean containsValuesGreaterThan(ResourceAmounts amounts) {
   return amounts.containsValuesLessThan(ResourceAmounts.copyOf(this));
 }
 public boolean containsValuesLessThan(ResourceAmounts amounts) {
   return getCpu() < amounts.getCpu()
       || getMemory() < amounts.getMemory()
       || getDiskIO() < amounts.getDiskIO()
       || getNetworkIO() < amounts.getNetworkIO();
 }