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 5769x 69x   125x 125x 69x 123x 99x 99x 17x 18x 7858x     20663x   263x 72x 72x 72x 531x     53x 53x 51x 51x 53x 53x 53x   49x 49x 53x 53x 48x 48x 4968x 4968x 4968x 4968x 4613x 4613x 2430x     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)
    }
  }
}