Class: PersistentTree::MapView

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/persistent_tree/map.rb

Overview

Read only view of a Map at a given version

Direct Known Subclasses

Map

Instance Method Summary collapse

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

#eachObject 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

Raises:

  • (ArgumentError)


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

Raises:

  • (ArgumentError)


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?

Returns:

  • (Boolean)


125
126
127
# File 'lib/persistent_tree/map.rb', line 125

def include?(key)
  @tree.include?(@version, key)
end

#keysObject



121
122
123
# File 'lib/persistent_tree/map.rb', line 121

def keys
  @tree.map(@version, &:key)
end

#selectObject



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

#sizeObject



141
142
143
# File 'lib/persistent_tree/map.rb', line 141

def size
  @tree.size(@version)
end