@platform/state
Version:
A small, simple, strongly typed, [rx/observable] state-machine.
41 lines (40 loc) • 1.33 kB
JavaScript
import { toNodeId } from '../common';
import { TreeQuery } from '../TreeQuery';
export function create(tree) {
const get = (tree, parts) => {
if (parts.length === 0) {
return undefined;
}
const child = tree.children.find((child) => child.id === parts[0]);
if (child && parts.length > 1) {
return get(child, parts.slice(1));
}
return child && parts.length > 1
? get(child, parts.slice(1))
: child;
};
return {
from(child) {
const target = toNodeId(child);
if (target === tree.id) {
return tree.id;
}
const parts = [];
const match = tree.find((e) => e.id === target);
if (match) {
const query = TreeQuery.create({ root: tree.root });
query.walkUp(match.id, (e) => {
parts.unshift(e.id);
if (e.id === tree.id) {
e.stop();
}
});
}
return parts.join('/');
},
get(path) {
const parts = path.split('/').map((part) => part.trim());
return parts.length === 1 && parts[0] === tree.id ? tree : get(tree, parts.slice(1));
},
};
}