link function

void link(
  1. ReactiveNode dep,
  2. ReactiveNode sub,
  3. int version
)

Abstract reactive system for managing dependency tracking.

ReactiveSystem defines the core interface for managing reactive dependencies, updates, and notifications in the reactive graph. Links a dependency to a subscriber in the reactive graph.

Parameters:

  • dep: The dependency node
  • sub: The subscriber node
  • version: Version number for the link

Example:

final depNode = CustomSignalNode<int>(0);
final effectNode = CustomEffectNode();
link(depNode, effectNode, cycle);

Implementation

// /// Updates a reactive node and returns true if changed.
// ///
// /// Parameters:
// /// - [sub]: The reactive node to update
// ///
// /// Returns: true if the node's value changed, false otherwise
// bool update(ReactiveNode sub);

// /// Notifies a subscriber that it needs to update.
// ///
// /// Parameters:
// /// - [sub]: The subscriber node to notify
// void notify(ReactiveNode sub);

// /// Handles when a node is no longer being watched.
// ///
// /// Parameters:
// /// - [sub]: The node that is no longer being watched
// void unwatched(ReactiveNode sub);

/// Links a dependency to a subscriber in the reactive graph.
///
/// Parameters:
/// - [dep]: The dependency node
/// - [sub]: The subscriber node
/// - [version]: Version number for the link
///
/// Example:
/// ```dart
/// final depNode = CustomSignalNode<int>(0);
/// final effectNode = CustomEffectNode();
/// link(depNode, effectNode, cycle);
/// ```
@pragma("vm:prefer-inline")
@pragma("wasm:prefer-inline")
@pragma("dart2js:prefer-inline")
void link(ReactiveNode dep, ReactiveNode sub, int version) {
  final prevDep = sub.depsTail;
  if (prevDep != null && identical(prevDep.dep, dep)) {
    return;
  }
  final nextDep = prevDep != null ? prevDep.nextDep : sub.deps;
  if (nextDep != null && identical(nextDep.dep, dep)) {
    nextDep.version = version;
    sub.depsTail = nextDep;
    return;
  }
  final prevSub = dep.subsTail;
  if (prevSub != null &&
      prevSub.version == version &&
      identical(prevSub.sub, sub)) {
    return;
  }
  final newLink = sub.depsTail = dep.subsTail = Link(
    version: version,
    dep: dep,
    sub: sub,
    prevDep: prevDep,
    nextDep: nextDep,
    prevSub: prevSub,
    nextSub: null,
  );
  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;
  }

  JoltDebug.linked(dep);
}