Sha256: 8369d23a42d15c2f1a0c852ba96263da8b9f51cb949e8aaa9c813557bb227578

Contents?: true

Size: 1.34 KB

Versions: 2

Compression:

Stored size: 1.34 KB

Contents

class Spreadshit::Functions
  [[:+, :add], [:-, :minus], [:*, :multiply]].each do |operator, name|
    define_method(name) { |left, right| to_number(left).send(operator, to_number(right)) }
  end

  def divide(left, right)
    right = to_number(right)
    return Float::NAN if right.zero?
    to_number(to_number(left) / right.to_f)
  end

  def sum(*args)
    to_number args.flatten.map { |arg| to_number(arg) }.reduce(:+)
  end

  def average(*args)
    to_number(sum(*args) / args.size.to_f)
  end

  def sqrt(number)
    Math.sqrt to_number(number)
  end

  def ln(number)
    Math.log to_number(number)
  end

  def var(*args)
    average = average(*args)

    args.flatten.map { |arg| to_number(arg) }.reduce(0) do |variance, value|
      variance + (value - average) ** 2
    end
  end

  def stdev(*args)
    sqrt(var(*args))
  end

  def date(year, month, date)
    Date.new(year, month, date)
  end

  private

  def to_number(value)
    case value
    when Float::INFINITY
      value
    when nil
      0
    when Numeric
      if !value.to_f.nan? && value.to_f - value.to_i == 0
        value.to_i
      else
        value.to_f
      end
    when Date
      value
    when -> string { string.to_s =~ /\A[-+]?([0-9]+\.)?[0-9]+\z/ }
      to_number(value.to_f)
    when String && -> string { string.strip.empty? }
      0
    else
      Float::NAN
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
spreadshit-0.1.1 lib/spreadshit/functions.rb
spreadshit-0.1.0 lib/spreadshit/functions.rb