Carbon/src/js/store/subscribe_map.js

75 lines
1.3 KiB
JavaScript
Raw Normal View History

2020-10-23 14:15:14 +00:00
const {Subscribable} = require("./subscribable.js")
2020-10-15 03:43:37 +00:00
class SubscribeMap extends Subscribable {
constructor(inner) {
super()
this.inner = inner
Object.assign(this.events, {
addItem: [],
editItem: [],
deleteItem: [],
changeItem: [],
askSet: []
})
Object.assign(this.eventDeps, {
addItem: ["changeItem"],
editItem: ["changeItem"],
deleteItem: ["changeItem"],
changeItem: [],
askSet: []
})
this.map = new Map()
}
2020-10-15 03:43:37 +00:00
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
}
}
2020-10-15 03:43:37 +00:00
forEach(f) {
for (const entry of this.map.entries()) {
f(entry[0], entry[1])
}
}
2020-10-15 03:43:37 +00:00
askSet(key, value) {
this.broadcast("askSet", {key, value})
}
set(key, value) {
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)
this.broadcast("addItem", key)
}
return s
}
delete(key) {
if (this.backing.has(key)) {
this.backing.delete(key)
this.broadcast("deleteItem", key)
}
}
2020-10-15 03:43:37 +00:00
}
2020-10-23 14:15:14 +00:00
module.exports = {SubscribeMap}