rhash 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/rhash.rb +303 -0
- data/test/test.rb +68 -0
- metadata +56 -0
data/lib/rhash.rb
ADDED
@@ -0,0 +1,303 @@
|
|
1
|
+
class Symbol
|
2
|
+
def <=>(other)
|
3
|
+
self.to_s <=> other.to_s
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
class Info
|
8
|
+
attr_accessor :key
|
9
|
+
attr_accessor :value
|
10
|
+
|
11
|
+
def to_s
|
12
|
+
"#{key.inspect} => #{value.inspect}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class RHash
|
17
|
+
def initialize(&block)
|
18
|
+
@hash = []
|
19
|
+
@default = block if block_given?
|
20
|
+
end
|
21
|
+
|
22
|
+
def [] key
|
23
|
+
@hash.each do |info|
|
24
|
+
return info.value if key == info.key
|
25
|
+
end
|
26
|
+
raise "Hash não possui key '#{key}'"
|
27
|
+
end
|
28
|
+
|
29
|
+
def []= key, value
|
30
|
+
info = Info.new
|
31
|
+
info.key = key
|
32
|
+
info.value = value
|
33
|
+
|
34
|
+
if new_hash_entry? info
|
35
|
+
@hash << info
|
36
|
+
else
|
37
|
+
update_key info
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def inspect
|
42
|
+
msg = '{'
|
43
|
+
@hash.each_with_index do |info, index|
|
44
|
+
msg += info.to_s
|
45
|
+
msg += ", " if @hash.size > 1 and index + 1 < @hash.size
|
46
|
+
end
|
47
|
+
msg += '}'
|
48
|
+
msg
|
49
|
+
end
|
50
|
+
|
51
|
+
def sort
|
52
|
+
int_sort
|
53
|
+
end
|
54
|
+
|
55
|
+
def sort!
|
56
|
+
new_hash = int_sort
|
57
|
+
@hash = new_hash
|
58
|
+
@hash
|
59
|
+
end
|
60
|
+
|
61
|
+
def sort_each(&block)
|
62
|
+
new_hash = int_sort
|
63
|
+
new_hash.each do |info|
|
64
|
+
yield info if block_given?
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def each(&block)
|
69
|
+
@hash.each do |info|
|
70
|
+
yield info if block_given?
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def each_pair(&block)
|
75
|
+
@hash.each do |info|
|
76
|
+
yield info.key, info.value if block_given?
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def each_value(&block)
|
81
|
+
array(:value).each do |value|
|
82
|
+
yield value if block_given?
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def each_key(&block)
|
87
|
+
array(:key).each do |value|
|
88
|
+
yield value if block_given?
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def select(&block)
|
93
|
+
selected_entries = []
|
94
|
+
@hash.each do |info|
|
95
|
+
if block_given?
|
96
|
+
if yield info
|
97
|
+
selected_entries << info
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
selected_entries
|
102
|
+
end
|
103
|
+
|
104
|
+
def keys
|
105
|
+
new_array = []
|
106
|
+
@hash.each{|info| new_array << info.key}
|
107
|
+
new_array
|
108
|
+
end
|
109
|
+
|
110
|
+
def values
|
111
|
+
new_array = []
|
112
|
+
@hash.each{|info| new_array << info.value}
|
113
|
+
new_array
|
114
|
+
end
|
115
|
+
|
116
|
+
def has_key?(key)
|
117
|
+
@hash.each{|info| return true if info.key == key}
|
118
|
+
false
|
119
|
+
end
|
120
|
+
alias :key? :has_key?
|
121
|
+
alias :member? :has_key?
|
122
|
+
|
123
|
+
def has_value?(value)
|
124
|
+
@hash.each{|info| return true if info.value == value}
|
125
|
+
false
|
126
|
+
end
|
127
|
+
alias :value? :has_value?
|
128
|
+
|
129
|
+
def delete_if(&block)
|
130
|
+
@hash.delete_if{|info| yield info.key, info.value if block_given?}
|
131
|
+
end
|
132
|
+
|
133
|
+
def delete(key, &block)
|
134
|
+
deleted = nil
|
135
|
+
@hash.delete_if{|info| info.key == key; deleted = info if info.key == key}
|
136
|
+
yield key.inspect if block_given? and !deleted
|
137
|
+
return "Deleted: #{deleted.key.inspect} => #{deleted.value.inspect}" if deleted
|
138
|
+
end
|
139
|
+
|
140
|
+
def size
|
141
|
+
@hash.size
|
142
|
+
end
|
143
|
+
alias :length :size
|
144
|
+
|
145
|
+
def invert
|
146
|
+
new_hash = RHash.new
|
147
|
+
@hash.each do |i|
|
148
|
+
new_hash[i.value] = i.key
|
149
|
+
end
|
150
|
+
new_hash
|
151
|
+
end
|
152
|
+
|
153
|
+
def to_s
|
154
|
+
inspect
|
155
|
+
end
|
156
|
+
|
157
|
+
def merge(rhash)
|
158
|
+
new_hash = RHash.new
|
159
|
+
raise "Não é uma Hash ou RHash" unless rhash.is_a? RHash or rhash.is_a? Hash
|
160
|
+
|
161
|
+
# Problema com o clone/dup Object.
|
162
|
+
@hash.each do |i|
|
163
|
+
new_hash[i.key] = i.value
|
164
|
+
end
|
165
|
+
|
166
|
+
if rhash.is_a? RHash
|
167
|
+
rhash.each do |info|
|
168
|
+
new_hash[info.key] = info.value
|
169
|
+
end
|
170
|
+
else
|
171
|
+
rhash.each_pair do |key, value|
|
172
|
+
new_hash[key] = value
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
new_hash
|
177
|
+
end
|
178
|
+
|
179
|
+
def merge!(rhash)
|
180
|
+
raise "Não é uma Hash ou RHash" unless rhash.is_a? RHash or rhash.is_a? Hash
|
181
|
+
if rhash.is_a? RHash
|
182
|
+
rhash.each do |info|
|
183
|
+
self[info.key] = info.value
|
184
|
+
end
|
185
|
+
else
|
186
|
+
rhash.each_pair do |key, value|
|
187
|
+
self[key] = value
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
def first
|
193
|
+
@hash.first
|
194
|
+
end
|
195
|
+
|
196
|
+
def last
|
197
|
+
@hash.last
|
198
|
+
end
|
199
|
+
|
200
|
+
def fetch(key, msg='', &block)
|
201
|
+
value = select{|i| i.key == key}[0]
|
202
|
+
|
203
|
+
if block_given? and value.nil?
|
204
|
+
yield
|
205
|
+
else
|
206
|
+
raise IndexError, "Key (#{key.inspect}): not found" if msg.empty?
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
def clear
|
211
|
+
@hash = []
|
212
|
+
end
|
213
|
+
|
214
|
+
def default=(value)
|
215
|
+
@default = value
|
216
|
+
end
|
217
|
+
|
218
|
+
def default(key)
|
219
|
+
if @default.is_a? Proc
|
220
|
+
info = Info.new
|
221
|
+
info.key = key
|
222
|
+
info.value = @default.call(self, key)
|
223
|
+
self[info.key] = info.value
|
224
|
+
else
|
225
|
+
info = Info.new
|
226
|
+
info.key = key
|
227
|
+
info.value = @default
|
228
|
+
self[info.key] = info.value
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
def shift
|
233
|
+
shifted = @hash.shift
|
234
|
+
[shifted.key, shifted.value]
|
235
|
+
end
|
236
|
+
|
237
|
+
def empty?
|
238
|
+
@hash.empty?
|
239
|
+
end
|
240
|
+
|
241
|
+
def store(key, value)
|
242
|
+
self[key] = value
|
243
|
+
end
|
244
|
+
|
245
|
+
def to_a
|
246
|
+
array = []
|
247
|
+
@hash.each do |info|
|
248
|
+
array << [info.key, info.value]
|
249
|
+
end
|
250
|
+
array
|
251
|
+
end
|
252
|
+
|
253
|
+
def values_at(*keys)
|
254
|
+
selected = []
|
255
|
+
@hash.each do |info|
|
256
|
+
selected << info.value if keys.include? info.key
|
257
|
+
end
|
258
|
+
selected
|
259
|
+
end
|
260
|
+
|
261
|
+
# Converte para hash
|
262
|
+
def to_hash
|
263
|
+
pure_hash = {}
|
264
|
+
@hash.each do |info|
|
265
|
+
pure_hash[info.key] = info.value
|
266
|
+
end
|
267
|
+
pure_hash
|
268
|
+
end
|
269
|
+
|
270
|
+
private
|
271
|
+
|
272
|
+
def int_sort
|
273
|
+
new_hash = []
|
274
|
+
new_hash = @hash.sort_by{|info| info.key}
|
275
|
+
new_hash
|
276
|
+
end
|
277
|
+
|
278
|
+
def array(mode)
|
279
|
+
array = []
|
280
|
+
@hash.each do |info|
|
281
|
+
array << info.__send__(mode.to_sym)
|
282
|
+
end
|
283
|
+
array
|
284
|
+
end
|
285
|
+
|
286
|
+
def new_hash_entry? info
|
287
|
+
@hash.each do |e|
|
288
|
+
return false if e.key == info.key
|
289
|
+
end
|
290
|
+
true
|
291
|
+
end
|
292
|
+
|
293
|
+
def update_key info
|
294
|
+
@hash.each do |e|
|
295
|
+
if e.key == info.key
|
296
|
+
e.value = info.value
|
297
|
+
end
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
|
303
|
+
|
data/test/test.rb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'lib/rhash'
|
2
|
+
|
3
|
+
n = RHash.new
|
4
|
+
n[:g] = 5
|
5
|
+
n[:a] = 8
|
6
|
+
n[:x] = 105
|
7
|
+
n[:xxx] = 105
|
8
|
+
|
9
|
+
puts n.inspect
|
10
|
+
n.sort!
|
11
|
+
puts n.inspect
|
12
|
+
#n.sort_each{|i| puts i}
|
13
|
+
#n.each_pair{|i, j| puts i; puts j+1}
|
14
|
+
#n.each_value{|i| puts i+10}
|
15
|
+
#n.each_key{|i| puts i.inspect}
|
16
|
+
#puts n.select{|i| i.value > 100}
|
17
|
+
#puts n.keys.inspect
|
18
|
+
#puts n.values.inspect
|
19
|
+
#puts n.has_key?("a")
|
20
|
+
#puts n.has_key?(:a)
|
21
|
+
#puts n.has_value?(50)
|
22
|
+
#puts n.has_value?(105)
|
23
|
+
#n.delete_if{|i, j| i == :g}
|
24
|
+
#puts n.inspect
|
25
|
+
#puts n.delete(:gh){|i| puts "Key #{i} not found"}
|
26
|
+
#puts n.inspect
|
27
|
+
#puts n.invert
|
28
|
+
#puts n.length
|
29
|
+
#puts n.size
|
30
|
+
#m = RHash.new
|
31
|
+
#m[:h] = :garrafa
|
32
|
+
#m[:b] = "a"
|
33
|
+
#m = {:h => "garrafas", :b => :a}
|
34
|
+
#n.merge! m
|
35
|
+
#x = n.merge m
|
36
|
+
#puts "Hash pós merge"
|
37
|
+
#puts x.inspect
|
38
|
+
#puts "Hash original"
|
39
|
+
#puts n.inspect
|
40
|
+
#puts n.inspect
|
41
|
+
#puts n.first
|
42
|
+
#puts n.last
|
43
|
+
#puts n.fetch(:hhh){"hahahahaha"}
|
44
|
+
#n.clear
|
45
|
+
#puts n.inspect
|
46
|
+
#h = RHash.new
|
47
|
+
#h.default = "5"
|
48
|
+
#h.default(5)
|
49
|
+
#puts h.inspect
|
50
|
+
#h.default= Proc.new {|h, k| h[k] = k.to_i*10}
|
51
|
+
#h.default(5)
|
52
|
+
#h.default(10)
|
53
|
+
#puts h.inspect
|
54
|
+
#h = RHash.new{|h, k| h[k] = k.to_i*10}
|
55
|
+
#h.default(5)
|
56
|
+
#h.default(10)
|
57
|
+
#puts h.inspect
|
58
|
+
#puts n.inspect
|
59
|
+
#n.shift
|
60
|
+
#puts n.inspect
|
61
|
+
#n.store(666, 0)
|
62
|
+
#puts n.inspect
|
63
|
+
#puts n.to_a.inspect
|
64
|
+
#puts n.empty?
|
65
|
+
#m = RHash.new
|
66
|
+
#puts m.empty?
|
67
|
+
#puts n.values_at(:a, :xxx).inspect
|
68
|
+
|
metadata
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rhash
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Rodrigo Mello Nardi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2010-07-13 00:00:00 -03:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: RHash is an ordenable hash, that is, its method 'sort' returns a Hash and the object remains sorted.
|
17
|
+
email: rodrigomellonardi@gmail.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- lib/rhash.rb
|
26
|
+
- test/test.rb
|
27
|
+
has_rdoc: true
|
28
|
+
homepage:
|
29
|
+
licenses: []
|
30
|
+
|
31
|
+
post_install_message:
|
32
|
+
rdoc_options: []
|
33
|
+
|
34
|
+
require_paths:
|
35
|
+
- lib
|
36
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: "0"
|
41
|
+
version:
|
42
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: "0"
|
47
|
+
version:
|
48
|
+
requirements: []
|
49
|
+
|
50
|
+
rubyforge_project:
|
51
|
+
rubygems_version: 1.3.5
|
52
|
+
signing_key:
|
53
|
+
specification_version: 3
|
54
|
+
summary: an ordenable hash
|
55
|
+
test_files:
|
56
|
+
- test/test.rb
|