ranges.rb
Навеяло постом маньяка…
Кстати по-моему очень хорошая идея - а в случае overflow сериализованного массива либо обнулять его (ибо информация не критичная) либо заменять на [1..последний_топик_в_форуме].
module Enumerable
def to_ranges
compact.sort.uniq.inject([]) do | result, elem |
result = [elem..elem] if result.length.zero?
if [result[-1].end, result[-1].end.succ].include?(elem)
result[-1] = result[-1].begin..elem
else
result.push elem..elem
end
result
end
end
def member_includes?(item)
find{|r| r.include?(item)} ? true : false
end
def implant(item)
(map{|e| e.to_a }.flatten + Array(item)).to_ranges
end
def implant!(item)
replace(implant(item))
end
end
implant конечно можно и поэкономнее сделать но было лень :-)