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 |