class Proforma::PrawnRenderer::Util::BalancedSet
This class can balance out an un-even set of values.
Public Class Methods
calculate(values, sum, round: 2)
click to toggle source
# File lib/proforma/prawn_renderer/util/balanced_set.rb, line 16 def calculate(values, sum, round: 2) free_spots = values.count(&:nil?) if free_spots.positive? available_value = sum - values.map(&:to_f).reduce(0, :+) new_values = divide(free_spots, available_value, round) values = values.map { |v| v || new_values.shift } end balance(values, sum, round) end
Private Class Methods
balance(values, sum, round)
click to toggle source
# File lib/proforma/prawn_renderer/util/balanced_set.rb, line 32 def balance(values, sum, round) difference = sum - values.map(&:to_f).reduce(0, :+) return values if difference.zero? diff_spots = divide(values.length, difference, round) values.map.with_index { |value, index| value + diff_spots[index] } end
divide(count, sum, round)
click to toggle source
# File lib/proforma/prawn_renderer/util/balanced_set.rb, line 42 def divide(count, sum, round) spot_value = (sum / count.to_f).round(round) remainder = sum - (spot_value * count) Array.new(count) { |i| i.zero? ? spot_value + remainder : spot_value } end