Class: Seimi::Formula

Inherits:
Object
  • Object
show all
Defined in:
lib/seimi/formula.rb,
lib/seimi/formula/parser.rb

Defined Under Namespace

Classes: Component, Parser

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(source, composition, balance_composition, components, charge) ⇒ Formula

Returns a new instance of Formula.



21
22
23
24
25
26
27
# File 'lib/seimi/formula.rb', line 21

def initialize(source, composition, balance_composition, components, charge)
  @source = source
  @composition = composition
  @balance_composition = balance_composition
  @components = components
  @charge = charge
end

Instance Attribute Details

#balance_compositionObject (readonly)

Returns the value of attribute balance_composition.



15
16
17
# File 'lib/seimi/formula.rb', line 15

def balance_composition
  @balance_composition
end

#chargeObject (readonly)

Returns the value of attribute charge.



15
16
17
# File 'lib/seimi/formula.rb', line 15

def charge
  @charge
end

#compositionObject (readonly)

Returns the value of attribute composition.



15
16
17
# File 'lib/seimi/formula.rb', line 15

def composition
  @composition
end

Class Method Details

.parse(source) ⇒ Object



17
18
19
# File 'lib/seimi/formula.rb', line 17

def self.parse(source)
  Parser.new(source).parse
end

Instance Method Details

#breakdownObject



33
34
35
36
37
# File 'lib/seimi/formula.rb', line 33

def breakdown
  @components.map do |component|
    [component.symbol, component.count, component.total_mass]
  end
end

#charged?Boolean

Returns:

  • (Boolean)


39
40
41
# File 'lib/seimi/formula.rb', line 39

def charged?
  !charge.zero?
end

#molar_massObject



29
30
31
# File 'lib/seimi/formula.rb', line 29

def molar_mass
  @components.sum(0.0) { |component| component.total_mass }
end

#to_kobunObject



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/seimi/formula.rb', line 47

def to_kobun
  require_relative "kanji"
  require_relative "sangi"

  lines = ["#{self} 解剖の覚〕"]
  @components.each do |component|
    name = ELEMENTS.fetch(component.element).last
    lines << "一、#{name}(#{component.symbol}) #{Kanji.decimal(component.total_mass, 3)} 匁掛ける#{Kanji.from_i(component.count)}"
  end
  lines << "電荷 #{Kanji.rational(charge)} に候" if charged?
  lines << "〆て 分子の量 凡そ#{Kanji.decimal(molar_mass, 3)} に候"
  lines << Sangi.render(molar_mass.round)
  lines << "右の如く相違なく候 也"
  lines.join("\n")
end

#to_sObject



43
44
45
# File 'lib/seimi/formula.rb', line 43

def to_s
  @source
end