module Apportion

Top level interface, or API, to distribute a quantity among recipients

Constants

VERSION

Public Instance Methods

division(weights, size, options = {}) click to toggle source

Distributes a quantity among recipients by dividing proportionally according to relative weights using the ‘equal proportions’ algorithm

@param weights [Hash] relative integer proportions @param size [Integer] quantity to apportion @param options [Hash] @option options [Hash] :prior_portions from a previous apportionment @option options [Integer] :required_minimum smallest portion for each recipient @return [Hash] portions @example

division({a: 41, b: 32, c: 27}, 7)
# => {a: 3, b: 2, c: 2}
# File lib/apportion.rb, line 22
def division(weights, size, options = {})
  portions = Setup.initial_portions(weights.keys, options)
  sum_portions = Util.hash_values_sum(portions)
  Setup.validate(size, sum_portions)
  next_step(weights, portions, sum_portions, size)
end
next_step(weights, portions, sum_portions, size) click to toggle source

recursively

# File lib/apportion.rb, line 30
def next_step(weights, portions, sum_portions, size)
  return portions if sum_portions == size
  key = Algorithm::EqualProportions.next_recipient(weights, portions)
  next_portions = portions.merge(key => portions[key] + 1)
  next_step(weights, next_portions, sum_portions + 1, size)
end