unlink method

Link? unlink(
  1. Link link, [
  2. ReactiveNode? sub
])

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