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 | 59x 59x 108x 108x 60x 106x 99x 99x 17x 18x 6132x 16133x 179x 62x 62x 62x 279x 46x 51x 51x 51x 51x 46x 46x 49x 49x 46x 46x 48x 48x 3887x 3887x 3887x 3887x 3587x 3587x 1928x 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)
}
}
}
|