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
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
include?(key)
click to toggle source
# File lib/persistent_tree/map.rb, line 125 def include?(key) @tree.include?(@version, key) end
keys()
click to toggle source
# File lib/persistent_tree/map.rb, line 121 def keys @tree.map(@version, &:key) end
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