package sbt.complete
sealed trait UpperBound
{
def >=(min: Int): Boolean
def isOne: Boolean
def isZero: Boolean
def decrement: UpperBound
def isInfinite: Boolean
}
case object Infinite extends UpperBound
{
def >=(min: Int) = true
def isOne = false
def isZero = false
def decrement = this
def isInfinite = true
override def toString = "Infinity"
}
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)
}