Class: Reality::OrderedHash

Inherits:
Hash
  • Object
show all
Defined in:
lib/reality/orderedhash.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*a, &b) ⇒ OrderedHash

Returns a new instance of OrderedHash.



47
48
49
50
# File 'lib/reality/orderedhash.rb', line 47

def initialize(*a, &b)
  super
  @order = []
end

Instance Attribute Details

#orderObject

Returns the value of attribute order.



28
29
30
# File 'lib/reality/orderedhash.rb', line 28

def order
  @order
end

#to_yaml_styleObject

Returns the value of attribute to_yaml_style.



213
214
215
# File 'lib/reality/orderedhash.rb', line 213

def to_yaml_style
  @to_yaml_style
end

Class Method Details

.[](*args) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/reality/orderedhash.rb', line 31

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



65
66
67
68
# File 'lib/reality/orderedhash.rb', line 65

def ==(hsh2)
  return false if @order != hsh2.order
  super hsh2
end

#__class__Object



209
210
211
# File 'lib/reality/orderedhash.rb', line 209

def __class__
  OrderedHash
end

#classObject



205
206
207
# File 'lib/reality/orderedhash.rb', line 205

def class
  Hash
end

#clearObject



70
71
72
73
# File 'lib/reality/orderedhash.rb', line 70

def clear
  @order = []
  super
end

#delete(key) ⇒ Object



75
76
77
78
# File 'lib/reality/orderedhash.rb', line 75

def delete(key)
  @order.delete key
  super
end

#delete_ifObject



97
98
99
100
101
102
# File 'lib/reality/orderedhash.rb', line 97

def delete_if
  @order.clone.each { |k|
    delete k if yield(k)
  }
  self
end

#eachObject Also known as: each_pair



90
91
92
93
# File 'lib/reality/orderedhash.rb', line 90

def each
  @order.each { |k| yield k, self[k] }
  self
end

#each_keyObject



80
81
82
83
# File 'lib/reality/orderedhash.rb', line 80

def each_key
  @order.each { |k| yield k }
  self
end

#each_valueObject



85
86
87
88
# File 'lib/reality/orderedhash.rb', line 85

def each_value
  @order.each { |k| yield self[k] }
  self
end

#each_with_indexObject



245
246
247
248
# File 'lib/reality/orderedhash.rb', line 245

def each_with_index
  @order.each_with_index { |k, index| yield k, self[k], index }
  self
end

#firstObject



114
115
116
# File 'lib/reality/orderedhash.rb', line 114

def first
  {@order.first => self[@order.first]}
end

#inspectObject



182
183
184
185
186
# File 'lib/reality/orderedhash.rb', line 182

def inspect
  ary = []
  each { |k, v| ary << k.inspect + '=>' + v.inspect }
  '{' + ary.join(', ') + '}'
end

#invertObject



122
123
124
125
126
# File 'lib/reality/orderedhash.rb', line 122

def invert
  hsh2 = Hash.new
  @order.each { |k| hsh2[self[k]] = k }
  hsh2
end

#keysObject



110
111
112
# File 'lib/reality/orderedhash.rb', line 110

def keys
  @order
end

#lastObject



118
119
120
# File 'lib/reality/orderedhash.rb', line 118

def last
  {@order.last => self[@order.last]}
end

#merge(hsh2) ⇒ Object



195
196
197
# File 'lib/reality/orderedhash.rb', line 195

def merge(hsh2)
  self.dup(update(hsh2))
end

#orig_storeObject



56
# File 'lib/reality/orderedhash.rb', line 56

alias orig_store store

#popObject



167
168
169
170
# File 'lib/reality/orderedhash.rb', line 167

def pop
  key = @order.last
  key ? [key, delete(key)] : nil
end

#push(k, v) ⇒ Object



157
158
159
160
161
162
163
164
165
# File 'lib/reality/orderedhash.rb', line 157

def push(k, v)
  unless self.include? k
    @order.push k
    orig_store(k, v)
    true
  else
    false
  end
end

#reject(&block) ⇒ Object



128
129
130
# File 'lib/reality/orderedhash.rb', line 128

def reject(&block)
  self.dup.delete_if(&block)
end

#reject!(&block) ⇒ Object



132
133
134
135
# File 'lib/reality/orderedhash.rb', line 132

def reject!(&block)
  hsh2 = reject(&block)
  self == hsh2 ? nil : hsh2
end

#replace(hsh2) ⇒ Object



137
138
139
140
# File 'lib/reality/orderedhash.rb', line 137

def replace hsh2
  @order = hsh2.keys
  super hsh2
end

#selectObject



199
200
201
202
203
# File 'lib/reality/orderedhash.rb', line 199

def select
  ary = []
  each { |k, v| ary << [k, v] if yield k, v }
  ary
end

#shiftObject



142
143
144
145
# File 'lib/reality/orderedhash.rb', line 142

def shift
  key = @order.first
  key ? [key, delete(key)] : super
end

#store(a, b) ⇒ Object Also known as: []=



58
59
60
61
# File 'lib/reality/orderedhash.rb', line 58

def store(a, b)
  @order.push a unless has_key? a
  super a, b
end

#store_only(a, b) ⇒ Object



52
53
54
# File 'lib/reality/orderedhash.rb', line 52

def store_only a, b
  store a, b
end

#to_aObject



172
173
174
175
176
# File 'lib/reality/orderedhash.rb', line 172

def to_a
  ary = []
  each { |k, v| ary << [k, v] }
  ary
end

#to_sObject



178
179
180
# File 'lib/reality/orderedhash.rb', line 178

def to_s
  self.to_a.to_s
end

#unshift(k, v) ⇒ Object



147
148
149
150
151
152
153
154
155
# File 'lib/reality/orderedhash.rb', line 147

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!



188
189
190
191
# File 'lib/reality/orderedhash.rb', line 188

def update(hsh2)
  hsh2.each { |k, v| self[k] = v }
  self
end

#valuesObject



104
105
106
107
108
# File 'lib/reality/orderedhash.rb', line 104

def values
  ary = []
  @order.each { |k| ary.push self[k] }
  ary
end

#yaml_inline!Object



241
242
243
# File 'lib/reality/orderedhash.rb', line 241

def yaml_inline!
  self.yaml_inline = true
end

#yaml_inline=(bool) ⇒ Object



215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
# File 'lib/reality/orderedhash.rb', line 215

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