module NDHash

Constants

VERSION

Public Instance Methods

add_entry(hash, level, entry_num:) click to toggle source
# File lib/ndhash.rb, line 29
def add_entry(hash, level, entry_num:)
  hash[get_entry_key(level, entry_num)] = get_value(level, entry_num)
end
count_levels(hash) click to toggle source
# File lib/ndhash.rb, line 45
def count_levels(hash)
  count_levels_rec(1, hash)
end
count_levels_rec(current_level, hash) click to toggle source
# File lib/ndhash.rb, line 49
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
generate(levels:, values_per_level:2, hashes_per_level:1) click to toggle source
# File lib/ndhash.rb, line 6
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
generate_rec(current_level, max_level, entries_per_level, pointers_per_level) click to toggle source
# File lib/ndhash.rb, line 12
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
get_entry_key(level, entry_num) click to toggle source
# File lib/ndhash.rb, line 33
def get_entry_key(level, entry_num)
  "level_#{level}_key_#{entry_num}"
end
get_pointer_key(level, entry_num:) click to toggle source
# File lib/ndhash.rb, line 41
def get_pointer_key(level, entry_num:)
  "level_#{level}_pointer_#{entry_num}"
end
get_value(level, entry_num) click to toggle source
# File lib/ndhash.rb, line 37
def get_value(level, entry_num)
  "level_#{level}_value_#{entry_num}"
end