Merged updates from trunk into stable branch
[feedcatcher.git] / vendor / rails / activesupport / lib / active_support / ordered_hash.rb
1 # OrderedHash is namespaced to prevent conflicts with other implementations
2 module ActiveSupport
3 # Hash is ordered in Ruby 1.9!
4 if RUBY_VERSION >= '1.9'
5 OrderedHash = ::Hash
6 else
7 class OrderedHash < Hash #:nodoc:
8 def initialize(*args, &block)
9 super
10 @keys = []
11 end
12
13 def initialize_copy(other)
14 super
15 # make a deep copy of keys
16 @keys = other.keys
17 end
18
19 def []=(key, value)
20 @keys << key if !has_key?(key)
21 super
22 end
23
24 def delete(key)
25 if has_key? key
26 index = @keys.index(key)
27 @keys.delete_at index
28 end
29 super
30 end
31
32 def delete_if
33 super
34 sync_keys!
35 self
36 end
37
38 def reject!
39 super
40 sync_keys!
41 self
42 end
43
44 def reject(&block)
45 dup.reject!(&block)
46 end
47
48 def keys
49 @keys.dup
50 end
51
52 def values
53 @keys.collect { |key| self[key] }
54 end
55
56 def to_hash
57 self
58 end
59
60 def each_key
61 @keys.each { |key| yield key }
62 end
63
64 def each_value
65 @keys.each { |key| yield self[key]}
66 end
67
68 def each
69 @keys.each {|key| yield [key, self[key]]}
70 end
71
72 alias_method :each_pair, :each
73
74 def clear
75 super
76 @keys.clear
77 self
78 end
79
80 def shift
81 k = @keys.first
82 v = delete(k)
83 [k, v]
84 end
85
86 def merge!(other_hash)
87 other_hash.each {|k,v| self[k] = v }
88 self
89 end
90
91 def merge(other_hash)
92 dup.merge!(other_hash)
93 end
94
95 def inspect
96 "#<OrderedHash #{super}>"
97 end
98
99 private
100
101 def sync_keys!
102 @keys.delete_if {|k| !has_key?(k)}
103 end
104 end
105 end
106 end