Class: Hash::Ordered

Inherits:
Hash show all
Defined in:
lib/mega/ohash.rb

Overview

:title: OrderedHash

Hash with preserved order and some array-like extensions.

Usage

Just require this file and use OrderedHash instead of Hash.

require 'hash/ordered'

# You can do simply
hsh = Hash::Ordered.new
hsh['z'] = 1
hsh['a'] = 2
hsh['c'] = 3
p hsh.keys     #=> ['z','a','c']

# or using OrderedHash[] method
hsh = OrderedHash['z', 1, 'a', 2, 'c', 3] 
p hsh.keys     #=> ['z','a','c']

# but this don't preserve order
hsh = OrderedHash['z'=>1, 'a'=>2, 'c'=>3]
p hsh.keys     #=> ['a','c','z']

# OrderedHash has useful extensions: push, pop and unshift
p hsh.push('to_end', 15)       #=> true, key added
p hsh.push('to_end', 30)       #=> false, already - nothing happen
p hsh.unshift('to_begin', 50)  #=> true, key added
p hsh.unshift('to_begin', 60)  #=> false, already - nothing happen
p hsh.keys                     #=> ["to_begin", "a", "c", "z", "to_end"]
p hsh.pop                      #=> ["to_end", 15], if nothing remains, return nil
p hsh.keys                     #=> ["to_begin", "a", "c", "z"]
p hsh.shift                    #=> ["to_begin", 30], if nothing remains, return nil

Author(s)

  • jan molic </mig/at/1984/dot/cz/>

Special 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

Methods included from DupReplaceSnapshotMixin

#restore_snapshot, #take_snapshot

Constructor Details

#initializeOrdered

Returns a new instance of Ordered.



85
86
87
# File 'lib/mega/ohash.rb', line 85

def initialize 
    @order = []
end

Instance Attribute Details

#orderObject

Returns the value of attribute order.



69
70
71
# File 'lib/mega/ohash.rb', line 69

def order
  @order
end

Class Method Details

.[](*args) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
# File 'lib/mega/ohash.rb', line 72

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
        hsh[args.shift] = args.shift while args.size > 0
    end
    hsh
end

Instance Method Details

#==(hsh2) ⇒ Object



100
101
102
103
# File 'lib/mega/ohash.rb', line 100

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

#clearObject



105
106
107
108
# File 'lib/mega/ohash.rb', line 105

def clear
    @order = []
    super
end

#delete(key) ⇒ Object



110
111
112
113
# File 'lib/mega/ohash.rb', line 110

def delete key
    @order.delete key
    super
end

#delete_ifObject



131
132
133
134
135
136
# File 'lib/mega/ohash.rb', line 131

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

#eachObject Also known as: each_pair



125
126
127
128
# File 'lib/mega/ohash.rb', line 125

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

#each_keyObject



115
116
117
118
# File 'lib/mega/ohash.rb', line 115

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

#each_valueObject



120
121
122
123
# File 'lib/mega/ohash.rb', line 120

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

#inspectObject



208
209
210
211
212
# File 'lib/mega/ohash.rb', line 208

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

#invertObject



148
149
150
151
152
# File 'lib/mega/ohash.rb', line 148

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

#keysObject



144
145
146
# File 'lib/mega/ohash.rb', line 144

def keys
    @order
end

#merge(hsh2) ⇒ Object



220
221
222
# File 'lib/mega/ohash.rb', line 220

def merge hsh2
    self.dup update(hsh2)
end

#orig_storeObject



93
# File 'lib/mega/ohash.rb', line 93

alias orig_store store

#popObject



193
194
195
196
# File 'lib/mega/ohash.rb', line 193

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

#push(k, v) ⇒ Object



183
184
185
186
187
188
189
190
191
# File 'lib/mega/ohash.rb', line 183

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

#reject(&block) ⇒ Object



154
155
156
# File 'lib/mega/ohash.rb', line 154

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

#reject!(&block) ⇒ Object



158
159
160
161
# File 'lib/mega/ohash.rb', line 158

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

#replace(hsh2) ⇒ Object



163
164
165
166
# File 'lib/mega/ohash.rb', line 163

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

#selectObject



224
225
226
227
228
# File 'lib/mega/ohash.rb', line 224

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

#shiftObject



168
169
170
171
# File 'lib/mega/ohash.rb', line 168

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

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



94
95
96
97
# File 'lib/mega/ohash.rb', line 94

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

#store_only(a, b) ⇒ Object



89
90
91
# File 'lib/mega/ohash.rb', line 89

def store_only a,b
    store a,b
end

#to_aObject



198
199
200
201
202
# File 'lib/mega/ohash.rb', line 198

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

#to_sObject



204
205
206
# File 'lib/mega/ohash.rb', line 204

def to_s
    self.to_a.to_s
end

#unshift(k, v) ⇒ Object



173
174
175
176
177
178
179
180
181
# File 'lib/mega/ohash.rb', line 173

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!



214
215
216
217
# File 'lib/mega/ohash.rb', line 214

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

#valuesObject



138
139
140
141
142
# File 'lib/mega/ohash.rb', line 138

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