unlink method
Removes a bidirectional link between a dependency node and subscriber node.
This method:
- Removes the linkfrom both the subscriber's dependency list and the dependency's subscriber list
- Optionally accepts a subnode 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;
}