import { createAtom, type IAtom } from "mobx" import { isModel } from "../model/utils" import { getOrCreate } from "../utils/mapUtils" import type { ParentPath } from "./path" /** * @internal */ export const objectParents = new WeakMap | undefined>() const objectParentsAtoms = new WeakMap() /** * @internal */ export function parentPathEquals( parentPath1: ParentPath | undefined, parentPath2: ParentPath | undefined ) { if (!(parentPath1 || parentPath2)) { return true } if (!(parentPath1 && parentPath2)) { return false } return parentPath1.parent === parentPath2.parent && parentPath1.path === parentPath2.path } function createParentPathAtom() { return createAtom("parentAtom") } /** * @internal */ export function reportParentPathObserved(node: object) { getOrCreate(objectParentsAtoms, node, createParentPathAtom).reportObserved() } /** * @internal */ export function reportParentPathChanged(node: object) { objectParentsAtoms.get(node)?.reportChanged() } /** * @internal */ export const dataObjectParent = new WeakMap() /** * @internal */ export function dataToModelNode(node: T): T { const modelNode = dataObjectParent.get(node) return (modelNode as T | undefined) ?? node } /** * @internal */ export function modelToDataNode(node: T): T { return isModel(node) ? node.$ : node }