@expressive/mvc 0.9.0 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.d.ts +2 -2
- package/lib/index.esm.js +24 -20
- package/lib/index.esm.js.map +1 -1
- package/lib/index.js +24 -20
- package/lib/index.js.map +1 -1
- package/package.json +1 -1
package/lib/index.js
CHANGED
|
@@ -81,8 +81,11 @@ function computeMode(self, source, setter, key, required) {
|
|
|
81
81
|
const { subject, state } = self;
|
|
82
82
|
let sub;
|
|
83
83
|
let order = ORDER.get(self);
|
|
84
|
+
let pending = KEYS.get(self);
|
|
84
85
|
if (!order)
|
|
85
|
-
ORDER.set(self, order =
|
|
86
|
+
ORDER.set(self, order = new Map());
|
|
87
|
+
if (!pending)
|
|
88
|
+
KEYS.set(self, pending = new Set());
|
|
86
89
|
const compute = (initial) => {
|
|
87
90
|
try {
|
|
88
91
|
return setter.call(sub.proxy, sub.proxy);
|
|
@@ -108,18 +111,13 @@ function computeMode(self, source, setter, key, required) {
|
|
|
108
111
|
}
|
|
109
112
|
}
|
|
110
113
|
};
|
|
111
|
-
const update = (_key, source) => {
|
|
112
|
-
if (source !== self) {
|
|
113
|
-
refresh();
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
let pending = KEYS.get(self);
|
|
117
|
-
if (!pending)
|
|
118
|
-
KEYS.set(self, pending = []);
|
|
119
|
-
pending.push(refresh);
|
|
120
|
-
};
|
|
121
114
|
const create = () => {
|
|
122
|
-
sub = source.subscribe(
|
|
115
|
+
sub = source.subscribe((_, source) => {
|
|
116
|
+
if (source !== self)
|
|
117
|
+
refresh();
|
|
118
|
+
else
|
|
119
|
+
pending.add(refresh);
|
|
120
|
+
});
|
|
123
121
|
try {
|
|
124
122
|
const value = compute(true);
|
|
125
123
|
state.set(key, value);
|
|
@@ -130,11 +128,15 @@ function computeMode(self, source, setter, key, required) {
|
|
|
130
128
|
}
|
|
131
129
|
finally {
|
|
132
130
|
sub.commit();
|
|
133
|
-
order.
|
|
131
|
+
order.set(refresh, order.size);
|
|
134
132
|
}
|
|
135
133
|
};
|
|
136
134
|
INFO.set(refresh, key);
|
|
137
135
|
return () => {
|
|
136
|
+
if (pending.has(refresh)) {
|
|
137
|
+
pending.delete(refresh);
|
|
138
|
+
refresh();
|
|
139
|
+
}
|
|
138
140
|
const value = sub ? state.get(key) : create();
|
|
139
141
|
if (value === undefined && required)
|
|
140
142
|
throw suspend(self, key);
|
|
@@ -143,18 +145,20 @@ function computeMode(self, source, setter, key, required) {
|
|
|
143
145
|
}
|
|
144
146
|
function flush(control) {
|
|
145
147
|
const pending = KEYS.get(control);
|
|
146
|
-
if (!pending)
|
|
148
|
+
if (!pending || !pending.size)
|
|
147
149
|
return;
|
|
148
|
-
const
|
|
149
|
-
while (pending.
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
.
|
|
150
|
+
const priority = ORDER.get(control);
|
|
151
|
+
while (pending.size) {
|
|
152
|
+
let compute;
|
|
153
|
+
for (const item of pending)
|
|
154
|
+
if (!compute || priority.get(item) < priority.get(compute))
|
|
155
|
+
compute = item;
|
|
156
|
+
pending.delete(compute);
|
|
153
157
|
const key = INFO.get(compute);
|
|
154
158
|
if (!control.frame.has(key))
|
|
155
159
|
compute();
|
|
156
160
|
}
|
|
157
|
-
|
|
161
|
+
pending.clear();
|
|
158
162
|
}
|
|
159
163
|
|
|
160
164
|
const REGISTER$1 = new WeakMap();
|