// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.utils.structural;

/** An ordered type is a type with a total order. */
public interface Ordered<T> extends Equatable<T>, Comparable<T> {

  /** Definition of total order. */
  @Override
  int compareTo(T other);

  /** Default equality is now defined by the order. */
  @Override
  default boolean isEqualTo(T other) {
    assert other != null;
    return this == other || compareTo(other) == 0;
  }

  static <T extends Ordered<T>> T min(T o1, T o2) {
    return o1.isLessThan(o2) ? o1 : o2;
  }

  static <T extends Ordered<T>> T max(T o1, T o2) {
    return o1.isLessThan(o2) ? o2 : o1;
  }

  static <T extends Ordered<T>> T minIgnoreNull(T o1, T o2) {
    if (o1 == null) {
      return o2;
    }
    if (o2 == null) {
      return o1;
    }
    return min(o1, o2);
  }

  static <T extends Ordered<T>> T maxIgnoreNull(T o1, T o2) {
    if (o1 == null) {
      return o2;
    }
    if (o2 == null) {
      return o1;
    }
    return o1.isLessThan(o2) ? o2 : o1;
  }

  default boolean isLessThan(T other) {
    return compareTo(other) < 0;
  }

  default boolean isLessThanOrEqualTo(T other) {
    return compareTo(other) <= 0;
  }

  default boolean isGreaterThan(T other) {
    return compareTo(other) > 0;
  }

  default boolean isGreaterThanOrEqualTo(T other) {
    return compareTo(other) >= 0;
  }
}
