Sha256: 8f3ffa364da0e66166f8d6fb95e62ecb841e92761bdbd7e7e91e50c911e7d89a

Contents?: true

Size: 1.3 KB

Versions: 1

Compression:

Stored size: 1.3 KB

Contents

# frozen_string_literal: true

#
# Copyright (c) 2019-present, Blue Marble Payroll, LLC
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
#

module Proforma
  class PrawnRenderer
    # This class can balance out an un-even set of values.
    class BalancedSet
      class << self
        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

        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

        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
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
proforma-prawn-renderer-1.0.3 lib/proforma/prawn_renderer/balanced_set.rb