Infinity

A full featured Infinity class, supporting signed direction. Inifinty is a multiton based on direction The constant INFINITY is provided as the common case with direction=+1 (positive).

Besides being an class, these four constants are preset:

  NaN
  Inf
  PosInf
  NegInf

These four constants a built from two other basic constants:

  UNDEFINED
  INFINITY

In physical memory there are actually only three objects, namely three instances of InfinityClass, one for NaN, PosInf and NegInf, respectively.

Methods
+@ -@ <=> == coerce new times to_f to_s
Included Modules
Classes and Modules
Class InfinityClass::Numeric
Constants
UNDEFINED = InfinityClass.new(0)
  Set constant to positive infinity.
INFINITY = InfinityClass.new(1)
NaN = UNDEFINED
Inf = INFINITY
PosInf = +INFINITY
NegInf = -INFINITY
Attributes
[R] direction
Public Class methods
new(direction=1)
# File lib/more/facets/infinity.rb, line 73
  def initialize(direction=1)
    @direction = (direction <=> 0)
    super()
  end
Public Instance methods
+@()

Noop.

# File lib/more/facets/infinity.rb, line 90
  def +@
    self
  end
-@()

Change direction of infinity.

# File lib/more/facets/infinity.rb, line 80
  def -@
    case @direction
    when  0 : self.class.instance(0)
    when  1 : self.class.instance(-1)
    when -1 : self.class.instance(1)
    end
  end
<=>(other)

Comparision where infinity is alway greatest and negative infinityalways least.

# File lib/more/facets/infinity.rb, line 136
  def <=>(other)
    case other
    when InfinityClass
      @direction <=> other.direction
    else
      @direction
    end
  end
==(other)

Equality. Note that NaN != NaN.

# File lib/more/facets/infinity.rb, line 120
  def ==(other)
    case other
    when InfinityClass
      if @direction == 0 and other.direction == 0
        false
      else
        super
      end
    else
      false
    end
  end
coerce(other)

Coerce allows other numbers to be compared to infinity.

# File lib/more/facets/infinity.rb, line 109
  def coerce(other)
    case other
    when InfinityClass
      super
    else
      return -self, other
    end
  end
times() {|end| ...}

Gee, a real infinite loop!

# File lib/more/facets/infinity.rb, line 102
  def times
    loop do yield end
  end

  # Coerce allows other numbers to be
  # compared to infinity.

  def coerce(other)
    case other
    when InfinityClass
      super
    else
      return -self, other
    end
  end

  # Equality. Note that NaN != NaN.

  def ==(other)
    case other
    when InfinityClass
      if @direction == 0 and other.direction == 0
        false
      else
        super
      end
    else
      false
    end
  end

  # Comparision where infinity is alway greatest
  # and negative infinityalways least.

  def <=>(other)
    case other
    when InfinityClass
      @direction <=> other.direction
    else
      @direction
    end
  end

  #

  def to_s
    case @direction
    when  0  : "NaN"
    when  1  : "PosInf"
    when -1  : "NegInf"
    end
  end

end
to_f()

Convert to the float version of infinity.

# File lib/more/facets/infinity.rb, line 96
  def to_f
    (1.0/0) * @direction
  end
to_s()
# File lib/more/facets/infinity.rb, line 147
  def to_s
    case @direction
    when  0  : "NaN"
    when  1  : "PosInf"
    when -1  : "NegInf"
    end
  end