calog/vendor/mruby/mrblib/numeric.rb
2026-07-04 20:25:00 -05:00

160 lines
2.6 KiB
Ruby
Vendored

##
# Numeric
#
# ISO 15.2.7
class Numeric
include Comparable
##
# Returns the receiver simply.
#
# ISO 15.2.7.4.1
def +@
self
end
##
# Returns the receiver's value, negated.
#
# ISO 15.2.7.4.2
def -@
0 - self
end
##
# Returns the absolute value of the receiver.
#
# ISO 15.2.7.4.3
def abs
if self < 0
-self
else
self
end
end
end
##
# Integer
#
# ISO 15.2.8
##
class Integer
##
# Calls the given block once for each Integer
# from `self` downto `num`.
#
# ISO 15.2.8.3.15
def downto(num, &block)
return to_enum(:downto, num) unless block
i = self.to_i
while i >= num
yield i
i -= 1
end
self
end
##
# Returns self + 1
#
# ISO 15.2.8.3.19
def next
self + 1
end
# ISO 15.2.8.3.21
alias succ next
##
# Calls the given block `self` times.
#
# ISO 15.2.8.3.22
def times(&block)
return to_enum(:times) unless block
i = 0
while i < self
yield i
i += 1
end
self
end
##
# Calls the given block once for each Integer
# from `self` upto `num`.
#
# ISO 15.2.8.3.27
def upto(num, &block)
return to_enum(:upto, num) unless block
i = self.to_i
while i <= num
yield i
i += 1
end
self
end
##
# Calls the given block from `self` to `num`
# incremented by `step` (default 1).
#
def step(num=nil, step=1, &block)
raise ArgumentError, "step can't be 0" if step == 0
return to_enum(:step, num, step) unless block
i = __coerce_step_counter(step)
if num == self || step.infinite?
block.call(i) if step > 0 && i <= (num||i) || step < 0 && i >= (num||-i)
elsif num == nil
while true
block.call(i)
i += step
end
elsif step > 0
while i <= num
block.call(i)
i += step
end
else
while i >= num
block.call(i)
i += step
end
end
self
end
end
class Float
##
# Calls the given block from `self` to `num`
# incremented by `step` (default 1).
#
def step(num=nil, step=1, &block)
raise ArgumentError, "step can't be 0" if step == 0
return to_enum(:step, num, step) unless block
i = self
if num == self || step.infinite?
block.call(i) if step > 0 && i <= (num||i) || step < 0 && i >= (num||-i)
elsif num == nil
while true
block.call(i)
i += step
end
elsif step > 0
while i <= num
block.call(i)
i += step
end
else
while i >= num
block.call(i)
i += step
end
end
self
end
end if Object.const_defined?(:Float)