Skip to content

Instantly share code, notes, and snippets.

@TylerRick
Created January 15, 2013 02:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TylerRick/4535585 to your computer and use it in GitHub Desktop.
Save TylerRick/4535585 to your computer and use it in GitHub Desktop.
ranges_of_contiguous
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
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