vasille
Version:
The same framework which is designed to build bulletproof frontends (core library).
64 lines (63 loc) • 1.54 kB
JavaScript
import { Listener } from "./listener.js";
/**
* A `Map` based memory
* @class MapModel
* @extends Map
* @implements ListenableModel
*/
export class MapModel extends Map {
listener;
/**
* Constructs a map model
* @param map {[*, *][]} input data
* @param ctx lifetime context
*/
constructor(map, ctx) {
super();
this.listener = new Listener();
map?.forEach(([key, value]) => {
super.set(key, value);
});
ctx?.bind(this);
}
/**
* Calls `Map.clear` and notify about changes
*/
clear() {
this.forEach((value, key) => {
this.listener.emitRemoved(key, value);
});
super.clear();
}
/**
* Calls `Map.delete` and notify abut changes
* @param key {*} key
* @return {boolean} true if removed something, otherwise false
*/
delete(key) {
const tmp = super.get(key);
/* istanbul ignore else */
if (tmp) {
this.listener.emitRemoved(key, tmp);
}
return super.delete(key);
}
/**
* Calls `Map.set` and notify abut changes
* @param key {*} key
* @param value {*} value
* @return {MapModel} a pointer to this
*/
set(key, value) {
const tmp = super.get(key);
if (tmp) {
this.listener.emitRemoved(key, tmp);
}
super.set(key, value);
this.listener.emitAdded(key, value);
return this;
}
destroy() {
this.clear();
}
}