Browse files

Rubinious: work around h[k] ||= v returning []= result instead of v

  • Loading branch information...
1 parent 19895f0 commit f5cbad21ac09822a61d6326cbadea16bbe86b623 @jeremy jeremy committed Jun 10, 2008
View
17 activesupport/lib/active_support/core_ext/enumerable.rb
@@ -1,3 +1,5 @@
+require 'active_support/ordered_hash'
+
module Enumerable
# Ruby 1.8.7 introduces group_by, but the result isn't ordered. Override it.
remove_method(:group_by) if [].respond_to?(:group_by) && RUBY_VERSION < '1.9'
@@ -18,10 +20,19 @@ module Enumerable
# "2006-02-24 -> Transcript, Transcript"
# "2006-02-23 -> Transcript"
def group_by
- inject ActiveSupport::OrderedHash.new do |grouped, element|
- (grouped[yield(element)] ||= []) << element
- grouped
+ assoc = ActiveSupport::OrderedHash.new
+
+ each do |element|
+ key = yield(element)
+
+ if assoc.has_key?(key)
+ assoc[key] << element
+ else
+ assoc[key] = [element]
+ end
end
+
+ assoc
end unless [].respond_to?(:group_by)
# Calculates a sum from the elements. Examples:
View
1 activesupport/lib/active_support/ordered_hash.rb
@@ -12,6 +12,7 @@ def []=(key, value)
else
self << [key, value]
end
+ value
end
def [](key)

0 comments on commit f5cbad2

Please sign in to comment.