Class: Farce::Local::WeakMap

Inherits:
Abstract::WeakMap show all
Includes:
Shareable::Tracked
Defined in:
lib/farce/local/weak_map.rb

Overview

A shareable weak map with independent mutable storage in each scope.

Instance Attribute Summary

Attributes included from Scoped

#scope

Instance Method Summary collapse

Methods included from Shareable

#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, scope: :ractor, **options) ⇒ WeakMap

Valid scopes are:

  • :ractor - The value is shared by all threads within the same Ractor.
  • :thread_group - The value is shared by all threads within the same thread group.
  • :thread - The value is shared by all fibers within the same thread.
  • :fiber_storage - The value is shared by all fibers using the same storage. Unless explicitly specified, storage is inherited from the parent fiber for blocking fibers, but not for non-blocking fibers (such as those created by Scheduler#schedule).
  • :fiber - Each fiber has its own independent value.

Parameters:

  • initial_mapping (Hash, Farce::Abstract::Map, #each, nil) (defaults to: nil) —

    the entries to store initially

  • scope (Symbol) (defaults to: :ractor) —

    the scope of the weak map

Options Hash (**options):

  • compare_by_identity (Boolean) — default: false —

    whether keys and values are compared by identity

  • compare_keys_by_identity (Boolean) — default: compare_by_identity —

    whether keys are compared by identity

  • compare_values_by_identity (Boolean) — default: compare_by_identity —

    whether values are compared by identity



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/farce/local/weak_map.rb', line 18

class WeakMap < Abstract::WeakMap
  include Shareable::Tracked
  include Scoped::Tracked

  protected

  def internal_map = scoped_value

  private

  def new_scoped_value(entries = nil, **)
    unless @key_normalizer || Internal::KeyNormalizer.canonical_entries?(entries)
      return Internal::UnsharedWeakMap.new(entries, **)
    end

    map = Internal::UnsharedWeakMap.new(nil, **)
    entries&.each { map[_1] = _2 }
    Internal::KeyNormalizer.wrap_concurrent(map, @key_normalizer)
  end
end