schneidmaster/eqn

View on GitHub
lib/eqn/function.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
module Eqn
  module Function
    # Node class for the if function.
    class If < EqnNode
      def value(vars = {})
        comp_val = elements.shift.value(vars)
        ls = elements.shift.value(vars)
        rs = elements.shift.value(vars)

        comp_val ? ls : rs
      end
    end

    # Base node class for round functions.
    class RoundBase < EqnNode
      def value(vars)
        value = elements.shift.value(vars)
        raise ZeroDivisionError if value.is_a?(Float) && (value.abs == Float::INFINITY || value.nan?)

        if term?
          value.send(self.class::ROUND_METHOD)
        else
          round_to_precision(vars, value)
        end
      end

      private

      def round_to_precision(vars, value)
        decimals = elements.shift.value(vars)
        (value * 10**decimals).send(self.class::ROUND_METHOD).to_f / 10**decimals
      end
    end

    # Node class for the round function.
    class Round < RoundBase
      ROUND_METHOD = :round
    end

    # Node class for the roundup function.
    class RoundUp < RoundBase
      ROUND_METHOD = :ceil
    end

    # Node class for the rounddown function.
    class RoundDown < RoundBase
      ROUND_METHOD = :floor
    end
  end
end