@expressive/mvc 0.9.0 → 0.9.1

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.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(update);
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.push(refresh);
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 list = ORDER.get(control);
149
- while (pending.length) {
150
- const compute = pending
151
- .sort((a, b) => list.indexOf(b) - list.indexOf(a))
152
- .pop();
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
- KEYS.delete(control);
161
+ pending.clear();
158
162
  }
159
163
 
160
164
  const REGISTER$1 = new WeakMap();