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
@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;
}
}