unlink method
Removes the edge link from both lists it belongs to. If the
dependency side loses its last subscriber, unwatched fires. Returns
the next link in sub's dependency list (an iteration convenience).
Remove a aresta link das duas listas às quais pertence. Se o lado da
dependência perder seu último subscriber, unwatched dispara. Retorna
o próximo link da lista de dependências de sub (conveniência de
iteração).
Implementation
ReactiveLink? unlink(final ReactiveLink link, final ReactiveNode sub) {
final ReactiveNode dep = link.dep;
final ReactiveLink? prevDep = link.prevDep,
nextDep = link.nextDep,
nextSub = link.nextSub,
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;
}