numeric_hash 0.3.0 → 0.3.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/numeric_hash/version.rb +1 -1
- data/lib/numeric_hash.rb +20 -4
- metadata +3 -3
data/lib/numeric_hash/version.rb
CHANGED
data/lib/numeric_hash.rb
CHANGED
@@ -180,8 +180,24 @@ class NumericHash < Hash
|
|
180
180
|
# @hash.collect_numeric(&:to_s) # => { :a => "1", :b => { :c => "2", :d => "3" } }
|
181
181
|
#
|
182
182
|
def collect_numeric(&block)
|
183
|
+
# First attempt to map into a NumericHash.
|
184
|
+
map_to_hash(NumericHash) do |key, value|
|
185
|
+
if value.is_a?(NumericHash)
|
186
|
+
result = value.collect_numeric(&block)
|
187
|
+
else
|
188
|
+
result = yield(value)
|
189
|
+
|
190
|
+
# If the mapped value not Numeric, abort so that we try again by
|
191
|
+
# mapping into a regular Hash.
|
192
|
+
raise TypeError.new('result is not Numeric') unless result.is_a?(Numeric)
|
193
|
+
end
|
194
|
+
[key, result]
|
195
|
+
end
|
196
|
+
rescue TypeError
|
197
|
+
# At least one of the values mapped into a non-Numeric result; map into a
|
198
|
+
# regular Hash instead.
|
183
199
|
map_to_hash do |key, value|
|
184
|
-
[key, value.is_a?(NumericHash) ? value.collect_numeric(&block) : yield(value)]
|
200
|
+
[key, value.is_a?(NumericHash) ? value.collect_numeric(&block) : yield(value) ]
|
185
201
|
end
|
186
202
|
end
|
187
203
|
alias_method :map_numeric, :collect_numeric
|
@@ -224,7 +240,7 @@ protected
|
|
224
240
|
elsif value.respond_to?(:to_int)
|
225
241
|
value.to_int
|
226
242
|
else
|
227
|
-
raise
|
243
|
+
raise TypeError.new("cannot convert to Numeric: #{value.inspect}")
|
228
244
|
end
|
229
245
|
end
|
230
246
|
|
@@ -239,9 +255,9 @@ protected
|
|
239
255
|
# First value is (or can be converted into) a Numeric
|
240
256
|
value1 = convert_to_numeric(value1)
|
241
257
|
if value2.is_a?(NumericHash)
|
242
|
-
# Second value is a NumericHash; each of its
|
258
|
+
# Second value is a NumericHash; each of its Numeric values should be
|
243
259
|
# applied to the first value.
|
244
|
-
value2.
|
260
|
+
value2.map_numeric { |value2_sub_value| value1.__send__(operator, value2_sub_value) }
|
245
261
|
else
|
246
262
|
# Second value also is (or can be converted into) a Numeric; apply the
|
247
263
|
# two values directly.
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: numeric_hash
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 17
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
9
|
+
- 1
|
10
|
+
version: 0.3.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Clyde Law
|