From 9c04e228976345f4f494a4f4f3af02bcd7375edb Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Thu, 22 May 2025 13:49:16 +0200 Subject: [PATCH] Use module-level cache Signed-off-by: Mark Tolmacs --- packages/element/src/utils.ts | 98 +++++++++++++++++------------------ 1 file changed, 48 insertions(+), 50 deletions(-) diff --git a/packages/element/src/utils.ts b/packages/element/src/utils.ts index 08caf82e2..12789f0e3 100644 --- a/packages/element/src/utils.ts +++ b/packages/element/src/utils.ts @@ -27,67 +27,65 @@ import type { type ElementShape = [LineSegment[], Curve[]]; -class ElementShapeCache { - private static cache = new WeakMap< - ExcalidrawElement, - { version: ExcalidrawElement["version"]; shapes: Map } - >(); +const ElementShapesCache = new WeakMap< + ExcalidrawElement, + { version: ExcalidrawElement["version"]; shapes: Map } +>(); - public static get = ( - element: T, - offset: number, - ): ElementShape | undefined => { - const record = ElementShapeCache.cache.get(element); +const getElementShapesCacheEntry = ( + element: T, + offset: number, +): ElementShape | undefined => { + const record = ElementShapesCache.get(element); - if (!record) { - return undefined; - } + if (!record) { + return undefined; + } - const { version, shapes } = record; + const { version, shapes } = record; - if (version !== element.version) { - ElementShapeCache.cache.delete(element); - return undefined; - } + if (version !== element.version) { + ElementShapesCache.delete(element); + return undefined; + } - return shapes.get(offset); - }; + return shapes.get(offset); +}; - public static set = ( - element: T, - shape: ElementShape, - offset: number, - ) => { - const record = ElementShapeCache.cache.get(element); +const setElementShapesCacheEntry = ( + element: T, + shape: ElementShape, + offset: number, +) => { + const record = ElementShapesCache.get(element); - if (!record) { - ElementShapeCache.cache.set(element, { - version: element.version, - shapes: new Map([[offset, shape]]), - }); + if (!record) { + ElementShapesCache.set(element, { + version: element.version, + shapes: new Map([[offset, shape]]), + }); - return; - } + return; + } - const { version, shapes } = record; + const { version, shapes } = record; - if (version !== element.version) { - ElementShapeCache.cache.set(element, { - version: element.version, - shapes: new Map([[offset, shape]]), - }); + if (version !== element.version) { + ElementShapesCache.set(element, { + version: element.version, + shapes: new Map([[offset, shape]]), + }); - return; - } + return; + } - shapes.set(offset, shape); - }; -} + shapes.set(offset, shape); +}; export function deconstructLinearOrFreeDrawElement( element: ExcalidrawLinearElement | ExcalidrawFreeDrawElement, ): [LineSegment[], Curve[]] { - const cachedShape = ElementShapeCache.get(element, 0); + const cachedShape = getElementShapesCacheEntry(element, 0); if (cachedShape) { return cachedShape; @@ -158,7 +156,7 @@ export function deconstructLinearOrFreeDrawElement( } const shape = [lines, curves] as ElementShape; - ElementShapeCache.set(element, shape, 0); + setElementShapesCacheEntry(element, shape, 0); return shape; } @@ -175,7 +173,7 @@ export function deconstructRectanguloidElement( element: ExcalidrawRectanguloidElement, offset: number = 0, ): [LineSegment[], Curve[]] { - const cachedShape = ElementShapeCache.get(element, offset); + const cachedShape = getElementShapesCacheEntry(element, offset); if (cachedShape) { return cachedShape; @@ -298,7 +296,7 @@ export function deconstructRectanguloidElement( ]; const shape = [sides, corners.flat()] as ElementShape; - ElementShapeCache.set(element, shape, offset); + setElementShapesCacheEntry(element, shape, offset); return shape; } @@ -315,7 +313,7 @@ export function deconstructDiamondElement( element: ExcalidrawDiamondElement, offset: number = 0, ): [LineSegment[], Curve[]] { - const cachedShape = ElementShapeCache.get(element, offset); + const cachedShape = getElementShapesCacheEntry(element, offset); if (cachedShape) { return cachedShape; @@ -424,7 +422,7 @@ export function deconstructDiamondElement( const shape = [sides, corners.flat()] as ElementShape; - ElementShapeCache.set(element, shape, offset); + setElementShapesCacheEntry(element, shape, offset); return shape; }