3: def compress
4: range_start = nil
5: previous = nil
6: ranges = []
7: leftovers = []
8: sorted = compact.uniq.sort
9:
10: return ranges, sorted if sorted.size == 1
11:
12: (sorted = sort).each do |n|
13: if !range_start && !previous
14: range_start = n
15: previous = n
16: else
17: if sorted.last == n
18: if range_start == previous
19: if previous + 1 == n
20: ranges << (range_start..n)
21: else
22: leftovers << previous
23: leftovers << n
24: end
25: else
26: if previous + 1 == n
27: ranges << (range_start..n)
28: else
29: ranges << (range_start..previous)
30: leftovers << n
31: end
32: end
33: elsif previous + 1 != n
34: if range_start == previous
35: leftovers << previous
36: else
37: ranges << (range_start..previous)
38: end
39: range_start = n
40: end
41: end
42:
43: previous = n
44: end
45:
46: return ranges, leftovers
47: end