unlink method
Removes a bidirectional link between a dependency node and subscriber node.
This method:
- Removes the
link
from both the subscriber's dependency list and the dependency's subscriber list - Optionally accepts a
sub
node to specify which subscriber to unlink from - Returns the next dependency link in the subscriber's list (if any)
The unlinking process handles:
- Updating adjacent links to maintain proper list structure
- Cleaning up empty subscriber lists by calling unwatched
Implementation
Link? unlink(Link link, [ReactiveNode? sub]) {
sub ??= link.sub;
final dep = link.dep;
final prevDep = link.prevDep;
final nextDep = link.nextDep;
final nextSub = link.nextSub;
final prevSub = link.prevSub;
if (nextDep != null) {
nextDep.prevDep = prevDep;
} else {
sub.depsTail = prevDep;
}
if (prevDep != null) {
prevDep.nextDep = nextDep;
} else {
sub.deps = nextDep;
}
if (nextSub != null) {
nextSub.prevSub = prevSub;
} else {
dep.subsTail = prevSub;
}
if (prevSub != null) {
prevSub.nextSub = nextSub;
} else if ((dep.subs = nextSub) == null) {
unwatched(dep);
}
return nextDep;
}