87 lines
1.8 KiB
JavaScript
87 lines
1.8 KiB
JavaScript
import { Subscribable } from "./Subscribable.js";
|
|
import { SubscribeValue } from "./SubscribeValue.js";
|
|
|
|
class SubscribeMapList extends Subscribable {
|
|
constructor(inner) {
|
|
super();
|
|
this.inner = inner;
|
|
Object.assign(this.events, {
|
|
addItem: [],
|
|
deleteItem: [],
|
|
editItem: [],
|
|
changeItem: [],
|
|
askAdd: [],
|
|
});
|
|
Object.assign(this.eventDeps, {
|
|
addItem: ["changeItem"],
|
|
deleteItem: ["changeItem"],
|
|
editItem: ["changeItem"],
|
|
changeItem: [],
|
|
askAdd: [],
|
|
});
|
|
this.map = new Map();
|
|
this.list = [];
|
|
}
|
|
|
|
has(key) {
|
|
return this.map.has(key) && this.map.get(key).exists();
|
|
}
|
|
|
|
get(key) {
|
|
if (this.map.has(key)) {
|
|
return this.map.get(key);
|
|
} else {
|
|
const item = new this.inner();
|
|
this.map.set(key, item);
|
|
return item;
|
|
}
|
|
}
|
|
|
|
forEach(f) {
|
|
this.list.forEach((key) => f(key, this.get(key)));
|
|
}
|
|
|
|
askAdd(key, data) {
|
|
this.broadcast("askAdd", { key, data });
|
|
}
|
|
|
|
addStart(key, value) {
|
|
this._add(key, value, true);
|
|
}
|
|
|
|
addEnd(key, value) {
|
|
this._add(key, value, false);
|
|
}
|
|
|
|
sort() {
|
|
this.list.sort((a, b) => {
|
|
const orderA = this.map.get(a).value().order;
|
|
const orderB = this.map.get(b).value().order;
|
|
return orderA - orderB;
|
|
});
|
|
this.broadcast("changeItem");
|
|
}
|
|
|
|
_add(key, value, start) {
|
|
let s;
|
|
if (this.map.has(key)) {
|
|
const exists = this.map.get(key).exists();
|
|
s = this.map.get(key).set(value);
|
|
if (exists) {
|
|
this.broadcast("editItem", key);
|
|
} else {
|
|
this.broadcast("addItem", key);
|
|
}
|
|
} else {
|
|
s = new this.inner().set(value);
|
|
this.map.set(key, s);
|
|
if (start) this.list.unshift(key);
|
|
else this.list.push(key);
|
|
this.broadcast("addItem", key);
|
|
}
|
|
return s;
|
|
}
|
|
}
|
|
|
|
export { SubscribeMapList };
|