buildTree = (input) => {
const makeDir = (parent) => ({
parent,
type: "dir",
totalSize: 0,
children: {}
});
const makeFile = (size) => ({ type: "file", size });
let root = makeDir(null);
let pwd = [];
const getPwd = () => {
let dir = root;
for (const seg of pwd) dir = dir.children[seg];
return dir;
};
const addChild = (name, entry) => {
let dir = getPwd();
dir.children[name] = entry;
if (entry.type === "file") {
while (dir) {
dir.totalSize += entry.size;
dir = dir.parent;
}
}
};
for (const { cmd, output } of input) {
if (cmd[0] === "cd") {
if (cmd[1] === "/") pwd = [];
else if (cmd[1] === "..") pwd.pop();
else pwd.push(cmd[1]);
} else if (cmd[0] === "ls") {
for (let [a, b] of output) {
if (a === "dir") addChild(b, makeDir(getPwd()));
else addChild(b, makeFile(+a));
}
}
}
return root;
}