Class: PersistentTree::Map

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from MapView

#[], #each, #each_key, #fetch, #flatten, #include?, #keys, #select, #size

Constructor Details

#initialize(*args, &block) ⇒ Map

Returns a new instance of Map.



173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# File 'lib/persistent_tree/map.rb', line 173

def initialize(*args, &block)
  default_proc = nil
  default_value = nil
  if block_given?
    raise ArgumentError, "wrong number of arguments (#{args.length} for 0)" unless args.empty?

    if block.is_a? Proc
      default_proc = block
    else
      default_proc = Proc.new
    end

    raise TypeError, "default_proc takes two arguments (2 for #{default_proc.arity})" \
      if default_proc.lambda? && default_proc.arity != 2

  elsif args.length == 1
    default_value = args[0]
  elsif !args.empty?
    raise ArgumentError, "wrong number of arguments (#{args.length} for 0..1)"
  end
  super(PersistentTree::Tree.new, 0, default_value, default_proc)
end

Instance Attribute Details

#default_procObject

Returns the value of attribute default_proc.



171
172
173
# File 'lib/persistent_tree/map.rb', line 171

def default_proc
  @default_proc
end

Instance Method Details

#[]=(key, value) ⇒ Object



196
197
198
# File 'lib/persistent_tree/map.rb', line 196

def []=(key, value)
  store(key, value)
end

#default(key = nil) ⇒ Object



200
201
202
203
204
205
206
# File 'lib/persistent_tree/map.rb', line 200

def default(key = nil)
  if @default_value
    @default_value
  elsif @default_proc && key
    @default_proc.call(self, key)
  end
end

#default=(value) ⇒ Object



208
209
210
211
# File 'lib/persistent_tree/map.rb', line 208

def default=(value)
  @default_proc = nil
  @default_value = value
end

#store(key, value) ⇒ Object



230
231
232
233
234
235
236
237
238
239
# File 'lib/persistent_tree/map.rb', line 230

def store(key, value)
  if key.is_a?(String) && !key.frozen?
    key_to_store = key.freeze
  else
    key_to_store = key
  end
  @tree.insert_or_replace(Entry.new(key_to_store, value)).value
  @version = @tree.version
  value
end

#version(*args) ⇒ Object



241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
# File 'lib/persistent_tree/map.rb', line 241

def version(*args)
  if args.length == 1
    requested_version = args[0]
    raise TypeError, 'requested version should be an integer' \
      unless requested_version.is_a? Integer

    raise RangeError, "requested version (#{requested_version}) exceeds current version (#{@tree.version})" \
      if requested_version > @tree.version

    MapView.new(@tree, requested_version, @default_value, @default_proc)
  elsif args.empty?
    @tree.version
  else
    raise ArgumentError, "wrong number of arguments(#{args.length} for 0..1)"
  end
end