link method

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

Creates or updates a dependency link between two nodes.

Establishes that sub depends on dep, creating a bidirectional link in the dependency graph. The version parameter tracks the freshness of this dependency relationship.

This method efficiently handles:

  • Deduplication: Avoids creating duplicate links
  • Version updates: Updates existing links with new versions
  • Reordering: Moves accessed dependencies to the tail for optimization

The implementation maintains two doubly-linked lists:

  • deps/depsTail on the subscriber for its dependencies
  • subs/subsTail on the dependency for its subscribers

Implementation

void link(final ReactiveNode dep, final ReactiveNode sub, final int version) {
  final prevDep = sub.depsTail;
  if (prevDep != null && identical(prevDep.dep, dep)) {
    return;
  }
  final nextDep = prevDep != null ? prevDep.nextDep : sub.deps;
  if (nextDep != null && identical(nextDep.dep, dep)) {
    nextDep.version = version;
    sub.depsTail = nextDep;
    return;
  }
  final prevSub = dep.subsTail;
  if (prevSub != null &&
      prevSub.version == version &&
      identical(prevSub.sub, sub)) {
    return;
  }
  final newLink = sub.depsTail = dep.subsTail = Link(
    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;
  }
}