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.
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