Class: Eqn::Calculator

Inherits:
Object
  • Object
show all
Defined in:
lib/eqn/calculator.rb

Overview

Primary calculator class used for performing calculations or creating eqn instances.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(eqn, vars = {}) ⇒ Calculator

Returns a new instance of Calculator.



4
5
6
7
# File 'lib/eqn/calculator.rb', line 4

def initialize(eqn, vars = {})
  @eqn = eqn
  @vars = vars
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args) ⇒ Object

rubocop:disable AbcSize



17
18
19
20
21
22
23
24
25
26
27
# File 'lib/eqn/calculator.rb', line 17

def method_missing(method, *args) # rubocop:disable AbcSize
  if i(calculate calc valid?).include?(method)
    self.class.send(method, @eqn, @vars)
  elsif (match = method.to_s.match(/^[A-Za-z]+=$/))
    @vars[match.to_s.delete('=').to_sym] = args.first
  elsif (var = method.to_s.match(/^[A-Za-z]+$/).to_s.to_sym) && @vars.key?(var)
    @vars[var]
  else
    super
  end
end

Class Method Details

.calculate(data, vars = {}) ⇒ Object Also known as: calc

Raises:



36
37
38
39
40
# File 'lib/eqn/calculator.rb', line 36

def calculate(data, vars = {})
  result = Parser.parse(data).value(vars)
  raise ZeroDivisionError if result.is_a?(Float) && (result.abs == Float::INFINITY || result.nan?)
  result
end

.valid?(data, vars = {}) ⇒ Boolean

Returns:

  • (Boolean)


43
44
45
46
47
48
# File 'lib/eqn/calculator.rb', line 43

def valid?(data, vars = {})
  calc(data, vars)
  true
rescue EqnError
  false
end

Instance Method Details

#respond_to_missing?(method, _p2 = false) ⇒ Boolean

Returns:

  • (Boolean)


29
30
31
32
33
# File 'lib/eqn/calculator.rb', line 29

def respond_to_missing?(method, _p2 = false)
  i(calculate calc valid?).include?(method) ||
    method.to_s.match(/^[A-Za-z]+=$/) ||
    (var = method.to_s.match(/^[A-Za-z]+$/).to_s.to_sym) && @vars.key?(var)
end

#set(key_or_hash, value = nil) ⇒ Object



9
10
11
12
13
14
15
# File 'lib/eqn/calculator.rb', line 9

def set(key_or_hash, value = nil)
  if key_or_hash.is_a?(Hash)
    @vars.merge!(key_or_hash)
  else
    @vars[key_or_hash.to_sym] = value
  end
end