"""The general contract for values whose magnitude can be compared. `Comparable` imposes a total ordering upon instances of any type that satisfies the interface. If a type `T` satisfies `Comparable<T>`, then instances of `T` may be compared using the comparison operators `<`, `>`, `<=`, `>=`. assert (x>=0.0); A _ternary comparison_ is useful for asserting lower and upper bounds. assert (0.0<=x<1.0); Finally, the _compare_ operator `<=>` may be used to produce an instance of [[Comparison]]. switch (x<=>y) case (equal) { print("same same"); } case (smaller) { print("x smaller"); } case (larger) { print("y smaller"); } The total order of a type must be consistent with the definition of equality for the type. That is, there are three mutually exclusive possibilities: - `x<y`, - `x>y`, or - `x==y` (These possibilities are expressed by the enumerated instances [[smaller]], [[larger]], and [[equal]] of `Comparison`.) The order imposed by `Comparable` is sometimes called the _natural order_ of a type, to reflect the fact that any function of type `Comparison(T,T)` might determine a different order. Thus, some order-related operations come in two flavors: a flavor that depends upon the natural order, and a flavor which accepts an arbitrary comparator function. Examples are: - [[sort]] vs [[Iterable.sort]] and - [[max]] vs [[Iterable.max]].""" see (`class Comparison`, `function sort`, `function max`, `function min`, `function largest`, `function smallest`) by ("Gavin") tagged("Comparisons") shared interface Comparable<in Other> of Other given Other satisfies Comparable<Other> { "Compares this value with the given value. Implementations must respect the constraints that: - `x==y` if and only if `x<=>y == equal` (consistency with `equals()`), - if `x>y` then `y<x` (symmetry), and - if `x>y` and `y>z` then `x>z` (transitivity)." see (`function equals`) shared formal Comparison compare(Other other); "Determines if this value is strictly larger than the given value." shared default Boolean largerThan(Other other) => compare(other)===larger; "Determines if this value is strictly smaller than the given value." shared default Boolean smallerThan(Other other) => compare(other)===smaller; "Determines if this value is larger than or equal to the given value." shared default Boolean notSmallerThan(Other other) => !compare(other)===smaller; "Determines if this value is smaller than or equal to the given value." shared default Boolean notLargerThan(Other other) => !compare(other)===larger; }