407 lines
15 KiB
JavaScript
407 lines
15 KiB
JavaScript
|
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
exports.Subscriber = exports.Dependency = exports.Link = exports.System = void 0;
|
||
|
exports.startBatch = startBatch;
|
||
|
exports.endBatch = endBatch;
|
||
|
var System;
|
||
|
(function (System) {
|
||
|
System.activeSub = undefined;
|
||
|
System.activeEffectScope = undefined;
|
||
|
System.activeTrackId = 0;
|
||
|
System.activeEffectScopeTrackId = 0;
|
||
|
System.batchDepth = 0;
|
||
|
System.lastTrackId = 0;
|
||
|
System.queuedEffects = undefined;
|
||
|
System.queuedEffectsTail = undefined;
|
||
|
})(System || (exports.System = System = {}));
|
||
|
function startBatch() {
|
||
|
System.batchDepth++;
|
||
|
}
|
||
|
function endBatch() {
|
||
|
System.batchDepth--;
|
||
|
if (System.batchDepth === 0) {
|
||
|
while (System.queuedEffects !== undefined) {
|
||
|
const effect = System.queuedEffects;
|
||
|
const queuedNext = System.queuedEffects.nextNotify;
|
||
|
if (queuedNext !== undefined) {
|
||
|
System.queuedEffects.nextNotify = undefined;
|
||
|
System.queuedEffects = queuedNext;
|
||
|
}
|
||
|
else {
|
||
|
System.queuedEffects = undefined;
|
||
|
System.queuedEffectsTail = undefined;
|
||
|
}
|
||
|
effect.notify();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
var Link;
|
||
|
(function (Link) {
|
||
|
Link.pool = undefined;
|
||
|
})(Link || (exports.Link = Link = {}));
|
||
|
var Dependency;
|
||
|
(function (Dependency) {
|
||
|
const system = System;
|
||
|
function linkSubscriber(dep, sub) {
|
||
|
const depsTail = sub.depsTail;
|
||
|
const old = depsTail !== undefined
|
||
|
? depsTail.nextDep
|
||
|
: sub.deps;
|
||
|
if (old === undefined || old.dep !== dep) {
|
||
|
let newLink;
|
||
|
if (Link.pool !== undefined) {
|
||
|
newLink = Link.pool;
|
||
|
Link.pool = newLink.nextDep;
|
||
|
newLink.nextDep = old;
|
||
|
newLink.dep = dep;
|
||
|
newLink.sub = sub;
|
||
|
newLink.trackId = sub.trackId;
|
||
|
}
|
||
|
else {
|
||
|
newLink = {
|
||
|
dep,
|
||
|
sub,
|
||
|
trackId: sub.trackId,
|
||
|
nextDep: old,
|
||
|
prevSub: undefined,
|
||
|
nextSub: undefined,
|
||
|
};
|
||
|
}
|
||
|
if (depsTail === undefined) {
|
||
|
sub.deps = newLink;
|
||
|
}
|
||
|
else {
|
||
|
depsTail.nextDep = newLink;
|
||
|
}
|
||
|
if (dep.subs === undefined) {
|
||
|
dep.subs = newLink;
|
||
|
}
|
||
|
else {
|
||
|
const oldTail = dep.subsTail;
|
||
|
newLink.prevSub = oldTail;
|
||
|
oldTail.nextSub = newLink;
|
||
|
}
|
||
|
sub.depsTail = newLink;
|
||
|
dep.subsTail = newLink;
|
||
|
}
|
||
|
else {
|
||
|
old.trackId = sub.trackId;
|
||
|
sub.depsTail = old;
|
||
|
}
|
||
|
}
|
||
|
Dependency.linkSubscriber = linkSubscriber;
|
||
|
function propagate(subs) {
|
||
|
let link = subs;
|
||
|
let dep = subs.dep;
|
||
|
let dirtyLevel = 3 /* DirtyLevels.Dirty */;
|
||
|
let remainingQuantity = 0;
|
||
|
do {
|
||
|
if (link !== undefined) {
|
||
|
const sub = link.sub;
|
||
|
if (sub.trackId > 0) {
|
||
|
if (sub.trackId === link.trackId) {
|
||
|
const subDirtyLevel = sub.dirtyLevel;
|
||
|
if (subDirtyLevel < dirtyLevel) {
|
||
|
sub.dirtyLevel = dirtyLevel;
|
||
|
if (subDirtyLevel === 0 /* DirtyLevels.None */) {
|
||
|
sub.canPropagate = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if (sub.trackId === -link.trackId) {
|
||
|
const subDirtyLevel = sub.dirtyLevel;
|
||
|
const notDirty = subDirtyLevel === 0 /* DirtyLevels.None */;
|
||
|
if (subDirtyLevel < dirtyLevel) {
|
||
|
sub.dirtyLevel = dirtyLevel;
|
||
|
}
|
||
|
if (notDirty || sub.canPropagate) {
|
||
|
if (!notDirty) {
|
||
|
sub.canPropagate = false;
|
||
|
}
|
||
|
const subIsEffect = 'notify' in sub;
|
||
|
if ('subs' in sub && sub.subs !== undefined) {
|
||
|
sub.depsTail.nextDep = link;
|
||
|
dep = sub;
|
||
|
link = sub.subs;
|
||
|
if (subIsEffect) {
|
||
|
dirtyLevel = 1 /* DirtyLevels.SideEffectsOnly */;
|
||
|
}
|
||
|
else {
|
||
|
dirtyLevel = 2 /* DirtyLevels.MaybeDirty */;
|
||
|
}
|
||
|
remainingQuantity++;
|
||
|
continue;
|
||
|
}
|
||
|
else if (subIsEffect) {
|
||
|
const queuedEffectsTail = system.queuedEffectsTail;
|
||
|
if (queuedEffectsTail !== undefined) {
|
||
|
queuedEffectsTail.nextNotify = sub;
|
||
|
}
|
||
|
else {
|
||
|
system.queuedEffects = sub;
|
||
|
}
|
||
|
system.queuedEffectsTail = sub;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
link = link.nextSub;
|
||
|
continue;
|
||
|
}
|
||
|
if (remainingQuantity !== 0) {
|
||
|
const depsTail = dep.depsTail;
|
||
|
const prevLink = depsTail.nextDep;
|
||
|
const prevSub = prevLink.sub;
|
||
|
depsTail.nextDep = undefined;
|
||
|
dep = prevLink.dep;
|
||
|
link = prevLink.nextSub;
|
||
|
remainingQuantity--;
|
||
|
if (remainingQuantity === 0) {
|
||
|
dirtyLevel = 3 /* DirtyLevels.Dirty */;
|
||
|
}
|
||
|
else if ('notify' in dep) {
|
||
|
dirtyLevel = 1 /* DirtyLevels.SideEffectsOnly */;
|
||
|
}
|
||
|
else {
|
||
|
dirtyLevel = 2 /* DirtyLevels.MaybeDirty */;
|
||
|
}
|
||
|
if ('notify' in prevSub) {
|
||
|
const queuedEffectsTail = system.queuedEffectsTail;
|
||
|
if (queuedEffectsTail !== undefined) {
|
||
|
queuedEffectsTail.nextNotify = prevSub;
|
||
|
}
|
||
|
else {
|
||
|
system.queuedEffects = prevSub;
|
||
|
}
|
||
|
system.queuedEffectsTail = prevSub;
|
||
|
}
|
||
|
continue;
|
||
|
}
|
||
|
break;
|
||
|
} while (true);
|
||
|
}
|
||
|
Dependency.propagate = propagate;
|
||
|
})(Dependency || (exports.Dependency = Dependency = {}));
|
||
|
var Subscriber;
|
||
|
(function (Subscriber) {
|
||
|
const system = System;
|
||
|
function runInnerEffects(link) {
|
||
|
while (link !== undefined) {
|
||
|
const dep = link.dep;
|
||
|
if ('notify' in dep) {
|
||
|
dep.notify();
|
||
|
}
|
||
|
link = link.nextDep;
|
||
|
}
|
||
|
}
|
||
|
Subscriber.runInnerEffects = runInnerEffects;
|
||
|
function resolveMaybeDirty(sub, depth = 0) {
|
||
|
let link = sub.deps;
|
||
|
while (link !== undefined) {
|
||
|
const dep = link.dep;
|
||
|
if ('update' in dep) {
|
||
|
const dirtyLevel = dep.dirtyLevel;
|
||
|
if (dirtyLevel === 2 /* DirtyLevels.MaybeDirty */) {
|
||
|
if (depth >= 4) {
|
||
|
resolveMaybeDirtyNonRecursive(dep);
|
||
|
}
|
||
|
else {
|
||
|
resolveMaybeDirty(dep, depth + 1);
|
||
|
}
|
||
|
if (dep.dirtyLevel === 3 /* DirtyLevels.Dirty */) {
|
||
|
dep.update();
|
||
|
if (sub.dirtyLevel === 3 /* DirtyLevels.Dirty */) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if (dirtyLevel === 3 /* DirtyLevels.Dirty */) {
|
||
|
dep.update();
|
||
|
if (sub.dirtyLevel === 3 /* DirtyLevels.Dirty */) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
link = link.nextDep;
|
||
|
}
|
||
|
if (sub.dirtyLevel === 2 /* DirtyLevels.MaybeDirty */) {
|
||
|
sub.dirtyLevel = 0 /* DirtyLevels.None */;
|
||
|
}
|
||
|
}
|
||
|
Subscriber.resolveMaybeDirty = resolveMaybeDirty;
|
||
|
function resolveMaybeDirtyNonRecursive(sub) {
|
||
|
let link = sub.deps;
|
||
|
let remaining = 0;
|
||
|
do {
|
||
|
if (link !== undefined) {
|
||
|
const dep = link.dep;
|
||
|
if ('update' in dep) {
|
||
|
const depDirtyLevel = dep.dirtyLevel;
|
||
|
if (depDirtyLevel === 2 /* DirtyLevels.MaybeDirty */) {
|
||
|
dep.subs.prevSub = link;
|
||
|
sub = dep;
|
||
|
link = dep.deps;
|
||
|
remaining++;
|
||
|
continue;
|
||
|
}
|
||
|
else if (depDirtyLevel === 3 /* DirtyLevels.Dirty */) {
|
||
|
dep.update();
|
||
|
if (sub.dirtyLevel === 3 /* DirtyLevels.Dirty */) {
|
||
|
if (remaining !== 0) {
|
||
|
const subSubs = sub.subs;
|
||
|
const prevLink = subSubs.prevSub;
|
||
|
sub.update();
|
||
|
subSubs.prevSub = undefined;
|
||
|
sub = prevLink.sub;
|
||
|
link = prevLink.nextDep;
|
||
|
remaining--;
|
||
|
continue;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
link = link.nextDep;
|
||
|
continue;
|
||
|
}
|
||
|
const dirtyLevel = sub.dirtyLevel;
|
||
|
if (dirtyLevel === 2 /* DirtyLevels.MaybeDirty */) {
|
||
|
sub.dirtyLevel = 0 /* DirtyLevels.None */;
|
||
|
if (remaining !== 0) {
|
||
|
const subSubs = sub.subs;
|
||
|
const prevLink = subSubs.prevSub;
|
||
|
subSubs.prevSub = undefined;
|
||
|
sub = prevLink.sub;
|
||
|
link = prevLink.nextDep;
|
||
|
remaining--;
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
else if (remaining !== 0) {
|
||
|
if (dirtyLevel === 3 /* DirtyLevels.Dirty */) {
|
||
|
sub.update();
|
||
|
}
|
||
|
const subSubs = sub.subs;
|
||
|
const prevLink = subSubs.prevSub;
|
||
|
subSubs.prevSub = undefined;
|
||
|
sub = prevLink.sub;
|
||
|
link = prevLink.nextDep;
|
||
|
remaining--;
|
||
|
continue;
|
||
|
}
|
||
|
break;
|
||
|
} while (true);
|
||
|
}
|
||
|
Subscriber.resolveMaybeDirtyNonRecursive = resolveMaybeDirtyNonRecursive;
|
||
|
function startTrackDependencies(sub) {
|
||
|
const newVersion = system.lastTrackId + 1;
|
||
|
const prevSub = system.activeSub;
|
||
|
system.activeSub = sub;
|
||
|
system.activeTrackId = newVersion;
|
||
|
system.lastTrackId = newVersion;
|
||
|
sub.depsTail = undefined;
|
||
|
sub.trackId = newVersion;
|
||
|
sub.dirtyLevel = 0 /* DirtyLevels.None */;
|
||
|
return prevSub;
|
||
|
}
|
||
|
Subscriber.startTrackDependencies = startTrackDependencies;
|
||
|
function endTrackDependencies(sub, prevSub) {
|
||
|
if (prevSub !== undefined) {
|
||
|
system.activeSub = prevSub;
|
||
|
system.activeTrackId = prevSub.trackId;
|
||
|
}
|
||
|
else {
|
||
|
system.activeSub = undefined;
|
||
|
system.activeTrackId = 0;
|
||
|
}
|
||
|
const depsTail = sub.depsTail;
|
||
|
if (depsTail !== undefined) {
|
||
|
if (depsTail.nextDep !== undefined) {
|
||
|
clearTrack(depsTail.nextDep);
|
||
|
depsTail.nextDep = undefined;
|
||
|
}
|
||
|
}
|
||
|
else if (sub.deps !== undefined) {
|
||
|
clearTrack(sub.deps);
|
||
|
sub.deps = undefined;
|
||
|
}
|
||
|
sub.trackId = -sub.trackId;
|
||
|
}
|
||
|
Subscriber.endTrackDependencies = endTrackDependencies;
|
||
|
function clearTrack(link) {
|
||
|
do {
|
||
|
const nextDep = link.nextDep;
|
||
|
const dep = link.dep;
|
||
|
const nextSub = link.nextSub;
|
||
|
const prevSub = link.prevSub;
|
||
|
if (nextSub !== undefined) {
|
||
|
nextSub.prevSub = prevSub;
|
||
|
}
|
||
|
if (prevSub !== undefined) {
|
||
|
prevSub.nextSub = nextSub;
|
||
|
}
|
||
|
if (nextSub === undefined) {
|
||
|
dep.subsTail = prevSub;
|
||
|
}
|
||
|
if (prevSub === undefined) {
|
||
|
dep.subs = nextSub;
|
||
|
}
|
||
|
// @ts-ignore
|
||
|
link.dep = undefined;
|
||
|
// @ts-ignore
|
||
|
link.sub = undefined;
|
||
|
link.prevSub = undefined;
|
||
|
link.nextSub = undefined;
|
||
|
link.nextDep = Link.pool;
|
||
|
Link.pool = link;
|
||
|
if (dep.subs === undefined && 'deps' in dep) {
|
||
|
dep.dirtyLevel = 4 /* DirtyLevels.Released */;
|
||
|
if (dep.deps !== undefined) {
|
||
|
link = dep.deps;
|
||
|
dep.depsTail.nextDep = nextDep;
|
||
|
dep.deps = undefined;
|
||
|
dep.depsTail = undefined;
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
link = nextDep;
|
||
|
} while (link !== undefined);
|
||
|
}
|
||
|
Subscriber.clearTrack = clearTrack;
|
||
|
function startTrackEffects(sub) {
|
||
|
const newVersion = system.lastTrackId + 1;
|
||
|
const prevSub = system.activeEffectScope;
|
||
|
system.activeEffectScope = sub;
|
||
|
system.activeEffectScopeTrackId = newVersion;
|
||
|
system.lastTrackId = newVersion;
|
||
|
sub.depsTail = undefined;
|
||
|
sub.trackId = newVersion;
|
||
|
sub.dirtyLevel = 0 /* DirtyLevels.None */;
|
||
|
return prevSub;
|
||
|
}
|
||
|
Subscriber.startTrackEffects = startTrackEffects;
|
||
|
function endTrackEffects(sub, prevSub) {
|
||
|
if (prevSub !== undefined) {
|
||
|
system.activeEffectScope = prevSub;
|
||
|
system.activeEffectScopeTrackId = prevSub.trackId;
|
||
|
}
|
||
|
else {
|
||
|
system.activeEffectScope = undefined;
|
||
|
system.activeEffectScopeTrackId = 0;
|
||
|
}
|
||
|
const depsTail = sub.depsTail;
|
||
|
if (depsTail !== undefined) {
|
||
|
if (depsTail.nextDep !== undefined) {
|
||
|
clearTrack(depsTail.nextDep);
|
||
|
depsTail.nextDep = undefined;
|
||
|
}
|
||
|
}
|
||
|
else if (sub.deps !== undefined) {
|
||
|
clearTrack(sub.deps);
|
||
|
sub.deps = undefined;
|
||
|
}
|
||
|
sub.trackId = -sub.trackId;
|
||
|
}
|
||
|
Subscriber.endTrackEffects = endTrackEffects;
|
||
|
})(Subscriber || (exports.Subscriber = Subscriber = {}));
|