|  | // Copyright (c) 2011, the Dart 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. | 
|  |  | 
|  | part of dart.core; | 
|  |  | 
|  | /// The signature of a generic comparison function. | 
|  | /// | 
|  | /// A comparison function represents an ordering on a type of objects. | 
|  | /// A total ordering on a type means that for two values, either they | 
|  | /// are equal or one is greater than the other (and the latter must then be | 
|  | /// smaller than the former). | 
|  | /// | 
|  | /// A [Comparator] function represents such a total ordering by returning | 
|  | /// | 
|  | /// * a negative integer if [a] is smaller than [b], | 
|  | /// * zero if [a] is equal to [b], and | 
|  | /// * a positive integer if [a] is greater than [b]. | 
|  | typedef Comparator<T> = int Function(T a, T b); | 
|  |  | 
|  | /// Interface used by types that have an intrinsic ordering. | 
|  | /// | 
|  | /// The [compareTo] operation defines a total ordering of objects, | 
|  | /// which can be used for ordering and sorting. | 
|  | /// | 
|  | /// The [Comparable] interface should be used for the natural ordering of a type. | 
|  | /// If a type can be ordered in more than one way, | 
|  | /// and none of them is the obvious natural ordering, | 
|  | /// then it might be better not to use the [Comparable] interface, | 
|  | /// and to provide separate [Comparator]s instead. | 
|  | /// | 
|  | /// It is recommended that the order of a [Comparable] agrees | 
|  | /// with its operator [operator ==] equality (`a.compareTo(b) == 0` iff `a == b`), | 
|  | /// but this is not a requirement. | 
|  | /// For example, [double] and [DateTime] have `compareTo` methods | 
|  | /// that do not agree with operator [operator ==]. | 
|  | /// For doubles the [compareTo] method is more precise than the equality, | 
|  | /// and for [DateTime] it is less precise. | 
|  | /// | 
|  | /// Examples: | 
|  | /// ```dart | 
|  | /// (0.0).compareTo(-0.0);   // => 1 | 
|  | /// 0.0 == -0.0;             // => true | 
|  | /// var now = DateTime.now(); | 
|  | /// var utcNow = now.toUtc(); | 
|  | /// now == utcNow;           // => false | 
|  | /// now.compareTo(utcNow);   // => 0 | 
|  | /// ``` | 
|  | /// The [Comparable] interface does not imply the existence | 
|  | /// of the comparison operators `<`, `<=`, `>` and `>=`. | 
|  | /// These should only be defined | 
|  | /// if the ordering is a less-than/greater-than ordering, | 
|  | /// that is, an ordering where you would naturally | 
|  | /// use the words "less than" about the order of two elements. | 
|  | /// | 
|  | /// If the equality operator and [compareTo] disagree, | 
|  | /// the comparison operators should follow the equality operator, | 
|  | /// and will likely also disagree with [compareTo]. | 
|  | /// Otherwise they should match the [compareTo] method, | 
|  | /// so that `a < b` iff `a.compareTo(b) < 0`. | 
|  | /// | 
|  | /// The [double] class defines comparison operators | 
|  | /// that are compatible with equality. | 
|  | /// The operators differ from [double.compareTo] on -0.0 and NaN. | 
|  | /// | 
|  | /// The [DateTime] class has no comparison operators, instead it has the more | 
|  | /// precisely named [DateTime.isBefore] and [DateTime.isAfter], which both | 
|  | /// agree with [DateTime.compareTo]. | 
|  | abstract class Comparable<T> { | 
|  | /// Compares this object to another object. | 
|  | /// | 
|  | /// Returns a value like a [Comparator] when comparing `this` to [other]. | 
|  | /// That is, it returns a negative integer if `this` is ordered before [other], | 
|  | /// a positive integer if `this` is ordered after [other], | 
|  | /// and zero if `this` and [other] are ordered together. | 
|  | /// | 
|  | /// The [other] argument must be a value that is comparable to this object. | 
|  | int compareTo(T other); | 
|  |  | 
|  | /// A [Comparator] that compares one comparable to another. | 
|  | /// | 
|  | /// It returns the result of `a.compareTo(b)`. | 
|  | /// The call may fail at run-time | 
|  | /// if `a` is not comparable to the type of `b`. | 
|  | /// | 
|  | /// This utility function is used as the default comparator | 
|  | /// for ordering collections, for example in the [List] sort function. | 
|  | static int compare(Comparable a, Comparable b) => a.compareTo(b); | 
|  | } |