code: public List<Interval<T>> complement(final Interval<T> op) throws MIDDException {
  
          final boolean disJoined = (this.lowerBound.compareTo(op.upperBound) >= 0) ||
                  (this.upperBound.compareTo(op.lowerBound) <= 0);
  
          if (disJoined) {
              Interval<T> newInterval = new Interval<>(this.lowerBound, this.upperBound);
  
              final boolean isLowerClosed;
              if (this.lowerBound.compareTo(op.upperBound) == 0) {
                  isLowerClosed = this.lowerBoundClosed && !op.upperBoundClosed;
              } else {
                  isLowerClosed = this.lowerBoundClosed;
              }
              newInterval.closeLeft(isLowerClosed);
  
              final boolean isUpperClosed;
              if (this.upperBound.compareTo(op.lowerBound) == 0) {
                  isUpperClosed = this.upperBoundClosed && !op.upperBoundClosed;
              } else {
                  isUpperClosed = this.upperBoundClosed;
              }
              newInterval.closeRight(isUpperClosed);
  
              // return empty if new interval is invalid
              if (!newInterval.validate()) {
                  return ImmutableList.of();
              }
              return ImmutableList.of(newInterval);
          } else {
              final Interval<T> interval1 = new Interval<>(this.lowerBound, op.lowerBound);
              final Interval<T> interval2 = new Interval<>(op.upperBound, this.upperBound);
  
              interval1.closeLeft(!interval1.isLowerInfinite() && this.lowerBoundClosed);
              interval1.closeRight(!interval1.isUpperInfinite() && !op.lowerBoundClosed);
  
              interval2.closeLeft(!interval2.isLowerInfinite() && !op.upperBoundClosed);
              interval2.closeRight(!interval2.isUpperInfinite() && this.upperBoundClosed);
  
              final List<Interval<T>> result = new ArrayList<>();
              if (interval1.validate()) {
                  result.add(interval1);
              }
              if (interval2.validate()) {
                  result.add(interval2);
              }
              return ImmutableList.copyOf(result);
          }
      }
docs: Return the complement section of the interval.
  
  @param op
  @return The complemented interval(s), or an empty list if the complement is empty.