lib/code/object/decimal.rb in code-ruby-0.11.0 vs lib/code/object/decimal.rb in code-ruby-0.12.0

- old
+ new

@@ -1,22 +1,19 @@ # frozen_string_literal: true class Code class Object - class Decimal < ::Code::Object::Number - attr_reader :raw - - def initialize(decimal, exponent: nil) - decimal = decimal.raw if decimal.is_a?(Decimal) - @raw = BigDecimal(decimal) - - return unless exponent - unless exponent.is_a?(Number) - raise ::Code::Error::TypeError, "exponent is not a number" - end - - @raw *= 10**exponent.raw + class Decimal < Object + def initialize(*args, **_kargs, &_block) + decimal = args.first || "0" + exponent = args.second || "0" + decimal = decimal.raw if decimal.is_an?(Object) + exponent = exponent.raw if exponent.is_an?(Object) + @raw = decimal.to_d * 10**exponent.to_d + super + rescue FloatDomainError => e + raise Error, "#{decimal.inspect} * 10**#{exponent.inspect} is invalid" end def self.name "Decimal" end @@ -26,53 +23,53 @@ arguments = args.fetch(:arguments, []) value = arguments.first&.value case operator.to_s when "%", "modulo" - sig(args) { Number } + sig(args) { Integer | Decimal } code_modulo(value) when "&", "bitwise_and" - sig(args) { Number } + sig(args) { Integer | Decimal } code_bitwise_and(value) when "*", "multiplication" - sig(args) { Number } + sig(args) { Integer | Decimal } code_multiplication(value) when "**", "power" - sig(args) { Number } + sig(args) { Integer | Decimal } code_power(value) when "+", "plus" sig(args) { Object.maybe } value ? code_plus(value) : self when "-", "minus" - sig(args) { Number.maybe } + sig(args) { (Integer | Decimal).maybe } value ? code_minus(value) : code_unary_minus when "/", "division" - sig(args) { Number } + sig(args) { Integer | Decimal } code_division(value) when "<", "inferior" - sig(args) { Number } + sig(args) { Integer | Decimal } code_inferior(value) when "<<", "left_shift" - sig(args) { Number } + sig(args) { Integer | Decimal } code_left_shift(value) when "<=", "inferior_or_equal" - sig(args) { Number } + sig(args) { Integer | Decimal } code_inferior_or_equal(value) when "<=>", "compare" - sig(args) { Number } + sig(args) { Integer | Decimal } code_compare(value) when ">", "superior" - sig(args) { Number } + sig(args) { Integer | Decimal } code_superior(value) when ">=", "superior_or_equal" - sig(args) { Number } + sig(args) { Integer | Decimal } code_superior_or_equal(value) when ">>", "right_shift" - sig(args) { Number } + sig(args) { Integer | Decimal } code_right_shift(value) when "^", "bitwise_xor" - sig(args) { Number } + sig(args) { Integer | Decimal } code_bitwise_xor(value) when "abs" sig(args) code_abs when "ceil" @@ -134,11 +131,11 @@ code_two? when "zero?" sig(args) code_zero? when "|", "bitwise_or" - sig(args) { Number } + sig(args) { Integer | Decimal } code_bitwise_or(value) else super end end @@ -224,11 +221,11 @@ def code_one? Boolean.new(raw == 1) end def code_plus(other) - if other.is_a?(Number) + if other.is_an?(Integer) || other.is_a?(Decimal) Decimal.new(raw + other.raw) else String.new(to_s + other.to_s) end end @@ -305,15 +302,23 @@ def inspect to_s end + def whole? + whole == raw + end + + def whole + raw.round + end + def to_s - raw.to_s("F") + whole? ? raw.to_i.to_s : raw.to_s("F") end def as_json(...) - raw.as_json(...) + whole? ? whole.as_json(...) : raw.as_json(...) end end end end