@1771technologies/lytenyte-pro
Version:
Blazingly fast headless React data grid with 100s of features.
65 lines (64 loc) • 2.57 kB
JavaScript
import { applyDeleteActionToTree } from "./apply-delete-action-to-tree.js";
import { applySetActionToTree } from "./apply-set-action-to-tree.js";
import { getParentNodeByPath } from "./get-parent-node-by-path.js";
export function makeAsyncTree() {
const tree = {
kind: "root",
byIndex: new Map(),
byPath: new Map(),
size: 0,
asOf: Date.now(),
rowIdToNode: new Map(),
before: [],
after: [],
};
const api = {
set: (p) => applySetActionToTree(p, tree),
delete: (p) => applyDeleteActionToTree(p, tree),
get: (p) => getParentNodeByPath(tree, p.path),
addBefore: (leafs) => {
for (const l of leafs) {
if (tree.before.find((x) => x.row.id === l.row.id)) {
console.error(`Attempting to add row with ${l.row.id} but it has already been added.`);
return;
}
if (tree.rowIdToNode.has(l.row.id)) {
console.error(`Attempt to add row with ${l.row.id} but this row already exists.`);
return;
}
tree.before.push(l);
tree.rowIdToNode.set(l.row.id, l);
}
},
addAfter: (leafs) => {
for (const l of leafs) {
if (tree.after.find((x) => x.row.id === l.row.id)) {
console.error(`Attempting to add row with ${l.row.id} but it has already been added.`);
return;
}
if (tree.rowIdToNode.has(l.row.id)) {
console.error(`Attempt to add row with ${l.row.id} but this row already exists.`);
return;
}
tree.after.push(l);
tree.rowIdToNode.set(l.row.id, l);
}
},
deleteBefore: (leafs) => {
const found = new Set(leafs.map((l) => tree.before.find((x) => x.row.id === l)).filter((x) => !!x));
tree.before = tree.before.filter((x) => !found.has(x));
found.forEach((x) => {
tree.rowIdToNode.delete(x.row.id);
});
},
deleteAfter: (leafs) => {
const found = new Set(leafs.map((l) => tree.after.find((x) => x.row.id === l)).filter((x) => !!x));
tree.after = tree.after.filter((x) => !found.has(x));
found.forEach((x) => {
tree.rowIdToNode.delete(x.row.id);
});
},
};
Object.assign(tree, api);
return tree;
}