UNPKG

@platform/state

Version:

A small, simple, strongly typed, [rx/observable] state-machine.

41 lines (40 loc) 1.33 kB
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)); }, }; }