scala.math.PartialOrdering.scala Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of scala-library Show documentation
Show all versions of scala-library Show documentation
Standard library for the SubScript extension of the Scala Programming Language
The newest version!
/* __ *\
** ________ ___ / / ___ Scala API **
** / __/ __// _ | / / / _ | (c) 2003-2013, LAMP/EPFL **
** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
** /____/\___/_/ |_/____/_/ | | **
** |/ **
\* */
package scala
package math
/** A trait for representing partial orderings. It is important to
* distinguish between a type that has a partial order and a representation
* of partial ordering on some type. This trait is for representing the
* latter.
*
* A [[http://en.wikipedia.org/wiki/Partial_order partial ordering]] is a
* binary relation on a type `T`, exposed as the `lteq` method of this trait.
* This relation must be:
*
* - reflexive: `lteq(x, x) == '''true'''`, for any `x` of type `T`.
* - anti-symmetric: if `lteq(x, y) == '''true'''` and
* `lteq(y, x) == '''true'''`
* then `equiv(x, y) == '''true'''`, for any `x` and `y` of type `T`.
* - transitive: if `lteq(x, y) == '''true'''` and
* `lteq(y, z) == '''true'''` then `lteq(x, z) == '''true'''`,
* for any `x`, `y`, and `z` of type `T`.
*
* Additionally, a partial ordering induces an
* [[http://en.wikipedia.org/wiki/Equivalence_relation equivalence relation]]
* on a type `T`: `x` and `y` of type `T` are equivalent if and only if
* `lteq(x, y) && lteq(y, x) == '''true'''`. This equivalence relation is
* exposed as the `equiv` method, inherited from the
* [[scala.math.Equiv Equiv]] trait.
*
* @author Geoffrey Washburn
* @version 1.0, 2008-04-0-3
* @since 2.7
*/
trait PartialOrdering[T] extends Equiv[T] {
outer =>
/** Result of comparing `x` with operand `y`.
* Returns `None` if operands are not comparable.
* If operands are comparable, returns `Some(r)` where
* - `r < 0` iff `x < y`
* - `r == 0` iff `x == y`
* - `r > 0` iff `x > y`
*/
def tryCompare(x: T, y: T): Option[Int]
/** Returns `'''true'''` iff `x` comes before `y` in the ordering.
*/
def lteq(x: T, y: T): Boolean
/** Returns `'''true'''` iff `y` comes before `x` in the ordering.
*/
def gteq(x: T, y: T): Boolean = lteq(y, x)
/** Returns `'''true'''` iff `x` comes before `y` in the ordering
* and is not the same as `y`.
*/
def lt(x: T, y: T): Boolean = lteq(x, y) && !equiv(x, y)
/** Returns `'''true'''` iff `y` comes before `x` in the ordering
* and is not the same as `x`.
*/
def gt(x: T, y: T): Boolean = gteq(x, y) && !equiv(x, y)
/** Returns `'''true'''` iff `x` is equivalent to `y` in the ordering.
*/
def equiv(x: T, y: T): Boolean = lteq(x,y) && lteq(y,x)
def reverse : PartialOrdering[T] = new PartialOrdering[T] {
override def reverse = outer
def lteq(x: T, y: T) = outer.lteq(y, x)
def tryCompare(x: T, y: T) = outer.tryCompare(y, x)
}
}