Object
Multimap is a generalization of a map or associative array abstract data type in which more than one value may be associated with and returned for a given key.
require 'multimap'
map = Multimap.new
map["a"] = 100
map["b"] = 200
map["a"] = 300
map["a"] # -> [100, 300]
map["b"] # -> [200]
map.keys # -> #<Multiset: {a, a, b}>
Creates a new multimap populated with the given objects.
Multimap["a", 100, "b", 200] #=> {"a"=>[100], "b"=>[200]}
Multimap["a" => 100, "b" => 200] #=> {"a"=>[100], "b"=>[200]}
# File lib/rack/mount/vendor/multimap/multimap.rb, line 30
30: def self.[](*args)
31: default = []
32:
33: if args.size == 2 && args.last.is_a?(Hash)
34: default = args.shift
35: elsif !args.first.is_a?(Hash) && args.size % 2 == 1
36: default = args.shift
37: end
38:
39: if args.size == 1 && args.first.is_a?(Hash)
40: args[0] = args.first.inject({}) { |hash, (key, value)|
41: unless value.is_a?(default.class)
42: value = (default.dup << value)
43: end
44: hash[key] = value
45: hash
46: }
47: else
48: index = 0
49: args.map! { |value|
50: unless index % 2 == 0 || value.is_a?(default.class)
51: value = (default.dup << value)
52: end
53: index += 1
54: value
55: }
56: end
57:
58: map = new
59: map.instance_variable_set(:@hash, Hash[*args])
60: map.default = default
61: map
62: end
Returns a new, empty multimap.
map = Multimap.new(Set.new) h["a"] = 100 h["b"] = 200 h["a"] #=> [100].to_set h["c"] #=> [].to_set
# File lib/rack/mount/vendor/multimap/multimap.rb, line 75
75: def initialize(default = [])
76: @hash = Hash.new(default)
77: end
Retrieves the value object corresponding to the *keys object.
# File lib/rack/mount/vendor/multimap/multimap.rb, line 91
91: def [](key)
92: @hash[key]
93: end
Returns a new array populated with the containers from map. See also Multimap#keys and Multimap#values.
map = Multimap["a" => 100, "b" => [200, 300]] map.containers #=> [[100], [200, 300]]
# File lib/rack/mount/vendor/multimap/multimap.rb, line 507
507: def containers
508: containers = []
509: each_container { |container| containers << container }
510: containers
511: end
Deletes and returns a key-value pair from map. If only key is given, all the values matching that key will be deleted.
map = Multimap["a" => 100, "b" => [200, 300]]
map.delete("b", 300) #=> 300
map.delete("a") #=> [100]
# File lib/rack/mount/vendor/multimap/multimap.rb, line 126
126: def delete(key, value = nil)
127: if value
128: @hash[key].delete(value)
129: else
130: @hash.delete(key)
131: end
132: end
Deletes every key-value pair from map for which block evaluates to true.
map = Multimap["a" => 100, "b" => [200, 300]]
map.delete_if {|key, value| value >= 300 }
#=> Multimap["a" => 100, "b" => 200]
# File lib/rack/mount/vendor/multimap/multimap.rb, line 315
315: def delete_if
316: each_association do |key, container|
317: container.delete_if do |value|
318: yield [key, value]
319: end
320: end
321: self
322: end
Calls block for each key/value pair in map, passing the key and value to the block as a two-element array.
map = Multimap["a" => 100, "b" => [200, 300]]
map.each { |key, value| puts "#{key} is #{value}" }
produces:
a is 100 b is 200 b is 300
# File lib/rack/mount/vendor/multimap/multimap.rb, line 148
148: def each
149: each_pair do |key, value|
150: yield [key, value]
151: end
152: end
Calls block once for each key/container in map, passing the key and container to the block as parameters.
map = Multimap["a" => 100, "b" => [200, 300]]
map.each_association { |key, container| puts "#{key} is #{container}" }
produces:
a is [100] b is [200, 300]
# File lib/rack/mount/vendor/multimap/multimap.rb, line 167
167: def each_association(&block)
168: @hash.each_pair(&block)
169: end
Calls block for each container in map, passing the container as a parameter.
map = Multimap["a" => 100, "b" => [200, 300]]
map.each_container { |container| puts container }
produces:
[100] [200, 300]
# File lib/rack/mount/vendor/multimap/multimap.rb, line 184
184: def each_container
185: each_association do |_, container|
186: yield container
187: end
188: end
Calls block for each key in hsh, passing the key as a parameter.
map = Multimap["a" => 100, "b" => [200, 300]]
map.each_key { |key| puts key }
produces:
a b b
# File lib/rack/mount/vendor/multimap/multimap.rb, line 204
204: def each_key
205: each_pair do |key, _|
206: yield key
207: end
208: end
Calls block for each key/value pair in map, passing the key and value as parameters.
map = Multimap["a" => 100, "b" => [200, 300]]
map.each_pair { |key, value| puts "#{key} is #{value}" }
produces:
a is 100 b is 200 b is 300
# File lib/rack/mount/vendor/multimap/multimap.rb, line 224
224: def each_pair
225: each_association do |key, values|
226: values.each do |value|
227: yield key, value
228: end
229: end
230: end
Calls block for each key in map, passing the value as a parameter.
map = Multimap["a" => 100, "b" => [200, 300]]
map.each_value { |value| puts value }
produces:
100 200 300
# File lib/rack/mount/vendor/multimap/multimap.rb, line 246
246: def each_value
247: each_pair do |_, value|
248: yield value
249: end
250: end
Returns true if the given value is present for any key in map.
map = Multimap["a" => 100, "b" => [200, 300]] map.has_value?(300) #=> true map.has_value?(999) #=> false
# File lib/rack/mount/vendor/multimap/multimap.rb, line 286
286: def has_value?(value)
287: values.include?(value)
288: end
Returns true if the given key is present in Multimap.
# File lib/rack/mount/vendor/multimap/multimap.rb, line 398
398: def include?(key)
399: keys.include?(key)
400: end
Returns the key for a given value. If not found, returns nil.
map = Multimap["a" => 100, "b" => [200, 300]] map.index(100) #=> "a" map.index(200) #=> "b" map.index(999) #=> nil
# File lib/rack/mount/vendor/multimap/multimap.rb, line 301
301: def index(value)
302: invert[value]
303: end
Returns a new multimap created by using map’s values as keys, and the keys as values.
map = Multimap["n" => 100, "m" => 100, "d" => [200, 300]] map.invert #=> Multimap[100 => ["n", "m"], 200 => "d", 300 => "d"]
# File lib/rack/mount/vendor/multimap/multimap.rb, line 377
377: def invert
378: h = self.class.new(default.dup)
379: each_pair { |key, value| h[value] = key }
380: h
381: end
Returns a new Multiset populated with the keys from this hash. See also Multimap#values and Multimap#containers.
map = Multimap["a" => 100, "b" => [200, 300], "c" => 400] map.keys #=> Multiset.new(["a", "b", "b", "c"])
# File lib/rack/mount/vendor/multimap/multimap.rb, line 391
391: def keys
392: keys = Multiset.new
393: each_key { |key| keys << key }
394: keys
395: end
Returns a new multimap containing the contents of other_map and the contents of map.
map1 = Multimap["a" => 100, "b" => 200] map2 = Multimap["a" => 254, "c" => 300] map2.merge(map2) #=> Multimap["a" => 100, "b" => [200, 254], "c" => 300] map1 #=> Multimap["a" => 100, "b" => 200]
# File lib/rack/mount/vendor/multimap/multimap.rb, line 428
428: def merge(other)
429: dup.update(other)
430: end
Same as Multimap#delete_if, but works on (and returns) a copy of the map. Equivalent to map.dup.delete_if.
# File lib/rack/mount/vendor/multimap/multimap.rb, line 331
331: def reject(&block)
332: dup.delete_if(&block)
333: end
Equivalent to Multimap#delete_if, but returns nil if no changes were made.
# File lib/rack/mount/vendor/multimap/multimap.rb, line 341
341: def reject!(&block)
342: old_size = size
343: delete_if(&block)
344: old_size == size ? nil : self
345: end
Replaces the contents of map with the contents of other_map.
map = Multimap["a" => 100, "b" => 200]
map.replace({ "c" => 300, "d" => 400 })
#=> Multimap["c" => 300, "d" => 400]
# File lib/rack/mount/vendor/multimap/multimap.rb, line 356
356: def replace(other)
357: case other
358: when Array
359: @hash.replace(self.class[self.default, *other])
360: when Hash
361: @hash.replace(self.class[self.default, other])
362: when self.class
363: @hash.replace(other)
364: else
365: raise ArgumentError
366: end
367: end
Returns a new Multimap consisting of the pairs for which the block returns true.
map = Multimap["a" => 100, "b" => 200, "c" => 300]
map.select { |k,v| k > "a" } #=> Multimap["b" => 200, "c" => 300]
map.select { |k,v| v < 200 } #=> Multimap["a" => 100]
# File lib/rack/mount/vendor/multimap/multimap.rb, line 465
465: def select
466: inject(self.class.new) { |map, (key, value)|
467: map[key] = value if yield([key, value])
468: map
469: }
470: end
Returns the number of key-value pairs in the map.
map = Multimap["a" => 100, "b" => [200, 300], "c" => 400]
map.length #=> 4
map.delete("a") #=> 100
map.length #=> 3
# File lib/rack/mount/vendor/multimap/multimap.rb, line 413
413: def size
414: values.size
415: end
Associates the value given by value with the key given by key. Unlike a regular hash, multiple can be assoicated with the same value.
map = Multimap["a" => 100, "b" => 200]
map["a"] = 9
map["c"] = 4
map #=> {"a" => [100, 9], "b" => [200], "c" => [4]}
# File lib/rack/mount/vendor/multimap/multimap.rb, line 107
107: def store(key, value)
108: update_container(key) do |container|
109: container << value
110: container
111: end
112: end
Converts map to a nested array of [key, value] arrays.
map = Multimap["a" => 100, "b" => [200, 300], "c" => 400] map.to_a #=> [["a", 100], ["b", 200], ["b", 300], ["c", 400]]
# File lib/rack/mount/vendor/multimap/multimap.rb, line 480
480: def to_a
481: ary = []
482: each_pair do |key, value|
483: ary << [key, value]
484: end
485: ary
486: end
Converts map to a basic hash.
map = Multimap["a" => 100, "b" => [200, 300]]
map.to_hash #=> { "a" => [100], "b" => [200, 300] }
# File lib/rack/mount/vendor/multimap/multimap.rb, line 495
495: def to_hash
496: @hash.dup
497: end
Adds each pair from other_map to map.
map1 = Multimap["a" => 100, "b" => 200] map2 = Multimap["b" => 254, "c" => 300] map1.merge!(map2) #=> Multimap["a" => 100, "b" => [200, 254], "c" => 300]
# File lib/rack/mount/vendor/multimap/multimap.rb, line 443
443: def update(other)
444: case other
445: when self.class
446: other.each_pair { |key, value| store(key, value) }
447: when Hash
448: update(self.class[self.default, other])
449: else
450: raise ArgumentError
451: end
452: self
453: end
Returns a new array populated with the values from map. See also Multimap#keys and Multimap#containers.
map = Multimap["a" => 100, "b" => [200, 300]] map.values #=> [100, 200, 300]
# File lib/rack/mount/vendor/multimap/multimap.rb, line 521
521: def values
522: values = []
523: each_value { |value| values << value }
524: values
525: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.