link method

void link(
  1. ReactiveNode dep,
  2. ReactiveNode sub
)

Creates a bidirectional link between a dependency node (dep) and a subscriber node (sub).

This establishes the relationship where:

  • sub depends on dep (added to sub's dependency list)
  • dep has sub as a subscriber (added to dep's subscriber list)

The method handles various edge cases including:

  • Avoiding duplicate links
  • Maintaining proper list structure during recursive checks
  • Preserving existing valid links

Implementation

@pragma('vm:prefer-inline')
@pragma('wasm:prefer-inline')
@pragma('dart2js:prefer-inline')
void link(ReactiveNode dep, ReactiveNode sub) {
  final prevDep = sub.depsTail;
  if (prevDep != null && prevDep.dep == dep) {
    return;
  }
  Link? nextDep;
  final recursedCheck = sub.flags & ReactiveFlags.recursedCheck;
  if (recursedCheck != 0) {
    nextDep = prevDep != null ? prevDep.nextDep : sub.deps;
    if (nextDep != null && nextDep.dep == dep) {
      sub.depsTail = nextDep;
      return;
    }
  }
  final prevSub = dep.subsTail;
  if (prevSub != null &&
      prevSub.sub == sub &&
      (recursedCheck == 0 || isValidLink(prevSub, sub))) {
    return;
  }
  final newLink = sub.depsTail = dep.subsTail = Link(
    dep: dep,
    sub: sub,
    prevDep: prevDep,
    nextDep: nextDep,
    prevSub: prevSub,
  );
  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;
  }
}