Sha256: c7364230f0790afde79e38524a3b0bc928455d38b9fabf2b1d76c0489104c39b
Contents?: true
Size: 1.62 KB
Versions: 1
Compression:
Stored size: 1.62 KB
Contents
require "ndhash/version" module NDHash module_function def generate(levels:, values_per_level:2, hashes_per_level:1) raise ArgumentError, 'Negative or zero value given' if levels < 1 or values_per_level < 0 or hashes_per_level < 0 raise ArgumentError, 'Less than 1 number of pointers defined for multi-level hash' if levels > 1 and hashes_per_level < 1 generate_rec(1, levels, values_per_level, hashes_per_level) end def generate_rec(current_level, max_level, entries_per_level, pointers_per_level) hash = {} entries_per_level.times do |n| add_entry(hash, current_level, entry_num: n+1) end unless current_level == max_level pointers_per_level.times do |n| next_level = generate_rec(current_level+1, max_level, entries_per_level, pointers_per_level) hash[get_pointer_key(current_level, entry_num: n+1)] = next_level end end hash end def add_entry(hash, level, entry_num:) hash[get_entry_key(level, entry_num)] = get_value(level, entry_num) end def get_entry_key(level, entry_num) "level_#{level}_key_#{entry_num}" end def get_value(level, entry_num) "level_#{level}_value_#{entry_num}" end def get_pointer_key(level, entry_num:) "level_#{level}_pointer_#{entry_num}" end def count_levels(hash) count_levels_rec(1, hash) end def count_levels_rec(current_level, hash) max_level = current_level hash.each_value do |v| if Hash === v max_level = [count_levels_rec(current_level+1, v), current_level].max end end max_level end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
ndhash-0.4.0 | lib/ndhash.rb |