Class: Farce::Unshared::WeakMap

Inherits:
Abstract::WeakMap show all
Includes:
Farce::Unshareable
Defined in:
lib/farce/unshared/weak_map.rb

Overview

A thread-safe map with weak keys and values for use within one Ractor.

Examples:

Keeping a relationship while both mutable objects remain alive

key   = Object.new
value = Object.new
map   = Farce::Unshared::WeakMap.new({ key => value })
map[key].equal?(value) # => true

# The entry can disappear once its key or value is collected
value = nil

Instance Method Summary collapse

Methods included from Farce::Unshareable

#ractor_shareable?

Methods inherited from Abstract::WeakMap

#weak_keys?, #weak_values?

Methods inherited from Abstract::ConcurrentMap

#[], #[]=, #clear, #compact!, #compact_blank!, #compare_and_set, #compare_keys_by_identity?, #compare_values_by_identity?, #delete, #delete_if, #each, #each_key, #each_value, #fetch, #get, #getkey, #keep_if, #key?, #keys, #merge!, #reject!, #reverse_merge!, #select!, #size, #store, #store_if_absent, #swap, #transform_values!, #update, #upsert, #values, #wait_until, #wait_until_changed, #wait_until_match, #wait_until_non_nil, #wait_until_value, #wait_while, #wait_while_match, #wait_while_value

Methods included from Abstract::DuplicableMap

#compact, #compact_blank, #deep_dup, #duplicable?, #except, #flatten, #invert, #merge, #reject, #reverse_merge, #select, #slice, #stringify_keys, #symbolize_keys, #to_proc, #transform_keys, #transform_values, #with_indifferent_access

Methods inherited from Abstract::Map

#[], #[]=, #as_extended_json, #as_json, #assert_valid_keys, #assoc, #bson_type, #clear, #compare_by_identity?, #compare_keys_by_identity?, #compare_values_by_identity?, #deconstruct_keys, #delete, #dig, #each, #each_key, #each_pair, #each_value, #empty?, #fetch, #fetch_values, #getkey, #has_key?, #key, #key?, #keys, #length, #rassoc, #shareable_keys?, #shareable_values?, #size, #store, #store_if_absent, #to_a, #to_bson, #to_bson_normalized_value, #to_cbor, #to_h, #to_hash, #to_json, #to_msgpack, #to_query, #to_s, #value?, #values_at, #weak_keys?, #weak_values?

Constructor Details

#initialize(initial_mapping = nil, normalize_keys: nil, compare_by_identity: false, compare_keys_by_identity: compare_by_identity, compare_values_by_identity: compare_by_identity) ⇒ WeakMap

Returns a new instance of WeakMap.



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/farce/unshared/weak_map.rb', line 20

def initialize(
  initial_mapping = nil,
  normalize_keys: nil,
  compare_by_identity: false,
  compare_keys_by_identity: compare_by_identity,
  compare_values_by_identity: compare_by_identity
)
  initial_mapping = convert_entries(initial_mapping)
  restoring  = Internal::KeyNormalizer.restoration?(normalize_keys)
  normalizer = Internal::KeyNormalizer.build(normalize_keys, shareable: false)
  populate   = initial_mapping && ((normalizer && !restoring) || !initial_mapping.is_a?(Hash))
  @map       = Internal::UnsharedWeakMap.new(
    populate ? nil : initial_mapping,
    compare_by_identity:,
    compare_keys_by_identity:,
    compare_values_by_identity:,
  )
  Internal::KeyNormalizer.install_concurrent(self, normalizer) unless restoring
  initial_mapping.each { |key, value| self[key] = value } if populate
  Internal::KeyNormalizer.install_concurrent(self, normalizer) if restoring
  super()
end