/* eslint-disable */
-// Ported from https://github.com/stackblitz/alien-signals/blob/v2.0.4/src/system.ts
+// Ported from https://github.com/stackblitz/alien-signals/blob/v3.0.0/src/system.ts
import type { ComputedRefImpl as Computed } from './computed.js'
import type { ReactiveEffect as Effect } from './effect.js'
import type { EffectScope } from './effectScope.js'
}
export interface Link {
+ version: number
dep: ReactiveNode | Computed | Effect | EffectScope
sub: ReactiveNode | Computed | Effect | EffectScope
prevSub: Link | undefined
export let batchDepth = 0
export let activeSub: ReactiveNode | undefined = undefined
+let globalVersion = 0
let notifyIndex = 0
let notifyBufferLength = 0
if (prevDep !== undefined && prevDep.dep === dep) {
return
}
- let nextDep: Link | undefined = undefined
- const recursedCheck = sub.flags & ReactiveFlags.RecursedCheck
- if (recursedCheck) {
- nextDep = prevDep !== undefined ? prevDep.nextDep : sub.deps
- if (nextDep !== undefined && nextDep.dep === dep) {
- sub.depsTail = nextDep
- return
- }
+ const nextDep = prevDep !== undefined ? prevDep.nextDep : sub.deps
+ if (nextDep !== undefined && nextDep.dep === dep) {
+ nextDep.version = globalVersion
+ sub.depsTail = nextDep
+ return
}
- // TODO: maybe can find a good way to check duplicate link
const prevSub = dep.subsTail
+ if (
+ prevSub !== undefined &&
+ prevSub.version === globalVersion &&
+ prevSub.sub === sub
+ ) {
+ return
+ }
const newLink =
(sub.depsTail =
dep.subsTail =
{
+ version: globalVersion,
dep,
sub,
prevDep,
top: do {
const sub = link.sub
-
let flags = sub.flags
if (flags & (ReactiveFlags.Mutable | ReactiveFlags.Watching)) {
}
export function startTracking(sub: ReactiveNode): ReactiveNode | undefined {
+ ++globalVersion
sub.depsTail = undefined
sub.flags =
(sub.flags &
}
function isValidLink(checkLink: Link, sub: ReactiveNode): boolean {
- const depsTail = sub.depsTail
- if (depsTail !== undefined) {
- let link = sub.deps!
- do {
- if (link === checkLink) {
- return true
- }
- if (link === depsTail) {
- break
- }
- link = link.nextDep!
- } while (link !== undefined)
+ let link = sub.depsTail
+ while (link !== undefined) {
+ if (link === checkLink) {
+ return true
+ }
+ link = link.prevDep
}
return false
}