lib/umbrellio_utils/misc.rb in umbrellio-utils-0.3.0 vs lib/umbrellio_utils/misc.rb in umbrellio-utils-0.3.1
- old
+ new
@@ -17,16 +17,50 @@
sleep delay
end
end
+ #
# Ranges go from high to low priority
+ #
def merge_ranges(*ranges)
ranges = ranges.map { |x| x.present? && x.size == 2 ? x : [nil, nil] }
ranges.first.zip(*ranges[1..]).map { |x| x.find(&:present?) }
end
+ #
+ # Builds empty hash which recursively returns empty hash, if key is not found.
+ # Also note, that this hash and all subhashes has set #default_proc.
+ # To reset this attribute use {#reset_defaults_for_hash}
+ #
+ # @example Dig to key
+ # h = UmbrellioUtils::Misc.build_infinite_hash => {}
+ # h.dig(:kek, :pek) => {}
+ # h => { kek: { pek: {} } }
+ #
+ # @return [Hash] empty infinite hash.
+ #
def build_infinite_hash
Hash.new { |hash, key| hash[key] = Hash.new(&hash.default_proc) }
+ end
+
+ #
+ # Deeply sets #default and #default_proc values to nil.
+ #
+ # @param hash [Hash] hash for which you want to reset defaults.
+ #
+ # @return [Hash] reset hash.
+ #
+ def reset_defaults_for_hash(hash)
+ hash.dup.tap do |dup_hash|
+ dup_hash.default = nil
+ dup_hash.default_proc = nil
+
+ dup_hash.transform_values! do |obj|
+ next obj.deep_dup unless obj.is_a?(Hash)
+
+ reset_defaults_for_hash(obj)
+ end
+ end
end
end
end