Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 23 additions & 23 deletions packages/reactivity/src/system.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* 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'
Expand All @@ -14,6 +14,7 @@ export interface ReactiveNode {
}

export interface Link {
version: number
dep: ReactiveNode | Computed | Effect | EffectScope
sub: ReactiveNode | Computed | Effect | EffectScope
prevSub: Link | undefined
Expand Down Expand Up @@ -42,6 +43,7 @@ const notifyBuffer: (Effect | undefined)[] = []
export let batchDepth = 0
export let activeSub: ReactiveNode | undefined = undefined

let globalVersion = 0
let notifyIndex = 0
let notifyBufferLength = 0

Expand All @@ -68,21 +70,25 @@ export function link(dep: ReactiveNode, sub: ReactiveNode): void {
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,
Expand Down Expand Up @@ -149,7 +155,6 @@ export function propagate(link: Link): void {

top: do {
const sub = link.sub

let flags = sub.flags

if (flags & (ReactiveFlags.Mutable | ReactiveFlags.Watching)) {
Expand Down Expand Up @@ -215,6 +220,7 @@ export function propagate(link: Link): void {
}

export function startTracking(sub: ReactiveNode): ReactiveNode | undefined {
++globalVersion
sub.depsTail = undefined
sub.flags =
(sub.flags &
Expand Down Expand Up @@ -343,18 +349,12 @@ export function shallowPropagate(link: Link): void {
}

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