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){ |sum, w| if w.set == 0; sum += w.max; available -= w.min; end; sum }
fair = available.to_f / remaining.to_f
column_widths.
each do |w|
if w.set == 0
available -= (alloc = (w.max * fair).to_i)
w.set = alloc + w.min
end
end.
each{ |w| if available > 0 && w.set < w.max; w.set += 1; available -= 1; end }.
map(&:set)
end