import { equals, omit } from 'ramda'; import type { BaseProp, Node } from './models'; interface UpdateNodeFromTreeProps { callback: (tree: Node) => Partial>; targetNode: Node; tree: Node; } export const updateNodeFromTree = ({ tree, targetNode, callback }: UpdateNodeFromTreeProps): Node => { if (!tree.children) { return tree; } if ( equals(tree.data, targetNode.data) && equals(tree.children, targetNode.children) ) { return { ...tree, ...callback(tree) }; } return { ...tree, children: tree.children?.map((child) => updateNodeFromTree({ callback, targetNode, tree: child }) ) }; }; export const cleanUpTree = ( tree: Node ): Node => { if (!tree.children) { return tree; } return { ...omit(['isExpanded'], tree), children: tree.children?.map((child) => cleanUpTree(child)) }; };