Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | 68x 68x 126x 126x 65x 117x 99x 99x 17x 18x 7956x 20919x 263x 72x 72x 72x 531x 54x 54x 51x 51x 54x 54x 54x 49x 49x 54x 54x 48x 48x 5034x 5034x 5034x 5034x 4672x 4672x 2474x 149x 149x 149x 149x 145x 145x 112x | type Key = string
type Listener = () => void
const counts = new Map<Key, number>()
const listeners = new Map<Key, Set<Listener>>()
function notify(key: Key): void {
const set = listeners.get(key)
if (set) {
for (const listener of set) {
listener()
}
}
}
export function refCountKey(entityPath: string, params: unknown): Key {
return `${entityPath}:${JSON.stringify(params)}`
}
export function getRefCount(key: Key): number {
return counts.get(key) ?? 0
}
export function incrementRefCount(key: Key): number {
I const next = (counts.get(key) ?? 0) + 1
counts.set(key, next)
notify(key)
return next
}
export fEunction decrementRefCount(key: Key): number {
const current = counts.get(key)
if (current === undefined) {
return 0
}
const next = current - 1
if (next === 0) {
counts.delete(key)
} else {
counts.set(key, next)
}
notify(key)
return next
}
export function subscribeRefCount(key: Key, listener: Listener): () => void {
const set = listeners.get(key) ?? new Set()
set.add(listener)
listeners.set(key, set)
return () => {
set.delete(listener)
if (set.size === 0) {
listeners.delete(key)
}
}
}
|