Class: Zeitwerk::Cref::Map
- Inherits:
-
Object
- Object
- Zeitwerk::Cref::Map
- Defined in:
- lib/zeitwerk/cref/map.rb
Overview
Instance Method Summary collapse
- #[](cref) ⇒ Object
- #[]=(cref, value) ⇒ Object
- #clear ⇒ Object
- #delete(cref) ⇒ Object
- #delete_by_value(value) ⇒ Object
-
#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
- #get_or_set(cref, &block) ⇒ Object
-
#initialize ⇒ Map
constructor
A new instance of Map.
Constructor Details
#initialize ⇒ Map
Returns a new instance of Map.
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
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
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
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
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
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.
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.
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
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
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 |