Skip to content

Commit 9e6f6da

Browse files
committed
Add optional block to allow sorting of arrays of arbitrary objects
1 parent e1b7752 commit 9e6f6da

File tree

3 files changed

+35
-2
lines changed

3 files changed

+35
-2
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ VersionSorter.sort(versions)
1515
#=> 2.0
1616
```
1717

18+
You can also sort arrays of arbitrary objects by providing a block.
19+
20+
```rb
21+
VersionSorter.sort(tags) { |tag| tag.name }
22+
```
23+
1824
Library API:
1925

2026
```rb

ext/version_sorter/version_sorter.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,15 @@ rb_version_sort_1(VALUE rb_self, VALUE rb_version_array, compare_callback_t cmp)
185185
versions = xcalloc(length, sizeof(struct version_number *));
186186

187187
for (i = 0; i < length; ++i) {
188-
VALUE rb_version = rb_ary_entry(rb_version_array, i);
189-
versions[i] = parse_version_number(StringValuePtr(rb_version));
188+
VALUE rb_version, rb_version_string;
189+
190+
rb_version = rb_ary_entry(rb_version_array, i);
191+
if (rb_block_given_p())
192+
rb_version_string = rb_yield(rb_version);
193+
else
194+
rb_version_string = rb_version;
195+
196+
versions[i] = parse_version_number(StringValuePtr(rb_version_string));
190197
versions[i]->rb_version = rb_version;
191198
}
192199

test/version_sorter_test.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@
44
require 'rubygems/version'
55

66
class VersionSorterTest < Test::Unit::TestCase
7+
def setup
8+
version_struct = Struct.new(:name)
9+
10+
@version1 = version_struct.new("1.0")
11+
@version2 = version_struct.new("2.0")
12+
@version10 = version_struct.new("10.0")
13+
end
14+
715
def test_sorts_versions_correctly
816
versions = %w(1.0.9 1.0.10 2.0 3.1.4.2 1.0.9a)
917
sorted_versions = %w( 1.0.9a 1.0.9 1.0.10 2.0 3.1.4.2 )
@@ -71,6 +79,18 @@ def test_rsort_bang
7179
assert_equal ["10.0", "2.0", "1.0"], versions
7280
end
7381

82+
def test_sort_block
83+
versions = [@version10, @version1, @version2]
84+
sorted = VersionSorter.sort(versions) { |version| version.name }
85+
assert_equal [@version1, @version2, @version10], sorted
86+
end
87+
88+
def test_rsort_block
89+
versions = [@version10, @version1, @version2]
90+
sorted = VersionSorter.rsort(versions) { |version| version.name }
91+
assert_equal [@version10, @version2, @version1], sorted
92+
end
93+
7494
def shuffle(array)
7595
array, result = array.dup, []
7696
result << array.delete_at(rand(array.size)) until array.size.zero?

0 commit comments

Comments
 (0)