Module: Sumhash::OpenStruct

Included in:
OpenStruct
Defined in:
lib/sumhash/ostruct.rb

Constant Summary collapse

NUMBER_CLASSES =
[Integer, Fixnum, Bignum, Float, Rational]
SUPPORTED_CLASSES =
NUMBER_CLASSES + [Hash, OpenStruct]

Instance Method Summary collapse

Instance Method Details

#*(num) ⇒ Object

Multiplication

Raises:

  • (TypeError)


50
51
52
53
54
55
56
57
# File 'lib/sumhash/ostruct.rb', line 50

def *(num)
  raise TypeError, "#{num.class} can't be coerced into Float" unless NUMBER_CLASSES.include? num.class
  self._fields.inject(OpenStruct.new) do |res, f|
    v = self.__send__(f)
    res.__send__(:"#{f}=", SUPPORTED_CLASSES.include?(v.class) && !v.kind_of?(String) ? v * num.to_f : v)
    res
  end
end

#+(os) ⇒ Object

Plus



10
11
12
13
14
15
# File 'lib/sumhash/ostruct.rb', line 10

def +(os)
  (self._fields + os._fields).inject(OpenStruct.new) do |sum, f|
    sum.__send__(:"#{f}=", sum(self.__send__(f), os.__send__(f)))
    sum
  end
end

#+@Object

Unary plus



35
36
37
# File 'lib/sumhash/ostruct.rb', line 35

def +@
  self
end

#-(os) ⇒ Object

Minus



18
19
20
21
22
23
# File 'lib/sumhash/ostruct.rb', line 18

def -(os)
  (self._fields + os._fields).inject(OpenStruct.new) do |sum, f|
    sum.__send__(:"#{f}=", sum(self.__send__(f), os.__send__(f), :-))
    sum
  end
end

#-@Object

Unary minus



26
27
28
29
30
31
32
# File 'lib/sumhash/ostruct.rb', line 26

def -@
  self._fields.inject(OpenStruct.new) do |res, f|
    v = self.__send__(f)
    res.__send__(:"#{f}=", SUPPORTED_CLASSES.include?(v.class) ? -v : v)
    res
  end
end

#/(num) ⇒ Object

Division

Raises:

  • (TypeError)


40
41
42
43
44
45
46
47
# File 'lib/sumhash/ostruct.rb', line 40

def /(num)
  raise TypeError, "#{num.class} can't be coerced into Float" unless NUMBER_CLASSES.include? num.class
  self._fields.inject(OpenStruct.new) do |res, f|
    v = self.__send__(f)
    res.__send__(:"#{f}=", SUPPORTED_CLASSES.include?(v.class) ? v / num.to_f : v)
    res
  end
end

#_fieldsObject



5
6
7
# File 'lib/sumhash/ostruct.rb', line 5

def _fields
  @table.keys.map(&:to_sym)
end