Class: OrderedHash
- Inherits:
-
Hash
show all
- Defined in:
- lib/nanoc3/base/ordered_hash.rb
Overview
AUTHOR
jan molic /mig/at/1984/dot/cz/
DESCRIPTION
Hash with preserved order and some array-like extensions
Public domain.
THANKS
Andrew Johnson for his suggestions and fixes of Hash[],
merge, to_a, inspect and shift
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
#checksum, #freeze_recursively, #stringify_keys, #symbolize_keys
Constructor Details
Returns a new instance of OrderedHash.
31
32
33
34
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 31
def initialize(*a, &b)
super
@order = []
end
|
Instance Attribute Details
#order ⇒ Object
Returns the value of attribute order.
13
14
15
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 13
def order
@order
end
|
#to_yaml_style ⇒ Object
Returns the value of attribute to_yaml_style.
164
165
166
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 164
def to_yaml_style
@to_yaml_style
end
|
Class Method Details
.[](*args) ⇒ Object
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 16
def [] *args
hsh = OrderedHash.new
if Hash === args[0]
hsh.replace args[0]
elsif (args.size % 2) != 0
raise ArgumentError, "odd number of elements for Hash"
else
0.step(args.size - 1, 2) do |a|
b = a + 1
hsh[args[a]] = args[b]
end
end
hsh
end
|
Instance Method Details
#==(hsh2) ⇒ Object
44
45
46
47
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 44
def == hsh2
return false if @order != hsh2.order
super hsh2
end
|
#__class__ ⇒ Object
160
161
162
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 160
def __class__
OrderedHash
end
|
#class ⇒ Object
157
158
159
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 157
def class
Hash
end
|
#clear ⇒ Object
48
49
50
51
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 48
def clear
@order = []
super
end
|
#delete(key) ⇒ Object
52
53
54
55
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 52
def delete key
@order.delete key
super
end
|
#delete_if ⇒ Object
69
70
71
72
73
74
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 69
def delete_if
@order.clone.each { |k|
delete k if yield(k)
}
self
end
|
#each ⇒ Object
Also known as:
each_pair
64
65
66
67
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 64
def each
@order.each { |k| yield k,self[k] }
self
end
|
#each_key ⇒ Object
56
57
58
59
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 56
def each_key
@order.each { |k| yield k }
self
end
|
#each_value ⇒ Object
60
61
62
63
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 60
def each_value
@order.each { |k| yield self[k] }
self
end
|
#each_with_index ⇒ Object
192
193
194
195
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 192
def each_with_index
@order.each_with_index { |k, index| yield k, self[k], index }
self
end
|
#first ⇒ Object
83
84
85
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 83
def first
{@order.first => self[@order.first]}
end
|
#inspect ⇒ Object
139
140
141
142
143
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 139
def inspect
ary = []
each {|k,v| ary << k.inspect + "=>" + v.inspect}
'{' + ary.join(", ") + '}'
end
|
#invert ⇒ Object
89
90
91
92
93
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 89
def invert
hsh2 = Hash.new
@order.each { |k| hsh2[self[k]] = k }
hsh2
end
|
#keys ⇒ Object
80
81
82
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 80
def keys
@order
end
|
#last ⇒ Object
86
87
88
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 86
def last
{@order.last => self[@order.last]}
end
|
#merge(hsh2) ⇒ Object
149
150
151
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 149
def merge hsh2
self.dup update(hsh2)
end
|
#orig_store ⇒ Object
38
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 38
alias orig_store store
|
#pop ⇒ Object
127
128
129
130
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 127
def pop
key = @order.last
key ? [key,delete(key)] : nil
end
|
#push(k, v) ⇒ Object
118
119
120
121
122
123
124
125
126
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 118
def push k,v
unless self.include? k
@order.push k
orig_store(k,v)
true
else
false
end
end
|
#reject(&block) ⇒ Object
94
95
96
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 94
def reject &block
self.dup.delete_if &block
end
|
#reject!(&block) ⇒ Object
97
98
99
100
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 97
def reject! &block
hsh2 = reject &block
self == hsh2 ? nil : hsh2
end
|
#replace(hsh2) ⇒ Object
101
102
103
104
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 101
def replace hsh2
@order = hsh2.keys
super hsh2
end
|
#select ⇒ Object
152
153
154
155
156
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 152
def select
ary = []
each { |k,v| ary << [k,v] if yield k,v }
ary
end
|
#shift ⇒ Object
105
106
107
108
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 105
def shift
key = @order.first
key ? [key,delete(key)] : super
end
|
#store(a, b) ⇒ Object
Also known as:
[]=
39
40
41
42
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 39
def store a,b
@order.push a unless has_key? a
super a,b
end
|
#store_only(a, b) ⇒ Object
35
36
37
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 35
def store_only a,b
store a,b
end
|
#to_a ⇒ Object
131
132
133
134
135
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 131
def to_a
ary = []
each { |k,v| ary << [k,v] }
ary
end
|
#to_s ⇒ Object
136
137
138
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 136
def to_s
self.to_a.to_s
end
|
#unshift(k, v) ⇒ Object
109
110
111
112
113
114
115
116
117
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 109
def unshift k,v
unless self.include? k
@order.unshift k
orig_store(k,v)
true
else
false
end
end
|
#update(hsh2) ⇒ Object
Also known as:
merge!
144
145
146
147
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 144
def update hsh2
hsh2.each { |k,v| self[k] = v }
self
end
|
#values ⇒ Object
75
76
77
78
79
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 75
def values
ary = []
@order.each { |k| ary.push self[k] }
ary
end
|
#yaml_inline! ⇒ Object
190
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 190
def yaml_inline!() self.yaml_inline = true end
|
#yaml_inline=(bool) ⇒ Object
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
|
# File 'lib/nanoc3/base/ordered_hash.rb', line 165
def yaml_inline= bool
if respond_to?("to_yaml_style")
self.to_yaml_style = :inline
else
unless defined? @__yaml_inline_meth
@__yaml_inline_meth =
lambda {|opts|
YAML::quick_emit(object_id, opts) {|emitter|
emitter << '{ ' << map{|kv| kv.join ': '}.join(', ') << ' }'
}
}
class << self
def to_yaml opts = {}
begin
@__yaml_inline ? @__yaml_inline_meth[ opts ] : super
rescue
@to_yaml_style = :inline
super
end
end
end
end
end
@__yaml_inline = bool
end
|