sbt/util/complete/UpperBound.scala

47 lines
1.4 KiB
Scala

/* sbt -- Simple Build Tool
* Copyright 2008,2010 Mark Harrah
*/
package sbt.complete
sealed trait UpperBound
{
/** True if and only if the given value meets this bound.*/
def >=(min: Int): Boolean
/** True if and only if this bound is one.*/
def isOne: Boolean
/** True if and only if this bound is zero.*/
def isZero: Boolean
/** If this bound is zero or Infinite, `decrement` returns this bound.
* Otherwise, this bound is finite and greater than zero and `decrement` returns the bound that is one less than this bound.*/
def decrement: UpperBound
/** True if and only if this is unbounded.*/
def isInfinite: Boolean
}
/** Represents unbounded. */
case object Infinite extends UpperBound
{
/** All finite numbers meet this bound. */
def >=(min: Int) = true
def isOne = false
def isZero = false
def decrement = this
def isInfinite = true
override def toString = "Infinity"
}
/** Represents a finite upper bound. The maximum allowed value is 'value', inclusive.
* It must positive. */
final case class Finite(value: Int) extends UpperBound
{
assume(value >= 0, "Maximum occurences must be nonnegative.")
def >=(min: Int) = value >= min
def isOne = value == 1
def isZero = value == 0
def decrement = Finite( (value - 1) max 0 )
def isInfinite = false
override def toString = value.toString
}
object UpperBound
{
implicit def intToFinite(i: Int): Finite = Finite(i)
}