link method
Creates a bidirectional link between a dependency node (dep
) and a subscriber node (sub
).
This establishes the relationship where:
sub
depends ondep
(added tosub
's dependency list)dep
hassub
as a subscriber (added todep
'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
void link(ReactiveNode dep, ReactiveNode sub, int version) {
final prevDep = sub.depsTail;
if (prevDep != null && prevDep.dep == dep) {
return;
}
final nextDep = prevDep != null ? prevDep.nextDep : sub.deps;
if (nextDep != null && nextDep.dep == dep) {
nextDep.version = version;
sub.depsTail = nextDep;
return;
}
final prevSub = dep.subsTail;
if (prevSub != null && prevSub.version == version && prevSub.sub == sub) {
return;
}
final newLink = sub.depsTail = dep.subsTail = Link(
dep: dep,
sub: sub,
version: version,
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;
}
}