def allocate_widths_for(available)
available -= (columns-1) * joiner.length + indent.length
return column_widths.map{ |w| w.max } if available >= column_widths.inject(0){ |sum, w| sum + w.max } || column_widths.inject(0){ |sum, w| sum + w.min } > available
fair = available / columns
column_widths.each do |w|
if w.set > 0
available -= w.set
next
end
w.set = if w.max <= fair
available -= w.max
w.max
else
0
end
end
remaining = column_widths.inject(0) do |sum, w|
if w.set == 0
sum += w.max
available -= w.min
end
sum
end
fair = available.to_f / remaining.to_f
column_widths.
each do |w|
if w.set == 0
alloc = (w.max * fair).to_i
overflow = alloc + w.min - w.max
if overflow > 0
alloc -= overflow
end
available -= alloc
w.set = alloc + w.min
end
end.
each do |w|
next unless available > 0
gap = w.max - w.set
if gap > 0
left = [gap,available].min
available -= left
w.set += left
end
end.map(&:set)
end