rhash 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/lib/rhash.rb +303 -0
  2. data/test/test.rb +68 -0
  3. metadata +56 -0
@@ -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
+
@@ -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