rhash 0.0.1 → 0.0.3

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 +162 -15
  2. data/test/test.rb +15 -8
  3. metadata +18 -6
data/lib/rhash.rb CHANGED
@@ -14,18 +14,51 @@ class Info
14
14
  end
15
15
 
16
16
  class RHash
17
+ #
18
+ # Returns a new, empty RHash.
19
+ # If a block is specified, it will be called with the RHash object and the key,
20
+ # and should return the default value. It is the block‘s responsibility to
21
+ # store the value in the RHash if required.
22
+ #
17
23
  def initialize(&block)
18
24
  @hash = []
25
+ @default = nil
19
26
  @default = block if block_given?
20
27
  end
21
28
 
29
+ #
30
+ # Returns value corresponding to key.
31
+ # If the key wasn't found, an IndexError exception will be raised.
32
+ #
33
+ # my_hash = RHash.new
34
+ #
35
+ # my_hash["cow"] = "mooo..."
36
+ #
37
+ # my_hash["cow"] #=> "mooo..."
38
+ #
39
+ # my_hash["chick"] #=> nil
40
+ #
22
41
  def [] key
23
42
  @hash.each do |info|
24
43
  return info.value if key == info.key
25
44
  end
26
- raise "Hash não possui key '#{key}'"
45
+ (@default.is_a? Proc)? @default.call : @default
27
46
  end
28
47
 
48
+ #
49
+ # Associates the value given by value with the key given by key.
50
+ # If already exists a key then key value will be updated.
51
+ #
52
+ # my_hash = RHash.new
53
+ #
54
+ # my_hash["cow"] = "mooo..."
55
+ #
56
+ # my_hash["cow"] #=> "mooo..."
57
+ #
58
+ # my_hash["cow"] = "cocó..."
59
+ #
60
+ # my_hash["cow"] #=> "cocó..."
61
+ #
29
62
  def []= key, value
30
63
  info = Info.new
31
64
  info.key = key
@@ -38,6 +71,9 @@ class RHash
38
71
  end
39
72
  end
40
73
 
74
+ #
75
+ # Return the contents of this hash as a string.
76
+ #
41
77
  def inspect
42
78
  msg = '{'
43
79
  @hash.each_with_index do |info, index|
@@ -48,71 +84,113 @@ class RHash
48
84
  msg
49
85
  end
50
86
 
51
- def sort
52
- int_sort
87
+ #
88
+ # Returns a RHash orderned by key name or block.
89
+ # If block is given using Array#sort else sort by name.
90
+ #
91
+ def sort(&block)
92
+ sort_rhash = RHash.new
93
+ int_sort(&block).each do |info|
94
+ sort_rhash[info[0]] = info[1]
95
+ end
96
+ sort_rhash
53
97
  end
54
98
 
55
- def sort!
56
- new_hash = int_sort
57
- @hash = new_hash
58
- @hash
99
+ #
100
+ # Sorts self.
101
+ # If block is given using Array#sort else sort by name.
102
+ #
103
+ def sort!(&block)
104
+ sort_hash = int_sort(&block)
105
+ clear
106
+ sort_hash.each do |info|
107
+ self[info[0]] = info[1]
108
+ end
59
109
  end
60
110
 
111
+ #
112
+ # Orderned RHash and calls block once for each key in RHash,
113
+ # passing the key and value to the block as a two-element array
114
+ #
61
115
  def sort_each(&block)
62
116
  new_hash = int_sort
63
117
  new_hash.each do |info|
64
- yield info if block_given?
118
+ yield [info.key, info.value] if block_given?
65
119
  end
66
120
  end
67
121
 
122
+ #
123
+ # See Hash::each
124
+ #
68
125
  def each(&block)
69
126
  @hash.each do |info|
70
- yield info if block_given?
127
+ yield [info.key, info.value] if block_given?
71
128
  end
72
129
  end
73
130
 
131
+ #
132
+ # See Hash::each_pair
133
+ #
74
134
  def each_pair(&block)
75
135
  @hash.each do |info|
76
136
  yield info.key, info.value if block_given?
77
137
  end
78
138
  end
79
139
 
140
+ #
141
+ # See Hash::each_value
142
+ #
80
143
  def each_value(&block)
81
144
  array(:value).each do |value|
82
145
  yield value if block_given?
83
146
  end
84
147
  end
85
148
 
149
+ #
150
+ # See Hash::each_key
151
+ #
86
152
  def each_key(&block)
87
153
  array(:key).each do |value|
88
154
  yield value if block_given?
89
155
  end
90
156
  end
91
157
 
158
+ #
159
+ # See Hash::select
160
+ #
92
161
  def select(&block)
93
162
  selected_entries = []
94
163
  @hash.each do |info|
95
164
  if block_given?
96
165
  if yield info
97
- selected_entries << info
166
+ selected_entries << [info.key, info.value]
98
167
  end
99
168
  end
100
169
  end
101
170
  selected_entries
102
171
  end
103
172
 
173
+ #
174
+ # See Hash::keys
175
+ #
104
176
  def keys
105
177
  new_array = []
106
178
  @hash.each{|info| new_array << info.key}
107
179
  new_array
108
180
  end
109
181
 
182
+ #
183
+ # See Hash::values
184
+ #
110
185
  def values
111
186
  new_array = []
112
187
  @hash.each{|info| new_array << info.value}
113
188
  new_array
114
189
  end
115
190
 
191
+ #
192
+ # See Hash::key?
193
+ #
116
194
  def has_key?(key)
117
195
  @hash.each{|info| return true if info.key == key}
118
196
  false
@@ -120,16 +198,25 @@ class RHash
120
198
  alias :key? :has_key?
121
199
  alias :member? :has_key?
122
200
 
201
+ #
202
+ # See Hash::value?
203
+ #
123
204
  def has_value?(value)
124
205
  @hash.each{|info| return true if info.value == value}
125
206
  false
126
207
  end
127
208
  alias :value? :has_value?
128
209
 
210
+ #
211
+ # See Hash::delete_if
212
+ #
129
213
  def delete_if(&block)
130
214
  @hash.delete_if{|info| yield info.key, info.value if block_given?}
131
215
  end
132
216
 
217
+ #
218
+ # See Hash::delete
219
+ #
133
220
  def delete(key, &block)
134
221
  deleted = nil
135
222
  @hash.delete_if{|info| info.key == key; deleted = info if info.key == key}
@@ -137,11 +224,18 @@ class RHash
137
224
  return "Deleted: #{deleted.key.inspect} => #{deleted.value.inspect}" if deleted
138
225
  end
139
226
 
227
+ #
228
+ # See Hash::size
229
+ #
140
230
  def size
141
231
  @hash.size
142
232
  end
233
+
143
234
  alias :length :size
144
235
 
236
+ #
237
+ # See Hash::invert
238
+ #
145
239
  def invert
146
240
  new_hash = RHash.new
147
241
  @hash.each do |i|
@@ -149,11 +243,17 @@ class RHash
149
243
  end
150
244
  new_hash
151
245
  end
152
-
246
+
247
+ #
248
+ # See RHash::inspect
249
+ #
153
250
  def to_s
154
251
  inspect
155
252
  end
156
253
 
254
+ #
255
+ # See Hash::merge
256
+ #
157
257
  def merge(rhash)
158
258
  new_hash = RHash.new
159
259
  raise "Não é uma Hash ou RHash" unless rhash.is_a? RHash or rhash.is_a? Hash
@@ -176,6 +276,9 @@ class RHash
176
276
  new_hash
177
277
  end
178
278
 
279
+ #
280
+ # See Hash::merge!
281
+ #
179
282
  def merge!(rhash)
180
283
  raise "Não é uma Hash ou RHash" unless rhash.is_a? RHash or rhash.is_a? Hash
181
284
  if rhash.is_a? RHash
@@ -189,14 +292,24 @@ class RHash
189
292
  end
190
293
  end
191
294
 
295
+ #
296
+ # Returns an array with first key and value found in RHash.
297
+ #
192
298
  def first
193
- @hash.first
299
+ first = @hash.first
300
+ [first.key, first.value]
194
301
  end
195
302
 
303
+ #
304
+ # Returns an array with last key and value found in RHash.
305
+ #
196
306
  def last
197
307
  @hash.last
198
308
  end
199
309
 
310
+ #
311
+ # See Hash::fetch
312
+ #
200
313
  def fetch(key, msg='', &block)
201
314
  value = select{|i| i.key == key}[0]
202
315
 
@@ -207,14 +320,23 @@ class RHash
207
320
  end
208
321
  end
209
322
 
323
+ #
324
+ # See Hash::clear
325
+ #
210
326
  def clear
211
327
  @hash = []
212
328
  end
213
329
 
330
+ #
331
+ # See Hash::default=
332
+ #
214
333
  def default=(value)
215
334
  @default = value
216
335
  end
217
336
 
337
+ #
338
+ # See Hash::default
339
+ #
218
340
  def default(key)
219
341
  if @default.is_a? Proc
220
342
  info = Info.new
@@ -229,19 +351,31 @@ class RHash
229
351
  end
230
352
  end
231
353
 
354
+ #
355
+ # See Hash::shift
356
+ #
232
357
  def shift
233
358
  shifted = @hash.shift
234
359
  [shifted.key, shifted.value]
235
360
  end
236
361
 
362
+ #
363
+ # See Hash::empty?
364
+ #
237
365
  def empty?
238
366
  @hash.empty?
239
367
  end
240
368
 
369
+ #
370
+ # See Hash::store
371
+ #
241
372
  def store(key, value)
242
373
  self[key] = value
243
374
  end
244
375
 
376
+ #
377
+ # See Hash::to_a
378
+ #
245
379
  def to_a
246
380
  array = []
247
381
  @hash.each do |info|
@@ -250,6 +384,9 @@ class RHash
250
384
  array
251
385
  end
252
386
 
387
+ #
388
+ # See Hash::values_at
389
+ #
253
390
  def values_at(*keys)
254
391
  selected = []
255
392
  @hash.each do |info|
@@ -258,7 +395,9 @@ class RHash
258
395
  selected
259
396
  end
260
397
 
261
- # Converte para hash
398
+ #
399
+ # Converts to a Hash.
400
+ #
262
401
  def to_hash
263
402
  pure_hash = {}
264
403
  @hash.each do |info|
@@ -269,9 +408,17 @@ class RHash
269
408
 
270
409
  private
271
410
 
272
- def int_sort
411
+ def int_sort(&block)
273
412
  new_hash = []
274
- new_hash = @hash.sort_by{|info| info.key}
413
+ if !block_given?
414
+ new_hash = @hash.sort_by{|info| info.key}
415
+ else
416
+ aux = []
417
+ @hash.each do |info|
418
+ aux << [info.key, info.value]
419
+ end
420
+ new_hash = aux.sort(&block)
421
+ end
275
422
  new_hash
276
423
  end
277
424
 
data/test/test.rb CHANGED
@@ -1,19 +1,26 @@
1
1
  require 'lib/rhash'
2
2
 
3
3
  n = RHash.new
4
- n[:g] = 5
5
- n[:a] = 8
6
- n[:x] = 105
7
- n[:xxx] = 105
4
+ n['b'] = 400
5
+ n['g'] = 5
6
+ n["a"] = 8
7
+ n["x"] = 105
8
+ n["xx"] = 1054
8
9
 
9
- puts n.inspect
10
- n.sort!
11
- puts n.inspect
10
+ #puts n.inspect
11
+ #n.sort!{|i,j| i[0] <=> j[0]}
12
+ #puts n.inspect
13
+ #x = n.sort{|i,j| i[1] <=> j[1]}
14
+ #puts x.class
15
+ #puts x.inspect
16
+ #puts n.inspect
17
+ #puts n[:s]
12
18
  #n.sort_each{|i| puts i}
19
+ #n.each{|i| puts i}
13
20
  #n.each_pair{|i, j| puts i; puts j+1}
14
21
  #n.each_value{|i| puts i+10}
15
22
  #n.each_key{|i| puts i.inspect}
16
- #puts n.select{|i| i.value > 100}
23
+ puts n.select{|i| i.value > 100}
17
24
  #puts n.keys.inspect
18
25
  #puts n.values.inspect
19
26
  #puts n.has_key?("a")
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rhash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ hash: 25
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 3
10
+ version: 0.0.3
5
11
  platform: ruby
6
12
  authors:
7
13
  - Rodrigo Mello Nardi
@@ -9,7 +15,7 @@ autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
17
 
12
- date: 2010-07-13 00:00:00 -03:00
18
+ date: 2010-07-14 00:00:00 -03:00
13
19
  default_executable:
14
20
  dependencies: []
15
21
 
@@ -25,7 +31,7 @@ files:
25
31
  - lib/rhash.rb
26
32
  - test/test.rb
27
33
  has_rdoc: true
28
- homepage:
34
+ homepage: http://rubyhideoutprogramming.blogspot.com/
29
35
  licenses: []
30
36
 
31
37
  post_install_message:
@@ -34,21 +40,27 @@ rdoc_options: []
34
40
  require_paths:
35
41
  - lib
36
42
  required_ruby_version: !ruby/object:Gem::Requirement
43
+ none: false
37
44
  requirements:
38
45
  - - ">="
39
46
  - !ruby/object:Gem::Version
47
+ hash: 3
48
+ segments:
49
+ - 0
40
50
  version: "0"
41
- version:
42
51
  required_rubygems_version: !ruby/object:Gem::Requirement
52
+ none: false
43
53
  requirements:
44
54
  - - ">="
45
55
  - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
46
59
  version: "0"
47
- version:
48
60
  requirements: []
49
61
 
50
62
  rubyforge_project:
51
- rubygems_version: 1.3.5
63
+ rubygems_version: 1.3.7
52
64
  signing_key:
53
65
  specification_version: 3
54
66
  summary: an ordenable hash