Class: PersistentTree::MapView
- Inherits:
-
Object
- Object
- PersistentTree::MapView
- Includes:
- Enumerable
- Defined in:
- lib/persistent_tree/map.rb
Overview
Read only view of a Map at a given version
Direct Known Subclasses
Instance Method Summary collapse
- #[](key) ⇒ Object
- #each ⇒ Object (also: #each_pair)
- #each_key(&block) ⇒ Object
- #fetch(*args) ⇒ Object
- #flatten(*args) ⇒ Object
- #include?(key) ⇒ Boolean (also: #has_key?, #key?, #member?)
-
#initialize(tree, version, default_value, default_proc) ⇒ MapView
constructor
A new instance of MapView.
- #keys ⇒ Object
- #select ⇒ Object
- #size ⇒ Object
Constructor Details
#initialize(tree, version, default_value, default_proc) ⇒ MapView
Returns a new instance of MapView.
43 44 45 46 47 48 |
# 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 |
Instance Method Details
#[](key) ⇒ Object
50 51 52 53 54 55 56 57 58 59 |
# 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 ⇒ Object Also known as: each_pair
61 62 63 64 65 66 67 68 69 70 |
# 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 |
#each_key(&block) ⇒ Object
72 73 74 75 76 77 78 79 |
# 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) ⇒ Object
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# 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) ⇒ Object
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
# 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) ⇒ Boolean Also known as: has_key?, key?, member?
125 126 127 |
# File 'lib/persistent_tree/map.rb', line 125 def include?(key) @tree.include?(@version, key) end |
#keys ⇒ Object
121 122 123 |
# File 'lib/persistent_tree/map.rb', line 121 def keys @tree.map(@version, &:key) end |
#select ⇒ Object
129 130 131 132 133 134 135 136 137 138 139 |
# 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 ⇒ Object
141 142 143 |
# File 'lib/persistent_tree/map.rb', line 141 def size @tree.size(@version) end |