class PersistentTree::MapView

Read only view of a Map at a given version

Constants

Entry

Internal data structure used to store key-value pairs

Public Class Methods

new(tree, version, default_value, default_proc) click to toggle source
# File lib/persistent_tree/map.rb, line 43
def initialize(tree, version, default_value, default_proc)
  @tree = tree
  @version = version
  @default_value = default_value
  @default_proc = default_proc
end

Public Instance Methods

[](key) click to toggle source
# File lib/persistent_tree/map.rb, line 50
def [](key)
  found, value = fetch_without_default(key)
  if found
    value
  elsif @default_proc
    @default_proc.call(self, key)
  else
    @default_value
  end
end
each() { |key, value| ... } click to toggle source
# File lib/persistent_tree/map.rb, line 61
def each
  if block_given?
    @tree.each(@version) do |item|
      yield item.key, item.value
    end
    self
  else
    to_enum
  end
end
Also aliased as: each_pair
each_key(&block) click to toggle source
# File lib/persistent_tree/map.rb, line 72
def each_key(&block)
  if block_given?
    keys.each(&block)
    self
  else
    keys.each
  end
end
each_pair()
Alias for: each
fetch(*args) { |key| ... } click to toggle source
# File lib/persistent_tree/map.rb, line 81
def fetch(*args)
  raise ArgumentError, "wrong number of arguments (#{args.length} for 1..2)" \
    unless args.length.between?(1, 2)

  warn('block supersedes default value argument') if args.length == 2 && block_given?

  key = args[0]
  found, value = fetch_without_default(key)
  if found
    value
  elsif block_given?
    yield key
  elsif args.length == 2
    args[1]
  else
    raise KeyError, "key not found: #{key}"
  end
end
flatten(*args) click to toggle source
# File lib/persistent_tree/map.rb, line 100
def flatten(*args)
  # avoid unnecessary work if possible
  return flatten_key_value_pairs if args.empty?

  raise ArgumentError, "wrong number of arguments (#{args.length} for 0..1)" if args.length > 1

  raise TypeError, "no implicit conversion of #{args[0].class.name} into Integer" \
    unless args[0].respond_to?(:to_int)

  level = args[0].to_int
  return to_a if level.zero? # Rely on implicit array conversion behaviour

  result = flatten_key_value_pairs # Otherwise, flatten recursively
  if (level - 1).positive?
    result.flatten!(level - 1)
  elsif level.negative?
    result.flatten!
  end
  result
end
has_key?(key)
Alias for: include?
include?(key) click to toggle source
# File lib/persistent_tree/map.rb, line 125
def include?(key)
  @tree.include?(@version, key)
end
Also aliased as: has_key?, key?, member?
key?(key)
Alias for: include?
keys() click to toggle source
# File lib/persistent_tree/map.rb, line 121
def keys
  @tree.map(@version, &:key)
end
member?(key)
Alias for: include?
select() { |key, value| ... } click to toggle source
# File lib/persistent_tree/map.rb, line 129
def select
  if block_given?
    new_map = Map.new
    @tree.each(@version) do |item|
      new_map.store item.key, item.value if yield item.key, item.value
    end
    new_map
  else
    to_enum(:select)
  end
end
size() click to toggle source
# File lib/persistent_tree/map.rb, line 141
def size
  @tree.size(@version)
end

Private Instance Methods

fetch_without_default(key) click to toggle source
# File lib/persistent_tree/map.rb, line 152
def fetch_without_default(key)
  [true, @tree.find(@version, key).value]
rescue KeyError
  [false, nil]
end
flatten_key_value_pairs() click to toggle source
# File lib/persistent_tree/map.rb, line 158
def flatten_key_value_pairs
  result = Array.new(size * 2)
  index = 0
  each do |key, value|
    result[index] = key
    result[index + 1] = value
    index += 2
  end
  result
end