export const getNode = (id: string) => <T>(tree: Tree<T>): TreeNode<T> | undefined => tree[id];
export const setNode = <T>(node: TreeNode<T>) => (tree: Tree<T>): Tree<T> => {
- console.log(node);
- const [newTree] = [tree]
- .map(tree => getNode(node.id)(tree) === node
+ return pipe(
+ (tree: Tree<T>) => getNode(node.id)(tree) === node
? tree
- : { ...tree, [node.id]: node })
- .map(addChild(node.parent, node.id));
- return newTree;
+ : { ...tree, [node.id]: node },
+ addChild(node.parent, node.id)
+ )(tree);
};
export const getNodeValue = (id: string) => <T>(tree: Tree<T>) => {
const node = getNode(id)(tree);
const children = node ? node.children :
id === TREE_ROOT_ID
- ? getRootNodeChildren(tree)
+ ? getRootNodeChildrenIds(tree)
: [];
return children
export const activateNode = (id: string) => <T>(tree: Tree<T>) =>
mapTree(node => node.id === id ? { ...node, active: true } : { ...node, active: false })(tree);
+export const deactivateNode = <T>(tree: Tree<T>) =>
+ mapTree(node => node.active ? { ...node, active: false } : node)(tree);
export const expandNode = (...ids: string[]) => <T>(tree: Tree<T>) =>
mapTree(node => ids.some(id => id === node.id) ? { ...node, expanded: true } : node)(tree);
};
-export const initTreeNode = <T>(data: Pick<TreeNode<T>, 'id' | 'value'>): TreeNode<T> => ({
+export const selectNode = (id: string) => <T>(tree: Tree<T>) => {
+ const node = getNode(id)(tree);
+ return node && node.selected
+ ? tree
+ : toggleNodeSelection(id)(tree);
+};
+
+export const selectNodes = (id: string | string[]) => <T>(tree: Tree<T>) => {
+ const ids = typeof id === 'string' ? [id] : id;
+ return ids.reduce((tree, id) => selectNode(id)(tree), tree);
+};
+export const deselectNode = (id: string) => <T>(tree: Tree<T>) => {
+ const node = getNode(id)(tree);
+ return node && node.selected
+ ? toggleNodeSelection(id)(tree)
+ : tree;
+};
+
+export const deselectNodes = (id: string | string[]) => <T>(tree: Tree<T>) => {
+ const ids = typeof id === 'string' ? [id] : id;
+ return ids.reduce((tree, id) => deselectNode(id)(tree), tree);
+};
+
+export const initTreeNode = <T>(data: Pick<TreeNode<T>, 'id' | 'value'> & { parent?: string }): TreeNode<T> => ({
children: [],
active: false,
selected: false,
const mapNodeValue = <T, R>(mapFn: (value: T) => R) => (node: TreeNode<T>): TreeNode<R> =>
({ ...node, value: mapFn(node.value) });
-const getRootNodeChildren = <T>(tree: Tree<T>) =>
+const getRootNodeChildrenIds = <T>(tree: Tree<T>) =>
Object
.keys(tree)
.filter(id => getNode(id)(tree)!.parent === TREE_ROOT_ID);
+
const addChild = (parentId: string, childId: string) => <T>(tree: Tree<T>): Tree<T> => {
const node = getNode(parentId)(tree);
if (node) {