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