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 | 47x 47x 72x 72x 51x 89x 99x 99x 17x 18x 4322x 11426x 179x 42x 42x 42x 279x 30x 51x 51x 51x 51x 30x 30x 49x 49x 30x 30x 48x 48x 2777x 2777x 2777x 2777x 2548x 2548x 1502x 65x 65x 65x 65x 61x 61x 60x | 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)
}
}
}
|