aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Stephenson <sam@37signals.com>2006-04-13 05:12:43 +0000
committerSam Stephenson <sam@37signals.com>2006-04-13 05:12:43 +0000
commitc71607e29c4ab5cd7b4ac7d3ef902868ab1cebf7 (patch)
tree625b21db6492a303fbd20d1973f6fc891233e5ff
parentbdb2a2f1cb645a5dfde2de3b03f0f22b54b8b5d0 (diff)
downloadrails-c71607e29c4ab5cd7b4ac7d3ef902868ab1cebf7.tar.gz
rails-c71607e29c4ab5cd7b4ac7d3ef902868ab1cebf7.tar.bz2
rails-c71607e29c4ab5cd7b4ac7d3ef902868ab1cebf7.zip
Add Array#split for dividing arrays into one or more subarrays by value or block
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4208 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
-rw-r--r--activesupport/CHANGELOG4
-rw-r--r--activesupport/lib/active_support/core_ext/array.rb19
-rw-r--r--activesupport/test/core_ext/array_ext_test.rb23
3 files changed, 45 insertions, 1 deletions
diff --git a/activesupport/CHANGELOG b/activesupport/CHANGELOG
index 66c9fe2671..6539516087 100644
--- a/activesupport/CHANGELOG
+++ b/activesupport/CHANGELOG
@@ -1,3 +1,7 @@
+*SVN*
+
+* Add Array#split for dividing arrays into one or more subarrays by value or block. [Sam Stephenson]
+
*1.3.1* (April 6th, 2005)
* Clean paths inside of exception messages and traces. [Nicholas Seckar]
diff --git a/activesupport/lib/active_support/core_ext/array.rb b/activesupport/lib/active_support/core_ext/array.rb
index 897d73866c..db6f5587da 100644
--- a/activesupport/lib/active_support/core_ext/array.rb
+++ b/activesupport/lib/active_support/core_ext/array.rb
@@ -18,4 +18,23 @@ class Array #:nodoc:
collection << fill_with until collection.size.modulo(number).zero?
collection.each_slice(number, &block)
end
+
+ # Divide the array into one or more subarrays based on a delimiting +value+
+ # or the result of an optional block.
+ #
+ # ex.
+ #
+ # [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, &block)
+ block ||= Proc.new { |e| e == value }
+ inject([[]]) do |results, element|
+ if block.call(element)
+ results << []
+ else
+ results.last << element
+ end
+ results
+ end
+ end
end
diff --git a/activesupport/test/core_ext/array_ext_test.rb b/activesupport/test/core_ext/array_ext_test.rb
index 0df27fde66..caf3af2345 100644
--- a/activesupport/test/core_ext/array_ext_test.rb
+++ b/activesupport/test/core_ext/array_ext_test.rb
@@ -69,7 +69,28 @@ class ArrayExtGroupingTests < Test::Unit::TestCase
end
end
-class ArraToXmlTests < Test::Unit::TestCase
+class ArraySplitTests < Test::Unit::TestCase
+ def test_split_with_empty_array
+ assert_equal [[]], [].split(0)
+ end
+
+ def test_split_with_argument
+ assert_equal [[1, 2], [4, 5]], [1, 2, 3, 4, 5].split(3)
+ assert_equal [[1, 2, 3, 4, 5]], [1, 2, 3, 4, 5].split(0)
+ end
+
+ def test_split_with_block
+ assert_equal [[1, 2], [4, 5], [7, 8], [10]], (1..10).to_a.split { |i| i % 3 == 0 }
+ end
+
+ def test_split_with_edge_values
+ assert_equal [[], [2, 3, 4, 5]], [1, 2, 3, 4, 5].split(1)
+ assert_equal [[1, 2, 3, 4], []], [1, 2, 3, 4, 5].split(5)
+ assert_equal [[], [2, 3, 4], []], [1, 2, 3, 4, 5].split { |i| i == 1 || i == 5 }
+ end
+end
+
+class ArrayToXmlTests < Test::Unit::TestCase
def test_to_xml
xml = [
{ :name => "David", :age => 26 }, { :name => "Jason", :age => 31 }