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 5768x 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)
    }
  }
}