Created
January 15, 2013 02:43
-
-
Save TylerRick/4535585 to your computer and use it in GitHub Desktop.
ranges_of_contiguous
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module Enumerable | |
# Returns an array of arrays, each inner array containing a cluster of contiguous elements from | |
# self. | |
# | |
# [-1, 0, 1, 3, 4, 7, 8].clusters_of_contiguous | |
# => [[-1, 0, 1], [3, 4], [7, 8]] | |
# | |
# Based off of Enumerable#cluster (from facets gem) | |
# | |
def clusters_of_contiguous | |
clusters = [] | |
each do |element| | |
cluster = clusters.last | |
if cluster && cluster.last.succ == element | |
cluster << element | |
else | |
clusters << [element] | |
end | |
end | |
clusters | |
end | |
# Returns an array of ranges, each range representing a range of contiguous elements from self. | |
# | |
# [-1, 0, 1, 3, 4, 7, 8].ranges_of_contiguous | |
# => [-1..1, 3..4, 7..8] | |
# | |
def ranges_of_contiguous | |
ranges = [] | |
each do |element| | |
range = ranges.last | |
if range && range.end.succ == element | |
ranges[-1] = (range.begin .. element) | |
else | |
ranges << (element .. element) | |
end | |
end | |
ranges | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
describe Enumerable do | |
describe '-1, 0, 1, 3, 4, 7, 8' do | |
subject { [-1, 0, 1, 3, 4, 7, 8] } | |
its(:clusters_of_contiguous) { should == [[-1, 0, 1], [3, 4], [7, 8]] } | |
its(:ranges_of_contiguous) { should == [ -1..1, 3..4, 7..8] } | |
end | |
# It doesn't care what the elements are, as long as they are Enumerable (respond_to? :succ) | |
describe 'PK, K, 1, 3, 4, 7, 8' do | |
subject { [ | |
GradeLevel.new('PK'), | |
GradeLevel.new('K'), | |
GradeLevel.new('1'), | |
GradeLevel.new('3'), | |
GradeLevel.new('4'), | |
GradeLevel.new('7'), | |
GradeLevel.new('8'), | |
] } | |
its(:clusters_of_contiguous) { should == [ | |
[ | |
GradeLevel.new('PK'), | |
GradeLevel.new('K'), | |
GradeLevel.new('1'), | |
], | |
[ | |
GradeLevel.new('3'), | |
GradeLevel.new('4'), | |
], | |
[ | |
GradeLevel.new('7'), | |
GradeLevel.new('8'), | |
] | |
] } | |
its(:ranges_of_contiguous) { should == [ | |
( | |
GradeLevel.new('PK') .. | |
GradeLevel.new('1') | |
), | |
( | |
GradeLevel.new('3') .. | |
GradeLevel.new('4') | |
), | |
( | |
GradeLevel.new('7') .. | |
GradeLevel.new('8') | |
) | |
] } | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment