Class: Zeitwerk::Cref::Map
- Inherits:
-
Object
- Object
- Zeitwerk::Cref::Map
- Defined in:
- lib/zeitwerk/cref/map.rb
Overview
: [Value]
Instance Method Summary collapse
-
#[](cref) ⇒ Object
: (Zeitwerk::Cref) -> Value?.
-
#[]=(cref, value) ⇒ Object
: (Zeitwerk::Cref, Value) -> Value.
-
#clear ⇒ Object
: () -> void.
-
#delete(cref) ⇒ Object
: (Zeitwerk::Cref) -> Value?.
-
#delete_by_value(value) ⇒ Object
: (Value) -> void.
-
#delete_mod_cname(mod, cname) ⇒ Object
Ad-hoc for loader_for, called from const_added.
-
#each_key ⇒ Object
Order of yielded crefs is undefined.
-
#empty? ⇒ Boolean
: () -> bool.
-
#get_or_set(cref, &block) ⇒ Object
: (Zeitwerk::Cref, { () -> Value }) -> Value.
-
#initialize ⇒ Map
constructor
: () -> void.
Constructor Details
#initialize ⇒ Map
: () -> void
75 76 77 78 79 |
# File 'lib/zeitwerk/cref/map.rb', line 75 def initialize @map = {} @map.compare_by_identity @mutex = Mutex.new end |
Instance Method Details
#[](cref) ⇒ Object
: (Zeitwerk::Cref) -> Value?
90 91 92 93 94 |
# File 'lib/zeitwerk/cref/map.rb', line 90 def [](cref) @mutex.synchronize do @map[cref.mod]&.[](cref.cname) end end |
#[]=(cref, value) ⇒ Object
: (Zeitwerk::Cref, Value) -> Value
82 83 84 85 86 87 |
# File 'lib/zeitwerk/cref/map.rb', line 82 def []=(cref, value) @mutex.synchronize do cnames = (@map[cref.mod] ||= {}) cnames[cref.cname] = value end end |
#clear ⇒ Object
: () -> void
147 148 149 150 151 |
# File 'lib/zeitwerk/cref/map.rb', line 147 def clear @mutex.synchronize do @map.clear end end |
#delete(cref) ⇒ Object
: (Zeitwerk::Cref) -> Value?
105 106 107 |
# File 'lib/zeitwerk/cref/map.rb', line 105 def delete(cref) delete_mod_cname(cref.mod, cref.cname) end |
#delete_by_value(value) ⇒ Object
: (Value) -> void
124 125 126 127 128 129 130 131 |
# File 'lib/zeitwerk/cref/map.rb', line 124 def delete_by_value(value) @mutex.synchronize do @map.delete_if do |mod, cnames| cnames.delete_if { _2 == value } cnames.empty? end end end |
#delete_mod_cname(mod, cname) ⇒ Object
Ad-hoc for loader_for, called from const_added. That is a hot path, I prefer to not create a cref in every call, since that is global.
: (Module, Symbol) -> Value?
113 114 115 116 117 118 119 120 121 |
# File 'lib/zeitwerk/cref/map.rb', line 113 def delete_mod_cname(mod, cname) @mutex.synchronize do if cnames = @map[mod] value = cnames.delete(cname) @map.delete(mod) if cnames.empty? value end end end |
#each_key ⇒ Object
Order of yielded crefs is undefined.
: () { (Zeitwerk::Cref) -> void } -> void
136 137 138 139 140 141 142 143 144 |
# File 'lib/zeitwerk/cref/map.rb', line 136 def each_key @mutex.synchronize do @map.each do |mod, cnames| cnames.each_key do |cname| yield Zeitwerk::Cref.new(mod, cname) end end end end |
#empty? ⇒ Boolean
: () -> bool
154 155 156 157 158 |
# File 'lib/zeitwerk/cref/map.rb', line 154 def empty? # for tests @mutex.synchronize do @map.empty? end end |
#get_or_set(cref, &block) ⇒ Object
: (Zeitwerk::Cref, { () -> Value }) -> Value
97 98 99 100 101 102 |
# File 'lib/zeitwerk/cref/map.rb', line 97 def get_or_set(cref, &block) @mutex.synchronize do cnames = (@map[cref.mod] ||= {}) cnames.fetch(cref.cname) { cnames[cref.cname] = block.call } end end |