13
// NewOnceMap creates a [OnceMap] from a given construct function.
14
// construct should be kept light as it is called while holding a lock on the entire map.
16
>
return &OnceMap[K, T]{
17
>
construct: construct,
18
>
inner: make(map[K]T, 0),
19
>
}
20
>
}
21
23
>
m.mu.RLock()
24
>
value, ok := m.inner[key]
25
>
m.mu.RUnlock()
26
>
if !ok {
27
>
m.mu.Lock()
28
>
defer m.mu.Unlock()
29
>
if value, ok = m.inner[key]; !ok {
30
>
value = m.construct(key)
31
>
m.inner[key] = value
32
>
}
33
}
34
36
}
37