class PersistentTree::Map

Attributes

default_proc[R]

Public Class Methods

new(*args, &block) click to toggle source
Calls superclass method PersistentTree::MapView::new
# 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

Public Instance Methods

[]=(key, value) click to toggle source
# File lib/persistent_tree/map.rb, line 196
def []=(key, value)
  store(key, value)
end
default(key = nil) click to toggle source
# 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) click to toggle source
# File lib/persistent_tree/map.rb, line 208
def default=(value)
  @default_proc = nil
  @default_value = value
end
default_proc=(proc) click to toggle source
# File lib/persistent_tree/map.rb, line 213
def default_proc=(proc)
  raise TypeError, "wrong default_proc type #{proc.class.name} (expected Proc)" \
    if proc.nil? || !proc.respond_to?(:to_proc)

  default_proc = proc.to_proc
  unless default_proc.is_a?(Proc)
    raise TypeError,
          "can't convert #{proc.class.name} to Proc (#{proc.class.name}#to_proc gives #{default_proc.class.name})"
  end

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

  @default_value = nil
  @default_proc = default_proc
end
store(key, value) click to toggle source
# 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) click to toggle source
# 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