link method

void link(
  1. ReactiveNode dep,
  2. ReactiveNode sub,
  3. int version
)

Records that sub depends on dep in tracking cycle version.

Designed to be called for every read while sub re-runs, in read order, with sub.depsTail reset before the run: existing links are then reused in place (only version is refreshed and the tail cursor advances), so a re-run whose reads didn't change allocates nothing. New edges are inserted at the cursor; edges not re-confirmed remain after the tail and are removed later by the caller (see the preset's purgeDeps pattern in Fase 2).

Registra que sub depende de dep no ciclo de rastreamento version.

Projetado para ser chamado a cada leitura enquanto sub re-executa, em ordem de leitura, com sub.depsTail zerado antes da execução: links existentes são então reusados no lugar (apenas version é atualizado e o cursor da cauda avança), então uma re-execução cujas leituras não mudaram não aloca nada. Arestas novas são inseridas no cursor; arestas não reconfirmadas ficam depois da cauda e são removidas depois pelo chamador (ver o padrão purgeDeps do preset na Fase 2).

Implementation

void link(final ReactiveNode dep, final ReactiveNode sub, final int version) {
  final ReactiveLink? prevDep = sub.depsTail;
  if (prevDep != null && identical(prevDep.dep, dep)) {
    return;
  }
  final ReactiveLink? nextDep = prevDep != null ? prevDep.nextDep : sub.deps;
  if (nextDep != null && identical(nextDep.dep, dep)) {
    nextDep.version = version;
    sub.depsTail = nextDep;
    return;
  }
  final ReactiveLink? prevSub = dep.subsTail;
  if (prevSub != null &&
      prevSub.version == version &&
      identical(prevSub.sub, sub)) {
    return;
  }
  final ReactiveLink newLink = sub.depsTail = dep.subsTail = ReactiveLink(
    version: version,
    dep: dep,
    sub: sub,
    prevDep: prevDep,
    nextDep: nextDep,
    prevSub: prevSub,
    nextSub: null,
  );
  if (nextDep != null) {
    nextDep.prevDep = newLink;
  }
  if (prevDep != null) {
    prevDep.nextDep = newLink;
  } else {
    sub.deps = newLink;
  }
  if (prevSub != null) {
    prevSub.nextSub = newLink;
  } else {
    dep.subs = newLink;
  }
}