aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/core_ext/array/grouping.rb
diff options
context:
space:
mode:
Diffstat (limited to 'activesupport/lib/active_support/core_ext/array/grouping.rb')
-rw-r--r--activesupport/lib/active_support/core_ext/array/grouping.rb180
1 files changed, 87 insertions, 93 deletions
diff --git a/activesupport/lib/active_support/core_ext/array/grouping.rb b/activesupport/lib/active_support/core_ext/array/grouping.rb
index f782f8facf..ef416787a9 100644
--- a/activesupport/lib/active_support/core_ext/array/grouping.rb
+++ b/activesupport/lib/active_support/core_ext/array/grouping.rb
@@ -1,106 +1,100 @@
require 'enumerator'
-module ActiveSupport #:nodoc:
- module CoreExtensions #:nodoc:
- module Array #:nodoc:
- module Grouping
- # Splits or iterates over the array in groups of size +number+,
- # padding any remaining slots with +fill_with+ unless it is +false+.
- #
- # %w(1 2 3 4 5 6 7).in_groups_of(3) {|group| p group}
- # ["1", "2", "3"]
- # ["4", "5", "6"]
- # ["7", nil, nil]
- #
- # %w(1 2 3).in_groups_of(2, ' ') {|group| p group}
- # ["1", "2"]
- # ["3", " "]
- #
- # %w(1 2 3).in_groups_of(2, false) {|group| p group}
- # ["1", "2"]
- # ["3"]
- def in_groups_of(number, fill_with = nil)
- if fill_with == false
- collection = self
- else
- # size % number gives how many extra we have;
- # subtracting from number gives how many to add;
- # modulo number ensures we don't add group of just fill.
- padding = (number - size % number) % number
- collection = dup.concat([fill_with] * padding)
- end
-
- if block_given?
- collection.each_slice(number) { |slice| yield(slice) }
- else
- returning [] do |groups|
- collection.each_slice(number) { |group| groups << group }
- end
- end
- end
+class Array
+ # Splits or iterates over the array in groups of size +number+,
+ # padding any remaining slots with +fill_with+ unless it is +false+.
+ #
+ # %w(1 2 3 4 5 6 7).in_groups_of(3) {|group| p group}
+ # ["1", "2", "3"]
+ # ["4", "5", "6"]
+ # ["7", nil, nil]
+ #
+ # %w(1 2 3).in_groups_of(2, '&nbsp;') {|group| p group}
+ # ["1", "2"]
+ # ["3", "&nbsp;"]
+ #
+ # %w(1 2 3).in_groups_of(2, false) {|group| p group}
+ # ["1", "2"]
+ # ["3"]
+ def in_groups_of(number, fill_with = nil)
+ if fill_with == false
+ collection = self
+ else
+ # size % number gives how many extra we have;
+ # subtracting from number gives how many to add;
+ # modulo number ensures we don't add group of just fill.
+ padding = (number - size % number) % number
+ collection = dup.concat([fill_with] * padding)
+ end
- # Splits or iterates over the array in +number+ of groups, padding any
- # remaining slots with +fill_with+ unless it is +false+.
- #
- # %w(1 2 3 4 5 6 7 8 9 10).in_groups(3) {|group| p group}
- # ["1", "2", "3", "4"]
- # ["5", "6", "7", nil]
- # ["8", "9", "10", nil]
- #
- # %w(1 2 3 4 5 6 7).in_groups(3, '&nbsp;') {|group| p group}
- # ["1", "2", "3"]
- # ["4", "5", "&nbsp;"]
- # ["6", "7", "&nbsp;"]
- #
- # %w(1 2 3 4 5 6 7).in_groups(3, false) {|group| p group}
- # ["1", "2", "3"]
- # ["4", "5"]
- # ["6", "7"]
- def in_groups(number, fill_with = nil)
- # size / number gives minor group size;
- # size % number gives how many objects need extra accomodation;
- # each group hold either division or division + 1 items.
- division = size / number
- modulo = size % number
+ if block_given?
+ collection.each_slice(number) { |slice| yield(slice) }
+ else
+ groups = []
+ collection.each_slice(number) { |group| groups << group }
+ groups
+ end
+ end
- # create a new array avoiding dup
- groups = []
- start = 0
+ # Splits or iterates over the array in +number+ of groups, padding any
+ # remaining slots with +fill_with+ unless it is +false+.
+ #
+ # %w(1 2 3 4 5 6 7 8 9 10).in_groups(3) {|group| p group}
+ # ["1", "2", "3", "4"]
+ # ["5", "6", "7", nil]
+ # ["8", "9", "10", nil]
+ #
+ # %w(1 2 3 4 5 6 7).in_groups(3, '&nbsp;') {|group| p group}
+ # ["1", "2", "3"]
+ # ["4", "5", "&nbsp;"]
+ # ["6", "7", "&nbsp;"]
+ #
+ # %w(1 2 3 4 5 6 7).in_groups(3, false) {|group| p group}
+ # ["1", "2", "3"]
+ # ["4", "5"]
+ # ["6", "7"]
+ def in_groups(number, fill_with = nil)
+ # size / number gives minor group size;
+ # size % number gives how many objects need extra accomodation;
+ # each group hold either division or division + 1 items.
+ division = size / number
+ modulo = size % number
- number.times do |index|
- length = division + (modulo > 0 && modulo > index ? 1 : 0)
- padding = fill_with != false &&
- modulo > 0 && length == division ? 1 : 0
- groups << slice(start, length).concat([fill_with] * padding)
- start += length
- end
+ # create a new array avoiding dup
+ groups = []
+ start = 0
- if block_given?
- groups.each{|g| yield(g) }
- else
- groups
- end
- end
+ number.times do |index|
+ length = division + (modulo > 0 && modulo > index ? 1 : 0)
+ padding = fill_with != false &&
+ modulo > 0 && length == division ? 1 : 0
+ groups << slice(start, length).concat([fill_with] * padding)
+ start += length
+ end
- # Divides the array into one or more subarrays based on a delimiting +value+
- # or the result of an optional block.
- #
- # [1, 2, 3, 4, 5].split(3) # => [[1, 2], [4, 5]]
- # (1..10).to_a.split { |i| i % 3 == 0 } # => [[1, 2], [4, 5], [7, 8], [10]]
- def split(value = nil)
- using_block = block_given?
+ if block_given?
+ groups.each { |g| yield(g) }
+ else
+ groups
+ end
+ end
- inject([[]]) do |results, element|
- if (using_block && yield(element)) || (value == element)
- results << []
- else
- results.last << element
- end
+ # Divides the array into one or more subarrays based on a delimiting +value+
+ # or the result of an optional block.
+ #
+ # [1, 2, 3, 4, 5].split(3) # => [[1, 2], [4, 5]]
+ # (1..10).to_a.split { |i| i % 3 == 0 } # => [[1, 2], [4, 5], [7, 8], [10]]
+ def split(value = nil)
+ using_block = block_given?
- results
- end
- end
+ inject([[]]) do |results, element|
+ if (using_block && yield(element)) || (value == element)
+ results << []
+ else
+ results.last << element
end
+
+ results
end
end
end