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 | 62x 62x 150x 150x 80x 140x 99x 99x 17x 18x 7382x 19371x 243x 86x 86x 86x 471x 64x 64x 51x 51x 64x 64x 64x 49x 49x 64x 64x 48x 48x 4639x 4639x 4639x 4639x 4311x 4311x 2137x 129x 129x 129x 129x 125x 125x 92x | 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)
}
}
}
|