Carbon/src/js/store/SubscribeMapList.js

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