All files / layers / L1 refCountStore.ts

96.42% Statements 54/56
92.85% Branches 26/28
100% Functions 14/14
100% Lines 44/44

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 5738x 38x   58x 58x 46x 80x 99x 99x 17x 18x 3024x     7971x   173x 34x 34x 34x 261x     24x 51x 51x 51x 51x 24x 24x   49x 49x 24x 24x 48x 48x 1911x 1911x 1911x 1911x 1731x 1731x 1054x     59x 59x 59x 59x 55x 55x 54x        
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)
    }
  }
}