require 'apportion/util' module Apportion # Configure per options module Setup module_function # Determines initial portions for recipients according to optional constraints # # @param keys [Hash] correspond to recipients # @param options [Hash] # @param options [Hash] :prior_portions from a previous apportionment # @option options [Integer] :required_minimum smallest portion for each recipient # @return [Hash] portions # @example # initial_portions({a: 41, b: 32, c: 27}, required_minimum: 2) # # => {a: 2, b: 2, c: 2} def initial_portions(keys, options) portions = Hash.new int = options[:required_minimum] || 0 keys.each { |k| portions[k] = int } hash = options[:prior_portions] return portions unless hash prior_portions_included(portions, hash) end def prior_portions_included(portions, prior_portions) portions.merge(prior_portions) { |_k, o, n| [o, n].max } end # @raise [RuntimeError] if size too small def validate(size, sum_portions) fail('Size less than minimum sum_portions') if size < sum_portions end private_class_method :prior_portions_included end end