|
|
@@ -4,7 +4,7 @@ import { type TrackOpTypes, TriggerOpTypes } from './constants'
|
|
|
import {
|
|
|
type DebuggerEventExtraInfo,
|
|
|
EffectFlags,
|
|
|
- type Link,
|
|
|
+ type Subscriber,
|
|
|
activeSub,
|
|
|
endBatch,
|
|
|
shouldTrack,
|
|
|
@@ -18,6 +18,49 @@ import {
|
|
|
*/
|
|
|
export let globalVersion = 0
|
|
|
|
|
|
+/**
|
|
|
+ * Represents a link between a source (Dep) and a subscriber (Effect or Computed).
|
|
|
+ * Deps and subs have a many-to-many relationship - each link between a
|
|
|
+ * dep and a sub is represented by a Link instance.
|
|
|
+ *
|
|
|
+ * A Link is also a node in two doubly-linked lists - one for the associated
|
|
|
+ * sub to track all its deps, and one for the associated dep to track all its
|
|
|
+ * subs.
|
|
|
+ *
|
|
|
+ * @internal
|
|
|
+ */
|
|
|
+export class Link {
|
|
|
+ /**
|
|
|
+ * - Before each effect run, all previous dep links' version are reset to -1
|
|
|
+ * - During the run, a link's version is synced with the source dep on access
|
|
|
+ * - After the run, links with version -1 (that were never used) are cleaned
|
|
|
+ * up
|
|
|
+ */
|
|
|
+ version: number
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Pointers for doubly-linked lists
|
|
|
+ */
|
|
|
+ nextDep?: Link
|
|
|
+ prevDep?: Link
|
|
|
+ nextSub?: Link
|
|
|
+ prevSub?: Link
|
|
|
+ prevActiveLink?: Link
|
|
|
+
|
|
|
+ constructor(
|
|
|
+ public sub: Subscriber,
|
|
|
+ public dep: Dep,
|
|
|
+ ) {
|
|
|
+ this.version = dep.version
|
|
|
+ this.nextDep =
|
|
|
+ this.prevDep =
|
|
|
+ this.nextSub =
|
|
|
+ this.prevSub =
|
|
|
+ this.prevActiveLink =
|
|
|
+ undefined
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* @internal
|
|
|
*/
|
|
|
@@ -52,16 +95,7 @@ export class Dep {
|
|
|
|
|
|
let link = this.activeLink
|
|
|
if (link === undefined || link.sub !== activeSub) {
|
|
|
- link = this.activeLink = {
|
|
|
- dep: this,
|
|
|
- sub: activeSub,
|
|
|
- version: this.version,
|
|
|
- nextDep: undefined,
|
|
|
- prevDep: undefined,
|
|
|
- nextSub: undefined,
|
|
|
- prevSub: undefined,
|
|
|
- prevActiveLink: undefined,
|
|
|
- }
|
|
|
+ link = this.activeLink = new Link(activeSub, this)
|
|
|
|
|
|
// add the link to the activeEffect as a dep (as tail)
|
|
|
if (!activeSub.deps) {
|