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