link method
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;
}
}