Class Array
In: lib/array.rb
Parent: Object

Methods

Public Instance methods

[a, b, c, d].each_row_with_index.do |row, index|

  puts("#{row}, #{index}")

end >> [ a, b ], 0 >> [ c, d ], 1

Used for races table on top of results page. May be a Rails method for this, but doesn‘t include index, I think. Then again, I don‘t think we use index any more, either.

[Source]

    # File lib/array.rb, line 12
12:   def each_row_with_index
13:     return [[], 0] if empty?
14:     rows = []
15:     row_count = (size + 1) / 2
16:     
17:     for row_index in 0..(row_count - 1)
18:       row = [self[row_index]]
19:       second_element_index = (row_count - 1) + row_index + 1
20:       if second_element_index < size
21:         row << self[second_element_index]
22:       end
23:       rows << row
24:       yield row, row_index
25:     end
26:     
27:     [ rows, row_index ]
28:   end

[Source]

    # File lib/array.rb, line 66
66:   def merge(left, right, &predicate)
67:     sorted = []
68:     until left.empty? or right.empty?
69:       if predicate
70:         if predicate.call(right.first, left.first)
71:           sorted << left.shift
72:         else
73:           sorted << right.shift
74:         end
75:       else
76:         if left.first <= right.first
77:           sorted << left.shift
78:         else
79:           sorted << right.shift
80:         end
81:       end
82:     end
83:     sorted.concat(left).concat(right)
84:   end

Sort is stable only if predicate includes an equal comparison. Example: x.name <= y.name

[Source]

    # File lib/array.rb, line 58
58:   def merge_sort(&predicate)
59:     return self.dup if size <= 1
60:     mid = size / 2
61:     left  = self[0, mid].dup
62:     right = self[mid, size].dup
63:     merge(left.merge_sort(&predicate), right.merge_sort(&predicate), &predicate)
64:   end

Sort by method and preserve existing order. Ruby 1.8 sort_by does not preserve order.

[Source]

    # File lib/array.rb, line 31
31:   def stable_sort_by(method, order = :asc)
32:     if order == :asc
33:       merge_sort { |x, y|
34:         if x.send(method).nil?
35:           true
36:         elsif !x.send(method).nil? && y.send(method).nil?
37:           false
38:         else
39:           x.send(method) >= y.send(method)
40:         end
41:       }
42:     elsif order == :desc
43:       merge_sort { |x, y|
44:         if y.send(method).nil?
45:           true
46:         elsif !y.send(method).nil? && x.send(method).nil?
47:           false
48:         else
49:           x.send(method) <= y.send(method)
50:         end
51:       }
52:     else
53:       raise ArgumentError, "order must be :asc or :desc"
54:     end
55:   end

[Validate]