Class: Zeitwerk::Cref::Map

Inherits:
Object
  • Object
show all
Defined in:
lib/zeitwerk/cref/map.rb

Overview

: [Value]

Instance Method Summary collapse

Constructor Details

#initializeMap

: () -> 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

#clearObject

: () -> 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_keyObject

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

Returns:

  • (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

: (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