alinea
Version:
[](https://npmjs.org/package/alinea) [](https://packagephobia.com/result?p=alinea)
90 lines (88 loc) • 2 kB
JavaScript
import "../../chunks/chunk-U5RRZUYZ.js";
// src/backend/util/DeepMap.ts
var DeepMap = class {
#root = /* @__PURE__ */ new Map();
#leaves = /* @__PURE__ */ new Map();
constructor(entries) {
if (entries)
for (const entry of entries)
this.set(...entry);
}
get size() {
return this.#leaves.size;
}
set(keys, value) {
let branch = this.#root;
for (const key of keys) {
if (branch.has(key))
branch = branch.get(key);
else
branch.set(key, branch = /* @__PURE__ */ new Map());
}
this.#leaves.set(branch, value);
return this;
}
#clearBranch(branch) {
if (this.#leaves.has(branch))
this.#leaves.delete(branch);
for (let map of branch.values())
this.#clearBranch(map);
return branch.clear();
}
clear() {
this.#clearBranch(this.#root);
}
delete(keys) {
let branch = this.#root;
for (const key of keys) {
if (branch.has(key)) {
branch = branch.get(key);
} else {
return false;
}
}
return this.#leaves.delete(branch);
}
has(keys) {
let branch = this.#root;
for (const key of keys) {
if (branch.has(key)) {
branch = branch.get(key);
} else {
return false;
}
}
return this.#leaves.has(branch);
}
get(keys) {
let branch = this.#root;
for (const key of keys)
branch = branch.get(key);
return this.#leaves.get(branch);
}
*values() {
for (const value of this.#leaves.values())
yield value;
}
*#keysOfBranch(branch, keys = []) {
for (const [key, map] of branch) {
const current = keys.concat(key);
if (this.#leaves.has(map))
yield current;
yield* this.#keysOfBranch(map, current);
}
}
*keys() {
yield* this.#keysOfBranch(this.#root);
}
*entries() {
for (const keys of this.keys())
yield [keys, this.get(keys)];
}
[Symbol.iterator]() {
return this.entries();
}
};
export {
DeepMap
};